如何使用Flask-Restless启用CORS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Flask-Restless启用CORS相关的知识,希望对你有一定的参考价值。
我有一个使用Flask-Restless创建的postgres数据库的API,并使用Apache提供服务。
在我收到多个似乎与OPTIONS请求密切相关的“CORS Error Access-Control-Allow-Origin”标头时,API会一直运行,直到我尝试使用基于javascript的前端来访问API。
我尝试了以下修复程序
[1.在阿帕奇的可用角色] [1]
<VirtualHost *:80>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
ServerName localhost
WSGIScriptAlias / /home/drmclean/bboxx/git/Smart-Solar-Server/SmartSolarServer.wsgi
WSGIScriptReloading On
<Directory /home/drmclean/bboxx/git/Smart-Solar-Server/>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Require all granted
Order allow,deny
Allow from all
</Directory>
Alias /docs /home/drmclean/bboxx/git/Smart-Solar-Server/swagger
<Directory /home/drmclean/bboxx/git/Smart-Solar-Server/swagger/>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type, Authorization"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Require all granted
Header set Access-Control-Allow-Origin "*"
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
<IfModule mod_rewrite.c>
RewriteEngine on
# Pass Authorization headers to an environment variable
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
2.Enable CORS using the flask-cors extension
app = Flask(__name__, static_folder= paths.base_path+'/swagger/')
cors = CORS(app)
3.使用烧瓶 - 不安全使用CORS
def allow_control_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Credentials'] = 'true'
return response
bp = manager.create_api(REDACTED)
bp.after_request(allow_control_headers)
毋庸置疑,到目前为止还没有任何工作。
- 不删除CORS警告。
- 似乎删除了某些端点但不是其他端点的CORS错误,将其更改为cors = CORS(app,response = r“/ v1 / *”)带回了最初删除的CORS错误。
- 抛出语法错误为“bp没有属性after_request”,尽管我直接从文档中复制了语法。 (here)
谁能解释一下,
- 为什么上述修复程序没有删除CORS问题。
- 如何解决我的问题并有效地启用Cross-Origin-Resource-SHaring?
答案
选项3最接近,但您引用的文档仅适用于特定版本的Flask Restless,而不是最新版本。我建议将Flask's after_this_request processor与Flask Restless的预处理器结合使用
def allow_control_headers(**kw):
@after_this_request
def add_headers(response):
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Credentials'] = 'true'
return response
bp = manager.create_api({
...
'preprocessors: {'GET_SINGLE': [allow_control_headers]}
...
})
以上是关于如何使用Flask-Restless启用CORS的主要内容,如果未能解决你的问题,请参考以下文章