在 Django 中,身份验证以下列方式工作:
- 有一个 SessionMiddleware 和 AuthenticationMiddleware。在调用任何视图之前调用这两个类的 process_request()。
- SessionMiddleware 在较低级别使用 cookie。它检查一个名为的 cookie
sessionid
并尝试将此 cookie 与用户相关联。
- AuthenticationMiddleware 检查此 cookie 是否与用户相关联,然后设置
request.user
为相应的用户。如果 cookiesessionid
未找到或无法与任何用户关联,则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")
提出请求:
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