使用带有返回JsonResponse视图的django CSRF中间件

使用带有返回JsonResponse视图的django CSRF中间件,django,api,request,response,csrf,Django,Api,Request,Response,Csrf,我想在Django中使用带有API视图的CSRF中间件。这是我想使用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.o

我想在Django中使用带有API视图的CSRF中间件。这是我想使用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.middleware.csrf.get_token(请求)

然后在客户端发出的请求的标题中设置它


好的,那么这将完成您需要的操作

要在响应中设置cookie,请使用decorator:

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-ihttp://localhost:8000/api/v1/things
HTTP/1.1200ok
内容类型:application/json
变化:饼干
设置Cookie:csrftoken=nm4SdMB0pobkQ1ab7wZTFdwMlX8wr0vfT4iAg6Nqpcatl7ITRi9VOHrKf0Krbp2i;expires=周四,2020年3月5日15:25:53格林威治标准时间;最大年龄=31449600;路径=/;SameSite=Lax
{“事物”:[“foo”,“bar”]}

我知道如何将CSRF与表单集成,我正在尝试在此处添加带有简单JSON API的CSRF。添加@CSRF\u protect没有任何意义,只要您不禁用CSRF中间件,每个视图都会作为默认值受其保护。我这里的问题是,如何获取{csrf_token}}值以使用JsonResponse发送。@TheDeadMayan据我所知,唯一需要这样做的时间是在LoginView POST路由上。由于某些原因,这无法验证任何csrf令牌,因此我必须使用decorator强制执行它。但是,我必须创建一个定制的csrf中间件来发送令牌,因为我可以保护登录路由的唯一方法是将csrf设置为使用会话,然后在主页路由上使用
强制csrf\u cookie
,这样我就可以取回会话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"],
    })