使用请求python库连接Django应用程序失败的身份验证

han*_*gui 3 python authentication django python-requests

也许这里有一个愚蠢的问题:Requests(一个python HTTP lib)是否支持Django 1.4?

我使用请求按照下面的官方快速入门:

requests.get('http://127.0.0.1:8000/getAllTracks', auth=('myUser', 'myPass'))
Run Code Online (Sandbox Code Playgroud)

但我从来没有得到正确的身份验证.(当然我一次又一次地检查了网址,用户名,密码.)

上面的URL" http://127.0.0.1:8000/getAllTracks "匹配Django项目的url.py的url模式,而url模式的回调是Django应用程序的" getAllTracks "视图.

如果我注释掉' getAllTracks '视图的身份验证代码,那么上面的代码工作正常,但如果我为视图添加了这些身份验证代码,那么上面的代码永远不会得到正确的身份验证.

视图的验证代码实际上非常简单,完全如下(第二行):

def getAllTracks(request):
    if request.user.is_authenticated():
        tracks = Tracks.objects.all()
        if tracks:
            # Do sth. here
Run Code Online (Sandbox Code Playgroud)

这意味着如果我删除上面的第二行(当然有一些缩进调整),那么requests.get()操作对我做了正确的事情,但如果没有(保留第二行),那么它永远不会正确.

任何帮助,将不胜感激.

Aks*_*aaj 11

在Django中,身份验证的工作方式如下:

  • 有一个SessionMiddleware和AuthenticationMiddleware.在调用任何视图之前调用这两个类的process_request().
  • SessionMiddleware使用较低级别的cookie.它会检查名为的cookie sessionid并尝试将此cookie与用户关联.
  • AuthenticationMiddleware检查此cookie是否与用户关联,然后设置request.user为相应的用户.如果sessionid未找到cookie 或无法与任何用户关联,则将request.user其设置为实例AnonymousUser().
  • 由于Http是无状态协议,因此django使用这两个中间件并使用较低级别的cookie来维护特定用户的会话.

来到代码,这样就requests可以使用django了.

您必须首先调用您进行身份验证的视图并登录该用户.此视图的响应将包含sessionid在Cookie中.

您应该使用此cookie并在下一个请求中发送它,以便django可以验证此特定用户以及您的request.user.is_authenticated()通行证.

from django.contrib.auth import authenticate, login

def login_user(request):
    user = authenticate(username=request.POST.get('username'),  password=request.POST.get('password'))
    if user:
       login(request, user)
       return HttpResponse("Logged In")
    return HttpResponse("Not Logged In")

def getAllTracks(request):
    if request.user.is_authenticated():
        return HttpResponse("Authenticated user")
    return HttpResponse("Non Authenticated user")
Run Code Online (Sandbox Code Playgroud)

提出要求:

import requests

resp = requests.post('http://127.0.0.1:8000/login/', {'username': 'akshar', 'password': 'abc'})

print resp.status_code
200 #output

print resp.content
'Logged In' #output

cookies = dict(sessionid=resp.cookies.get('sessionid'))

print cookies
{'sessionid': '1fe38ea7b22b4d4f8d1b391e1ea816c0'}  #output

response_two = requests.get('http://127.0.0.1:8000/getAllTracks/', cookies=cookies)
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用cookies关键字参数传递cookie

print response_two.status_code
200  #output 

print response_two.content
'Authenticated user'  #output
Run Code Online (Sandbox Code Playgroud)

所以,我们的request.user.is_authenticated()工作正常.

response_three = requests.get('http://127.0.0.1:8000/hogwarts/getAllTracks/')
Run Code Online (Sandbox Code Playgroud)

请注意,我们不会在此处传递cookie.

print response_three.content
'Non Authenticated user' #output
Run Code Online (Sandbox Code Playgroud)

  • 你不会得到一个csrftoken错误,当我尝试以你建议的方式登录时我会得到它. (3认同)