如果使用请求模块将 post 数据发送到 django 视图,我如何提供 csrf 保护

how can I provide csrf protection in case of using requests module to post data to a django view

我有一个模型如下:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = FileUploads
        fields = ['uploads']

和这样的视图:

@csrf_exempt
def upper(request):
    form = UserProfileForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        form.save()
        return HttpResponse(status=200)
    return HttpResponse(status = 403)

我有一个简单的脚本可以将 multipart/encoded 文件发送到视图:

import requests
f = open('C:\Users\myname\Desktop\image.jpg', 'rb')
urls='http://localhost:8000/upper'
r=requests.post(urls, files= {'uploads':f})
print(r.status_code)

我的问题是:只要我在接收视图上方有 csrrf_exempt 装饰器,一切正常,这对测试环境来说很好。但是,如果我想要适当的 csrf 保护怎么办?考虑到我正在使用请求模块,我该如何提供 csrf 令牌?

您需要传递一个 cookie 和一个具有相同值的 header:

import requests
f = open('C:\Users\myname\Desktop\image.jpg', 'rb')
urls='http://localhost:8000/upper'
cookies = {'csrftoken': 'token'}
headers = {'X-CSRF-TOKEN': 'token'}
r=requests.post(urls, files={'uploads':f}, cookies=cookies, headers=headers)
print(r.status_code)

token的值无所谓,可以取任意字面值,只要相同即可。