在 Django 中,身份验证的工作方式如下:
- 有一个 SessionMiddleware 和 AuthenticationMiddleware。在调用任何视图之前调用这两个类的 process_request()。
- SessionMiddleware 在较低级别使用 cookie。它会检查名为
sessionid 的 cookie,并尝试将此 cookie 与用户相关联。
- AuthenticationMiddleware 检查此 cookie 是否与用户关联,然后将
request.user 设置为相应的用户。如果 cookie sessionid 未找到或无法与任何用户关联,则将 request.user 设置为 AnonymousUser() 的实例。
- 由于 Http 是无状态协议,django 使用这两个中间件并使用较低级别的 cookie 为特定用户维护会话。
进入代码,以便requests 可以与 django 一起使用。
您必须首先调用您验证并登录用户的视图。此视图的响应将在 cookie 中包含 sessionid。
您应该使用此 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")
提出请求:
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)
请注意,我们使用 cookies 关键字参数传递 cookie
print response_two.status_code
200 #output
print response_two.content
'Authenticated user' #output
所以,我们的request.user.is_authenticated() 工作正常。
response_three = requests.get('http://127.0.0.1:8000/hogwarts/getAllTracks/')
请注意,我们不会在此处传递 cookie。
print response_three.content
'Non Authenticated user' #output