Python身份验证cookie和django会话

时间:2012-03-27 09:20:41

标签: python django session cookies

我正在尝试创建一个外部python客户端来访问django应用程序。客户端应该对用户进行身份验证,生成cookie并能够像任何浏览器一样访问页面。

login_data_encoded = urllib.urlencode({'user':'sample', 'pass':'secret'})
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
opener.open('http://localhost:8000/login', login_data_encoded)  #problem here
response = opener.open('http://localhost:8000/secret_page')
secret_page = response.read()

在python解释器中:

import client

client.secret_page
--> []

但页面是空的。我可以在浏览器中查看该页面(以示例用户身份登录后,登录工作)。 Django将我识别为匿名用户(因为权限,它不允许我查看示例用户的数据)可能是因为我还没有为用户启动django会话。如何通过客户端启动django会话? (不是浏览器)

我希望我已经说清楚了。

编辑1:

它以匿名用户身份登录,无斜线或无斜线。代码或模板中没有csrf。 Django的日志显示200响应,并且获取secret_page也显示200。 cj包含cookie信息:

<cookielib.CookieJar[Cookie(version=0, name='app_r12', value='dd070f7acfe37c0474c223287c5adcbe', port=None, port_specified=False, domain='localhost.local', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)]>

opener.open(POST一个)的响应再次为200,url是相同的。

3 个答案:

答案 0 :(得分:1)

您需要发布到登录页面,保存cookie,然后发送cookie以及其他后续请求。像这样:

import requests

credentials = {'login': 'foo', 'password': 'secret'}
web = requests.post('http://localhost:8000/login',data=credentials)
secure_cookie = web.cookies
web = requests.get('http://localhost:8000/secret_page',cookies=secure_cookie)
the_page = web.text

答案 1 :(得分:1)

代码中的一些可能问题

  • 没有结束斜杠&#34; http:// localhost:8000 / login&#34;对于在启用APPEND_SLASH时无法重定向的POST。
  • login_data_encoded中没有csrf_token信息。登录视图是否装饰了csrf_exempt?
  • 是否需要传递任何字段?

您也可以

  • 检查Django的日志
  • 检查cj的内容
  • 检查opener.open(&#39; http:// localhost:8000 / login&#39;,login_data_encoded)的响应,包含代码和当前网址

答案 2 :(得分:0)

我正在将POST请求发送到错误的网址。它本来是要发送到:

opener.open('http://localhost:8000/auth', login_data_encoded)

抱歉我的错误。我想如果我将请求发送到登录页面它会工作,但登录页面没有进入正确的视图。将其更改为具有正确视图的URL后,其工作原理。

感谢您的回答,他们真的很有帮助。