2

我正在寻找类似 Django 的csrf_ignore装饰器的东西。

我已经通过订阅者以通常的方式定义了我的 csrf 验证:

@subscriber(NewRequest)
def csrf_validation(event):
    ...

然后我有另一个视图,它接受上传的 POST 图像:

@view_config(route_name="upload_images", request_method="POST", renderer="json")
def upload_images(request):
    ...

但是如何忽略upload_images视图的 csrf 验证?如果有帮助,我正在使用 Pyramid 1.3。

4

1 回答 1

3

Pyramid 1.4 自带对自身check_csrf谓词的支持。view_config在此之前,您必须实现自己的自定义谓词来进行检查并将其应用于您的视图。

订阅者在请求管道的NewRequest早期发生,此时您无法使用许多属性。例如,它还没有计算出哪个路由匹配。因此你只能真正做到if not request.path_info.startswith('/upload_image_path'):

您可以将检查推迟到ContextFound订阅者,在这种情况下您可以检查if request.matched_route.name ~= 'upload_images'.

但是,您最好的选择是将 csrf 检查显式应用于各个视图,这可以使用自定义谓词来完成。

def csrf_check(context, request):
    # do check, return True if passes, or raise some exception if fails

@view_config(..., custom_predicates=[csrf_check])
def not_upload_images(request):
    # ....
于 2012-11-09T15:13:49.857 回答