2012-03-27 140 views
0

我想创建一个外部python客户端来访问一个Django应用程序。客户端应该对用户进行身份验证,生成cookie并能够像访问任何浏览器一样访问页面。Python身份验证Cookie和Django会话

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响应,并且200获得secret_page。 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 1)的响应是200和url是相同的。

回答

0

我正在发送POST请求到错误的URL。这意味着被发送到:

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

对不起我的错误。我想如果我发送请求到登录页面,它会工作,但登录页面不会正确的看法。将其更改为具有正确视图的网址后,其作品。

谢谢你的答案,他们真的很有帮助。

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 
+0

对不起web.text不起作用:'响应'对象没有属性'文本'。我如何查看页面? – Neeran 2012-03-27 11:44:55

+0

找出它的网页。内容,但它只是把我带到登录页面,而不是秘密页面 – Neeran 2012-03-27 12:01:21

+0

你确定你传递了正确的凭据吗? – 2012-03-27 12:20:35

1

在你的代码的一些可能出现的问题

  • 中没有结束斜线的“http://本地主机:8000 /登录”为启用APPEND_SLASH时不能重定向一个POST 。
  • login_data_encoded中没有csrf_token信息。登录视图是否有csrf_exempt装饰?
  • 有没有必要的字段可以通过?

您可能还

  • 的Django
  • 的检查日志
  • 检查CJ
  • 的内容
  • 检查opener.open的响应(的 'http://本地主机:8000 /登录',包括代码和当前的URL
+0

它以匿名用户身份登录,无或没有斜杠。代码或模板中没有csrf。 Django的日志显示200响应,并且200获得secret_page。 cj包含cookie信息。 opener.open的响应也是200,url是一样的。 – Neeran 2012-03-27 14:15:31

+0

@Jimmy是会话密钥app_r12吗?如果是的话,你可以检查它的值。 – okm 2012-03-28 01:05:43