Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django拒绝来自Python请求的请求_Python_Django_Python Requests - Fatal编程技术网

Django拒绝来自Python请求的请求

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_

我有一个Django视图,当用户执行某项任务时,外部Python微服务检索并发送一些数据到Django视图,该视图应该在模板上显示给用户。为了发送我使用Python请求的数据,问题是Django拒绝Json响应有两个原因:1)没有设置CSRF令牌2)视图是
@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令牌的方法。我需要做的第二件事是如何使用请求“登录”?

我喜欢这个问题,因此我将尝试详细描述整个过程

  • 服务器端
  • 第一步是获取csrf_令牌,您将在进一步的post请求中使用该令牌

    之后,您必须对会话进行身份验证

    所以,让我们编写一个视图,为获取csrf_令牌的get和验证会话的post提供服务。对于受保护的视图也有相同的想法

    经过身份验证后,可以访问受保护的视图

    导入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(获取令牌(请求))
    返回响应
    
  • 客户端
  • requests.post不适合此任务,因为它无法跟踪(或者很难跟踪)请求cookie和标头

    但您可以使用requests.session()实现此目的

    Django无法在json中处理csrf_令牌,这就是为什么必须在请求数据中传递json

    导入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做同样的把戏。