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

最佳答案

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

view_config订户在请求管道中很早就发生了,此时您无法使用许多属性。例如,它尚未计算出匹配的路线。因此,您只能真正执行NewRequest

您可以将支票推迟到if not request.path_info.startswith('/upload_image_path'):个订户,在这种情况下,您可以检查ContextFound

但是,最好的选择是将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):
    # ....

关于python - Pyramid 忽略某些 View 的csrf验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13309471/

10-10 01:10