编辑:进一步阅读两种解决方案。
我已将Flask应用程序部署到 AWS ElasticBeanstalk。该应用程序无法读取请求中的“授权”标头。
错误日志报告:
KeyError: 'HTTP_AUTHORIZATION'
错误追溯到:
@application.before_request
def before_request():
try:
token = request.headers['Authorization'].split(' ')[-1]
user = User.get(token=token)
g.user = user
except ValueError as e:
abort(401)
申请目录:
app/
.elasticbeanstalk
application.py
virt
.ebignore
requirements.txt
环境配置将WSGIPath设置为application.py:
aws:elasticbeanstalk:container:python:
NumProcesses: '1'
NumThreads: '15'
StaticFiles: /static/=static/
WSGIPath: application.py
环境运行 Python 3.6 和以下组件:
Click==7.0
Flask==1.0.2
Flask-RESTful==0.3.7
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.1
peewee==3.9.2
psycopg2==2.7.7
python-dotenv==0.10.1
pytz==2018.9
six==1.12.0
Werkzeug==0.14.1
还需要什么吗?
尝试(不成功)的解决方案:
我为此花费了很多时间,并尝试配置WSGIPassAuthorization,(根据此处和其他地方的建议)但是,我没有成功。
包含解决方法的应用程序目录:
app/
.elasticbeanstalk
.ebextensions/
wsgi_custom.config
application.py
virt
.ebignore
requirements.txt
当我尝试创建包含.ebextensions/wsgi_custom.config的 eb 环境时,EB CLI 报告错误,指出 YAML 无效:
ERROR: InvalidParameterValueError - The configuration file .ebextensions/wsgi_custom.config in application version app-190310_100513 contains invalid YAML or JSON. YAML exception: Invalid Yaml: while scanning a simple key
in "<reader>", line 7, column 5:
WSGIPassAuthorization On
^
could not found expected ':'
in "<reader>", line 7, column 29:
On
^
, JSON exception: Invalid JSON: Unexpected character (f) at position 0.. Update the configuration file.
.ebextensions/wsgi_custom.config的内容:
files:
"/etc/httpd/conf.d/wsgi_custom.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIPassAuthorization On
我的 YAML 验证工具报告有效的 YAML。
注意:根据AWS YAML建议,编辑器设置为使用空格。
编辑:解决方案 1
解决了上述示例中的 YAML 验证错误。我相信验证错误是一个红鲱鱼。脚本中提到的 .conf 文件现在具有有效名称。
.ebextensions/wsgi_custom.config 的内容:
files:
"/etc/httpd/conf.d/wsgihacks.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIPassAuthorization On
编辑:使用container_commands 的解决方案 2
使用container_commands在 ElasticBeanstalk 上设置WSGIPassAuthorization。
步骤 1. 创建.ebextensions/wsgi_custom.config:
app/
.elasticbeanstalk
.ebextensions/
wsgi_custom.config
application.py
virt
.ebignore
requirements.txt
wsgi_custom.config:
container_commands:
01wsgipass:
command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
步骤 2.重启EB 环境。
Flask 应用程序现在可以读取请求中的“授权”标头。
万岁:)
如果有人能指出我关于WSGI的清晰讨论,我将不胜感激。