Django拒绝来自Python请求的请求
我有一个Django视图,当用户执行某项任务时,外部Python微服务检索并发送一些数据到Django视图,该视图应该在模板上显示给用户。为了发送我使用Python请求的数据,问题是Django拒绝Json响应有两个原因:1)没有设置CSRF令牌2)视图是Django拒绝来自Python请求的请求,python,django,python-requests,Python,Django,Python Requests,我有一个Django视图,当用户执行某项任务时,外部Python微服务检索并发送一些数据到Django视图,该视图应该在模板上显示给用户。为了发送我使用Python请求的数据,问题是Django拒绝Json响应有两个原因:1)没有设置CSRF令牌2)视图是@login\u必需的 以下是我的看法: @login_required def myTestView(request): if request.method == 'POST': received_json_
@login\u必需的
以下是我的看法:
@login_required
def myTestView(request):
if request.method == 'POST':
received_json_data=json.loads(request.body)
print(received_json_data)
print('received.')
以下是我发送回复的方式:
import requests
req = requests.post('http://127.0.0.1:8000/myTestView/', json={"test": "json-test"})
print('SENT')
对于实际代码,我从Django那里得到了以下错误:
Forbidden (CSRF cookie not set.): /myTestView/
[2019-12-24 15:36:08,574] log: WARNING - Forbidden (CSRF cookie not set.): /myTestView/
我知道我可以使用
@csrf\u export
,但由于我发送的数据是个人数据,我希望它尽可能安全,因此我需要找到一种发送csrf令牌的方法。我需要做的第二件事是如何使用请求“登录”?我喜欢这个问题,因此我将尝试详细描述整个过程
导入json
从django.contrib.auth导入身份验证,登录
从django.contrib.auth.decorators导入所需的登录名
从django.http导入HttpResponse,HttpResponseForbidden
从django.middleware.csrf导入get_令牌
@需要登录
def myTestView(请求):
如果request.method==“POST”:
data=request.POST.get('data')
打印(json.loads(数据))
打印('已收到')
response=HttpResponse(获取令牌(请求))
返回响应
def登录_视图(请求):
如果request.method==“POST”:
username=request.POST['username']
password=request.POST['password']
用户=验证(请求,用户名=用户名,密码=密码)
如果用户不是无:
登录(请求、用户)
返回HttpResponse('authenticated')
其他:
返回HttpResponseForbidden('错误的用户名或密码')
response=HttpResponse(获取令牌(请求))
返回响应
导入json
导入请求
会话=请求。会话()
token=session.get('http://127.0.0.1:8000/login/')
会议.员额:http://127.0.0.1:8000/login/',
资料={
“用户名”:“,
“密码”:“,
“csrfmiddlewaretoken”:令牌})
token=session.get('http://127.0.0.1:8000/myTestView/')
data=json.dumps({'test':'value'})
会议.员额:http://127.0.0.1:8000/myTestView/',
资料={
“csrfmiddlewaretoken”:令牌,
“数据”:数据})
介意为视图添加url.py吗
我检查了这个代码,它工作得很好。如果有人有改进的想法,我很乐意更新。这就是原因。您需要使用python请求会话。这是否回答了您的问题?嘿谢谢你的回答!我现在正在测试。我想了解一件事:那么您添加的登录视图将只用于验证来自我提到的外部脚本的请求?我这样问是因为为了在网站上处理身份验证,我使用的是Django Allauth提供的一个完全不同的视图另一件事,在“session.post”之后,你用/view/?表示什么视图?好的,我想我已经掌握了窍门!我可以让用户登录,但我仍然得到“CSRF令牌丢失或不正确”!我更正了答案,view/被myTestView/替换为mistake登录视图如何。我添加它是因为您没有提供实际验证用户的方式。我认为你可以用Django Allauth auth view做同样的把戏。