Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python身份验证cookies和django会话_Python_Django_Session_Cookies - Fatal编程技术网

Python身份验证cookies和django会话

Python身份验证cookies和django会话,python,django,session,cookies,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

我正在尝试创建一个外部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个响应,以及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-one)的响应也是200,url是相同的

您需要发布到登录页面,保存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

代码中可能存在的一些问题

  • 没有结尾的斜杠“http://localhost:8000/login“对于启用附加斜杠后无法重定向的帖子
  • 登录数据编码中没有csrf令牌信息。登录视图是否具有csrf_
  • 是否有需要通过的字段
你也可以

  • 检查Django的日志
  • 检查cj的内容
  • 检查开启器的响应。开启('http://localhost:8000/login,登录(数据编码),包括代码和当前URL

我将POST请求发送到错误的url。它的目的是发送给:

opener.open('http://localhost:8000/auth', login_data_encoded)
对不起,我弄错了。我想如果我将请求发送到登录页面,它会工作,但登录页面不会进入正确的视图。将其更改为具有正确视图的url后,其工作正常


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

很抱歉web.text不起作用:“Response”对象没有属性“text”。我怎么看这个页面?我知道它的web.content,但它只带我到登录页面,而不是秘密页面。是的,我已经检查了很多次,我想这与django会话有关。它以匿名用户而不是示例用户的身份登录。它以匿名用户的身份登录,没有斜杠和斜杠。代码或模板中没有csrf。Django的日志显示200个响应,以及200个关于获取机密页面的响应。cj包含cookie信息。opener.open的响应再次为200,url相同。@Jimmy app_r12是会话密钥吗?如果是这样的话,您可以在会话中签入它的值。