Python 如何在Django中验证POST请求?

Python 如何在Django中验证POST请求?,python,django,django-views,python-requests,Python,Django,Django Views,Python Requests,我构建了一个自定义视图,当页面加载时,视图会向外部Python脚本发送一个请求。此脚本应检索发送请求的用户的一些数据,并将其作为响应发送回Django视图,该视图将向用户显示该数据 我的实际代码的问题是,我不知道如何验证从外部脚本发送到Django的请求。为了让Django接受请求并向用户显示其数据,需要使用用户的身份验证。问题是外部Python脚本没有这些凭据,除非Django视图先发送它 因此,X用户正在使用视图,视图向外部脚本发送请求,外部脚本应发送一个带有用户数据和用户X凭据的响应。如果

我构建了一个自定义视图,当页面加载时,视图会向外部Python脚本发送一个请求。此脚本应检索发送请求的用户的一些数据,并将其作为响应发送回Django视图,该视图将向用户显示该数据

我的实际代码的问题是,我不知道如何验证从外部脚本发送到Django的请求。为了让Django接受请求并向用户显示其数据,需要使用用户的身份验证。问题是外部Python脚本没有这些凭据,除非Django视图先发送它

因此,X用户正在使用视图,视图向外部脚本发送请求,外部脚本应发送一个带有用户数据和用户X凭据的响应。如果用户Y正在使用视图,则情况也是如此,以此类推

由于这项服务是处理个人数据,我希望它尽可能安全

以下是我所拥有的: 这就是请求从外部脚本发送到Django视图的方式

import json

import requests

session = requests.session()
token = session.get('http://127.0.0.1:8000/loginview/')

session.post('http://127.0.0.1:8000/loginview/',
             data={
                 'username': '**'USER**',
                 'password': '**PASSWORD**',
                 'csrfmiddlewaretoken': token})

token = session.get('http://127.0.0.1:8000/myTestView/')
data = json.dumps({'test': 'value'})
session.post('http://127.0.0.1:8000/myTestView/',
             data={
                 'csrfmiddlewaretoken': token,
                 'data': data})
整个问题都在用户名和密码字段上。此外部脚本无法获取动态发送请求的用户的凭据,除非我首先使用第一个Django请求发送这些凭据

以下是接受请求的方式:

@login_required
def myTestView(request):
    if request.method == 'POST':
        data = request.POST.get('data')
        print(json.loads(data))
        print('received.')

    response = HttpResponse(get_token(request))
    return response    

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return HttpResponse('authenticated')
        else:
            return HttpResponseForbidden('wrong username or password')

    response = HttpResponse(get_token(request))
    return response
因此,这里的
login\u视图
接受请求,另一个视图执行我需要的任何操作


Tl;drmydjango服务应该向外部脚本发送一个请求,外部脚本作为响应向Django发送一些内容。Django需要以某种方式验证该请求;由于外部脚本与Django是分离的,因此它无法检索凭据,除非我先发送它们。

如果您不想添加不同的身份验证机制(例如,这更适合于API),则执行此操作的步骤是复制浏览器的功能

(提示:在正常登录顺序期间,查看浏览器调试工具中的请求和响应标题)

  • 获取登录视图以接收CSRF cookie和CSRF令牌
  • 将POST请求发送到登录视图,包括CSRF cookie。响应将包含会话cookie,您应将其用于每个后续请求
  • 现在,您可以通过包含会话cookie发布到任何其他视图

  • 恐怕我真的不明白“外部脚本”的意思。@Brunodesshuilliers请阅读问题。我说过,外部脚本应该检索一些数据并执行一些操作,然后将其作为响应发送回Django。我会从Django开始做任何事情,但我不能,这就是我为什么要这么做的原因。我也不认为这个问题的核心是外部脚本的重点,我确实读过这个问题,否则我就不会发表这个评论了。“我可以从Django做任何事情,但我不能”=>为什么???浏览器中的身份验证工作方式是在每个请求中发送会话cookie。Django然后检查会话是否属于经过身份验证的用户。因此,您需要在对登录的响应中捕获cookie,并在随后的每个请求中发送它。或者,对于脚本访问的API来说,使用某种形式的令牌身份验证更为常见(django rest框架提供了这种身份验证)。您可能还是想使用DRF,因为您的视图是API视图。@Brunodesshuilliers好的,我从问题中了解到这不是很清楚,但请相信我,我需要这样做。这是一种微服务结构;外部脚本托管在另一台服务器上,必须执行我不能执行的任务,或者使用Django执行的任务太重。如果更容易执行,我可以使用不同的机制;但主要的一点是它需要安全。因此,用户必须只获取与他们相关的数据,而不是其他用户。例如,令牌身份验证对于API更为常见,您只需获取一次令牌,然后在每个后续请求的头中发送它。但这基本上与在会话中发送cookie头相同,所以这并不重要。您只需确保所有这些请求都是通过HTTPS进行的,因为令牌和会话id都是敏感的。因此,对于令牌,它的工作方式如下:Django在请求头中发送令牌>外部接收请求并将json数据与令牌一起发送回?否,通过令牌身份验证,您可以创建一个特殊的登录视图,该视图在登录视图的json响应中返回令牌。然后,脚本在每个后续请求的头中发送该令牌。令牌为每个用户存储在本地(这是移动应用程序如何实现的)。当令牌过期时,应用程序再次登录并收到一个新令牌。好的,但在这种情况下,我不明白这一点:外部如何获取令牌,以便对其进行身份验证?