My goal is I want to access claims from authorizer. I used serverless framework to work with lambda. In javascript I can easily get evt.requestContext.authorizer.claims like this.
module.exports = async (evt, ctx) => {
const authorizer = evt.requestContext.authorizer;
console.log(authorizer.claims)
}
With python handler using serverless-wsgi I don't know how to get event context in flask API. From document => https://www.npmjs.com/package/serverless-wsgi show me like this.
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def index():
print(request.environ['serverless.context'])
print(request.environ['serverless.event'])
But I got this error. How to fix it.
KeyError: 'serverless.event' // Werkzeug Debugger
Here is my serverless.yml
service: python-service
projectDir: ../
plugins:
- serverless-wsgi
- serverless-python-requirements
- serverless-plugin-resource-tagging
variablesResolutionMode: 20210326
useDotenv: true
provider:
apiGateway: ${file(../serverless.common.yml):apiGateway}
name: aws
runtime: python3.7
stage: ${opt:stage, 'dev'}
region: ap-southeast-1
versionFunctions: false
memorySize: 1024
timeout: 30
logRetentionInDays: 14
stackName: ${self:service}-${self:provider.stage}
deploymentBucket: ${file(../serverless.common.yml):deploymentBucket}
environment:
NODE_ENV: ${self:provider.stage}
vpc: ${file(../serverless.common.yml):vpc.${self:provider.stage}}
iamRoleStatements:
- ${file(../serverless.common.yml):iamGetSecretValue}
- ${file(../serverless.common.yml):iamInvokeFunction}
functions:
testDrive:
handler: wsgi_handler.handler
provisionedConcurrency: 1
fileSystemConfig:
arn: !GetAtt AccessPointResource.Arn
localMountPath: /mnt/efs
events:
- http:
path: testDrive/go
method: post
cors: ${file(../serverless.common.yml):cors.preflight.${self:provider.stage}}
authorizer: ${file(../serverless.common.yml):authorizer}
package:
exclude:
- node_modules/**
- .pytest_cache/**
- __pychache__/**
- lib/**
- venv/**
custom:
wsgi:
app: handler.app
packRequirements: false
pythonRequirements:
dockerizePip: 'non-linux'
If you try to run it correctly in both naive flask and serverless-wsgi,
you should use the dict.get(key, default_value) instead of dict[key].
In your case, just modified your code like this:
from flask import Flask, request
app = Flask(__name__)
@app.route("/")
def index():
print(request.environ.get('serverless.context'))
print(request.environ.get('serverless.event'))
return 'here is content of web page'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With