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中,身份验证的工作方式如下:
sessionid并尝试将此cookie与用户关联.request.user为相应的用户.如果sessionid未找到cookie 或无法与任何用户关联,则将request.user其设置为实例AnonymousUser().来到代码,这样就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)
| 归档时间: |
|
| 查看次数: |
9829 次 |
| 最近记录: |