【问题标题】:How to store cookies received from a request?如何存储从请求中收到的 cookie?
【发布时间】:2019-03-12 22:39:49
【问题描述】:

我有一个应用程序,我可以像这样创建request

headers = {'Content-Type': 'application/json;charset=ISO-8859-1'}
d = {'db_name': 'a_database', 'username': 'me', 'password': 'apw'}

db_url = "http://123.45.67.89:1234/something/rest/connections"
r = requests.post(db_url, data=json.dumps(d), headers=headers)

这将创建一个 cookie:

r.cookies
<RequestsCookieJar[Cookie(version=0, name='removed', value='removed', port=None, port_specified=False, domain='123.45.67.89', domain_specified=False, domain_initial_dot=False, path='/something', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False), Cookie(version=0, name='connectname', value='alsoremoved', port=None, port_specified=False, domain='123.45.67.89', domain_specified=False, domain_initial_dot=False, path='/something/rest', path_specified=False, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>

然后我可以使用r.cookies 来创建额外的requests,然后在其中指定cookies=r.cookies

在我的flask应用程序中,我想在几个函数中使用cookie,所以我想我会把它存储在session中:

from flask import Flask, render_template, request, jsonify, session

session['cookies'] = r.cookies

这样我以后可以使用

r2 = requests.post(someurl, data=json.dumps(anotherd), headers=headers, cookies=session['cookies'])

但是,这会导致

“RequestsCookieJar”类型的对象不是 JSON 可序列化的

我将如何存储r.cookies,以便它在我的应用程序的所有功能中都可用,但在用户之间可能会有所不同?

【问题讨论】:

  • cookies 不在会话中。他们在请求中。导致您误入歧途的原因可能是,有时,cookie 用于存储会话 id,然后用于检索会话数据(从内存或数据库或任何地方)
  • @zvone:好的,那么我将在session 中从r.cookies 中存储什么,然后如何根据我存储的内容在下一个request 中创建cookies=cookies 部分在session?
  • 玩 Session 对象要容易得多。 Cookie 管理是透明的。见docs.python-requests.org/en/master/user/advanced/…
  • @glenfant:感谢您的链接。我将如何在所描述的上下文中使用它?
  • @Cleb : from requests import Session ... client = Session() ... r = client.post(db_url, data=json.dumps(d), headers=headers)。然后稍后继续使用这个 client 对象,它将为您处理 cookie。在 iPython REPL 中测试它以获得更多提示。

标签: python flask request session-cookies


【解决方案1】:

你不能存储RequestsCookieJar,不,但如果你想要的只是cookie的名称和值,你可以简单地将jar转换为字典:

session['cookies'] = r.cookies.get_dict()

RequestsCookieJar.get_dict() method 还支持按域和路径过滤。

对于未来的请求,requests.&lt;METHOD&gt;(...) 调用的cookies 参数直接接受这样的字典。

【讨论】:

  • 谢谢。然后我将如何根据session['cookies'] 发出下一个请求?所以像r2 = request(..., cookies=make_cookie(session['cookies']))make_cookie 是什么?
  • @Cleb:cookies直接接受名称-值对的字典,不需要make_cookie() 任何东西。
  • 你认为这样存储cookie是最好的方式吗?有没有更好的方法/是否有任何潜在的缺点?
  • @Cleb:域/路径/浏览器标志信息被删除。但是对于后端 REST API 调用来说,这几乎肯定是非常好的。如果 API 要按路径或子域发布专家 cookie,则在生成 dict 时,您始终可以先按域或路径过滤 cookie。然而,我对此表示高度怀疑。
  • @Cleb:是的,这里没有线程之间共享的内容。
猜你喜欢
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2020-05-08
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
相关资源
最近更新 更多