金字塔忽略某些视图的csrf验证

时间:2012-11-09 14:00:14

标签: python pylons pyramid

我正在寻找像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,如果有帮助的话。

1 个答案:

答案 0 :(得分: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):
    # ....