我正在尝试创建一个外部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是相同的。
答案 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)
代码中的一些可能问题
您也可以
答案 2 :(得分:0)
我正在将POST请求发送到错误的网址。它本来是要发送到:
opener.open('http://localhost:8000/auth', login_data_encoded)
抱歉我的错误。我想如果我将请求发送到登录页面它会工作,但登录页面没有进入正确的视图。将其更改为具有正确视图的URL后,其工作原理。
感谢您的回答,他们真的很有帮助。