【问题标题】:How to unset csrf in modelviewset of django-rest-framework?如何在 django-rest-framework 的模型视图集中取消设置 csrf?
【发布时间】:2013-11-11 02:35:16
【问题描述】:

如何在 django-rest-framework 的 modelviewset 中取消设置 csrf?

我将使用 django-rest-framework 的 viewsets.ModelViewSet(http://django-rest-framework.org/api-guide/viewsets.html#modelviewset)。

我的应用是 api 服务器。所以我不需要使用csrf。

但我不知道如何取消设置 csrf。

请给我一个例子!

【问题讨论】:

    标签: python django django-rest-framework django-1.6


    【解决方案1】:

    只有在您使用 SessionAuthentication 时才会强制执行 CSRF。 如果您使用的是其他形式的身份验证之一(例如 TokenAuthentication),则不需要。

    【讨论】:

    • 我在我的视图集中使用它:'authentication_classes = (SessionAuthentication, TokenAuthentication)' 但是在使用 Token 标头时我仍然收到 csrf 错误
    【解决方案2】:

    你需要用csrf_exempt包裹ModelViewSet的dispatch方法:

    from django.utils.decorators import method_decorator
    from django.views.decorators.csrf import csrf_exempt
    
    class MyModelViewSet(viewsets.ModelViewSet):
        @method_decorator(csrf_exempt)
        def dispatch(self, *args, **kwargs):
            return super(MyModelViewSet, self).dispatch(*args, **kwargs)
    

    或者你可以通过将视图包裹在 urls.py 中来达到同样的效果:

    url(r'^snippets/$', csrf_exempt(snippet_list), name='snippet-list'),
    url(r'^snippets/(?P<pk>[0-9]+)/$', csrf_exempt(snippet_detail), name='snippet-detail'),
    

    【讨论】:

    • 您是否真的尝试过将其与 SessionAuthentication 结合使用?我有,而且我几乎可以肯定 DRF 身份验证中间件完全忽略了任何此类装饰器。
    • 所以无论如何要这样做?这个答案真的行不通。我有多个视图集需要受 csrf 保护,而只有一个不应受 csrf 保护。
    【解决方案3】:

    还要确保您的 urlpatterns 中不包含 api-auth。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-12
      • 2017-12-06
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多