【问题标题】:Using django CSRF middleware with views returning JsonResponse使用带有返回 JsonResponse 的视图的 django CSRF 中间件
【发布时间】:2018-07-27 06:17:30
【问题描述】:

我想在 Django 中使用 CSRF 中间件和 API 视图。这是我想使用 CSRF 的演示视图,我很困惑如何在这里集成 CSRF。

def login(request):
    try:
        if len(DemoTable.objects.filter(phone=int(request.POST['user'])).filter(password=sha1Engine(request.POST['password'])))==1:
            print(DemoTable.objects.filter(phone=int(request.POST['user'])).filter(password=sha1Engine(request.POST['password'])))
            return JsonResponse({'exit':'0','msg':'Success'})
        return JsonResponse({'exit':'2','msg':'User Invalid'})
    except Exception as e:
        return JsonResponse({'exit':'10','msg':'Unknown Error Occured'})

任何帮助或建议将不胜感激。谢谢。

【问题讨论】:

    标签: django api request response csrf


    【解决方案1】:

    您可以通过django.middleware.csrf.get_token(request)获取令牌

    然后在客户端发出的请求的头部设置https://docs.djangoproject.com/en/2.0/ref/csrf/#setting-the-token-on-the-ajax-request

    【讨论】:

      【解决方案2】:

      要在响应中设置 cookie,请使用 @ensure_csrf_cookie 装饰器:

      from django.views.decorators.csrf import ensure_csrf_cookie
      
      @require_http_methods(["GET"])
      @ensure_csrf_cookie
      def list_things(request):
          return JsonResponse({
              "things": ["foo", "bar"],
          })
      
      $ curl -i http://localhost:8000/api/v1/things
      HTTP/1.1 200 OK
      Content-Type: application/json
      Vary: Cookie
      Set-Cookie:  csrftoken=nm4SdMB0pobkQ1ab7wZTFdwMlX8wr0vfT4iAg6Nqpcatl7ITRi9VOHrKf0Krbp2i; expires=Thu, 05 Mar 2020 15:25:53 GMT; Max-Age=31449600; Path=/; SameSite=Lax
      
      {"things": ["foo", "bar"]}
      

      【讨论】:

        【解决方案3】:
        django.middleware.csrf.get_token(request)
        

        好的,那么这将满足您的需求

        【讨论】:

        • 我知道如何将 CSRF 与表单集成,我正在尝试在此处添加带有简单 JSON API 的 CSRF。
        • 添加@csrf_protect 是没有意义的,只要你不禁用CSRF 中间件,默认情况下每个视图都受到它的保护。我的问题是,如何获得 {{csrf_token}} 值以使用 JsonResponse 发送它。
        • @TheDeadMayan 据我所知,唯一需要这样做的是在 LoginView POST 路由上。出于某种原因,这不会验证任何 csrf 令牌,因此我不得不使用装饰器强制执行它。但是,我必须创建一个自定义 csrf 中间件来发送令牌,因为我可以保护登录路由的唯一方法是将 csrf 设置为使用会话,然后在主页路由上使用enforce_csrf_cookie,这样我就可以取回会话 cookie
        猜你喜欢
        • 2015-02-12
        • 1970-01-01
        • 2021-03-19
        • 2017-12-24
        • 2017-01-29
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多