我在app引擎上运行了烧瓶。我需要让用户上传一些文件。出于安全原因,我在整个应用程序上都有csrf = CsrfProtect(app)
,并使用flask_wtf中的@csrf.exempt
装饰器免除特定网址。 (最好隐式否认而不是隐含地允许。)
使用blobstore.create_upload_url
从blobstore获取上传网址可以正常工作,但上传本身会失败并显示400
; CSRF token missing or incorrect.
此问题出在开发服务器上。我没有在真实的服务器上测试它,因为它正在生产中。
如何免除/_ah/
路径以便上传工作?
答案 0 :(得分:1)
我倾向于使用http://flask-wtf.readthedocs.org/en/latest/csrf.html ...
中概述的方法默认情况下,您也可以在所有视图中禁用CSRF保护 将WTF_CSRF_CHECK_DEFAULT设置为False,并选择性地调用 csrf.protect()仅在您需要时使用。这也使您可以做一些事情 在检查CSRF令牌之前对请求进行预处理:
该页面的原始示例是:
@app.before_request
def check_csrf():
if not is_oauth(request):
csrf.protect()
但当然在您的情况下,您将其更改为:
@app.before_request
def check_csrf():
if not request.path.startswith('/_ah/):
csrf.protect()
请注意,仍然 default-deny - 每个请求都需要CSRF保护... 除了那些路径以/_ah/
开头的人,就像你一样需要。
答案 1 :(得分:0)
Okey,所以真正的问题是我给了blobstore.create_upload_url()
的successpath参数(即第一个)的绝对URL,导致请求通知成功导致加载根路径时出现csrf错误( /
)。我将其更改为相对于根的路径,现在只使用@csrf.exempt
正常工作。