GAE blobstore上载失败,缺少CSRF令牌

时间:2015-03-03 22:27:31

标签: python google-app-engine flask blobstore flask-wtforms

我在app引擎上运行了烧瓶。我需要让用户上传一些文件。出于安全原因,我在整个应用程序上都有csrf = CsrfProtect(app),并使用flask_wtf中的@csrf.exempt装饰器免除特定网址。 (最好隐式否认而不是隐含地允许。)

使用blobstore.create_upload_url从blobstore获取上传网址可以正常工作,但上传本身会失败并显示400; CSRF token missing or incorrect.

此问题出在开发服务器上。我没有在真实的服务器上测试它,因为它正在生产中。

如何免除/_ah/路径以便上传工作?

2 个答案:

答案 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正常工作。