【问题标题】:Python authentication cookies and django sessionsPython 身份验证 cookie 和 django 会话
【发布时间】:2012-03-28 16:54:04
【问题描述】:

我正在尝试创建一个外部 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 是相同的。

【问题讨论】:

    标签: python django session cookies


    【解决方案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
    

    【讨论】:

    • 抱歉 web.text 不起作用:“响应”对象没有属性“文本”。如何查看页面?
    • 弄清楚它的 web.content,但它只是将我带到登录页面,而不是秘密页面
    • 是的,我检查了很多次,我认为这与 django 会话有关。它以匿名用户而不是示例用户的身份登录。
    【解决方案2】:

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

    • “http://localhost:8000/login”中没有结束斜线用于启用 APPEND_SLASH 时无法重定向的 POST。
    • login_data_encoded 中没有 csrf_token 信息。登录视图是否装饰了 csrf_exempt?
    • 是否有必填字段?

    你也可以

    • 查看Django的日志
    • 检查cj的内容
    • 检查 opener.open('http://localhost:8000/login', login_data_encoded) 的响应,包括代码和当前 URL

    【讨论】:

    • 它以匿名用户身份登录,有无斜线没有区别。代码或模板中没有 csrf。 Django 的日志显示 200 响应,并且在获取 secret_page 时也显示 200。 cj 包含 cookie 信息。 opener.open 的响应又是 200 并且 url 是一样的。
    • @Jimmy app_r12 是会话密钥吗?如果是这样,您可以在 session 中检查其值。
    【解决方案3】:

    我将 POST 请求发送到了错误的 URL。它打算发送到:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 2019-10-28
      • 1970-01-01
      • 2010-10-02
      • 2020-09-29
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多