- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 requests 处理一些 API。为了保持我的帐户授权,我在退出时将 cookie 保存到数据库中,并在下次恢复它们。
出于某种原因,请求不会用服务器返回的新值替换旧的 cookie。它只是添加一个具有相同名称但具有不同值的新 cookie。
代码:
from requests import Session
import json
local_session = Session()
local_session.cookies.update(json.loads(account.cookies))
resp = local_session.request("GET", "http://example.com/path0/")
# all cookies have been sent, server renewed some of them and return in "Set_Cookie" headers
resp = local_session.request("GET", "http://example.com/path1/")
# here requests send two cookies with same name but different values instead of one with new
数据库中的 Cookie:
{
"csrf": "abcdefgh",
"session": "1234567890"
}
上次请求中发送的 Cookie:
{
"csrf": "abcdefgh",
"csrf": "ijklmnop",
"session": "1234567890"
}
我错过了什么,是否可以理智地解决这个问题?
UPD。
我已经尝试在控制台中使用 httpbin 并且...结果是一样的,它重复了 cookies:
from requests import Session
with Session() as sess:
sess.cookies.update({"sessioncookie": "1234567890"})
# Same behavior with sess.cookies.set('sessioncookie','1234567890')
sess.get("https://httpbin.org/cookies/set/sessioncookie/0987654321")
print(sess.cookies.items())
# here's two pairs of cookies with same name now
最佳答案
Cookie 比只是 键值对要复杂一些。浏览器还必须跟踪 cookie 对哪些 URL 有效(通过有关主机名、端口号、URL 路径以及连接是否加密的规则),以及将它们保留多长时间(过期)。有些 cookie 设计为在您关闭浏览器时过期,因此没有设置过期时间。
但是,您并没有将所有这些信息都存储在数据库中。您只存储了键和值,然后当您将 cookie 添加回新的 requests.Session()
cookiejar 时,这些 cookie 被标记为通用和永久。 cookie 将发送到所有 URL,永不过期,并且永远不会因任何原因被丢弃。这种类型的 cookie 有时称为 supercookie。但服务器仍会设置具有完整 URL 有效性和过期信息的常规 cookie,并且由于这些设置,它们是不同的 cookie。
您可以通过遍历示例 httpbin.org
代码中的 cookie 对象来确认这一点:
>>> from requests import Session
>>> sess = Session()
>>> sess.cookies.update({"sessioncookie": "1234567890"})
>>> __ = sess.get("https://httpbin.org/cookies/set/sessioncookie/0987654321")
>>> for cookie in sess.cookies: print(cookie)
...
<Cookie sessioncookie=1234567890 for />
<Cookie sessioncookie=0987654321 for httpbin.org/>
这里有两个单独的cookie,一个用于/
(所有路径,所有域),一个单独用于httpbin.org
。两者都会发送。
您需要在数据库中保留更多信息才能重新创建“正常”cookie。如果您不需要可读 存储,则requests
库明确使cookiejar 可腌制:
import pickle
cookiedata = pickle.dumps(session.cookies, pickle.HIGHEST_PROTOCOL)
这是二进制数据,按原样存储。您可以通过以下方式恢复您的 cookie:
session.cookies.update(pickle.loads(cookiedata))
否则,如果你必须有 JSON 那么你将不得不存储 all the Cookie
attributes :
cookie_attrs = [
"version", "name", "value", "port", "domain", "path", "secure",
"expires", "discard", "comment", "comment_url", "rfc2109"
]
cookiedata = json.dumps([
{attr: getattr(cookie, attr) for attr in cookie_attrs}
for cookie in session.cookies
])
并使用 JSON 恢复
for entry in json.loads(cookiedata):
session.cookies.set(**entry)
从技术上讲,还有一个 _rest
属性跟踪 cookie 的 HttpOnly
属性(在嵌套字典中),但该属性不会被 忽略>requests
因为它仅适用于无法从 JavaScript 访问该属性设置为 True
的 cookie 的浏览器。
原则上,domain
、path
、name
属性使 cookie 唯一,但是如果服务器例如,设置一个具有特定 port
值的 cookie,然后序列化该 cookie 并在稍后恢复它,现在无论目标 URL 使用的端口是什么,cookie 都将被发送(其他一切都在相等),如果网站认为在其他任何地方看到这样的 cookie 是一个问题,这实际上可能会破坏事情。
关于python - 使用从数据库恢复的 cookie 时看到重复的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56970280/
我想知道如何考虑需要您做出某些选择才能看到最终结果的搜索系统。我说的是 select 表单,您可以在其中根据您的选择继续操作,然后您会看到结果。 下面描述了我正在谈论的一个随机示例。想象一下 Init
您好,我目前正在编写一些软件来管理我们的库存。我搜索了 2 个表 master_stock(保存每一个股票代码和描述)库存(保存库存代码、地点、数量...) 一切都很好,但这是我遇到的问题。 假设我的
我有 2 个表,我想合并其数据。id 是我的关键字段(增量且不同)。表1和表2字段说明例如:id - 名称 - 值 我想将表2的所有数据插入表1,它们有不同的数据,但在某些行中有相同的id。 所以当我
我正在努力解决汇编中的一个问题,我必须获取十六进制代码的第一个字节 (FF) 并将其复制到整个值中: 0x045893FF input 0xFFFFFFFF output 我所做的
我有 Eclipse Indigo 版本,我可以在其中运行 Java 和 C++ 项目。 但我只想使用另一个 Eclipse 来编写 C++ 项目。所以我将 eclipse(不是工作区)的源文件夹复制
This question already has answers here: What is a NullPointerException, and how do I fix it? (12个答案)
This question already has answers here: Numbering rows within groups in a data frame (8个答案) 5个月前关闭。
我知道用q记录到寄存器中,但我想知道是否可以设置一些东西来快速调用最后一个记录,就像一样。 回顾最后一个简短的编辑命令(有关 的讨论请参阅 here。)。 我知道@@,但它似乎只有在执行@z之后才起作
来自 Eclipse 并且一直习惯于复制行,发现 Xcode 没有这样的功能是很奇怪的。或者是吗? 我知道可以更改系统范围的键绑定(bind),但这不是我想要的。 最佳答案 要删除一行:Ctrl-A
假设我有一个包含元素的列表,例如[1,2,3,4,5,6,7,8]。我想创建长度为 N 的该元素的所有排列。 因此,对于N = 4,它将是[[1,1,1,1],[1,1,1,2],[1,1,2,1],
我有一个带有 JMenu 的 JFrame。当我在某些情况下添加包含图像的 JPanel 时,程序首次启动时菜单会重复。调整大小时重复的菜单消失。任何建议都非常感激。谢谢。代码如下: public c
我正在尝试查找目录中文件的重复项。 我对这个 block 有一个问题,它以文件地址作为参数: public void findFiles(ArrayList list){ HashMap hm
我知道这个问题已经发布并且已经给出了答案,但我的情况不同,因为我在单个方法上填充多个下拉列表,所以如果我点击此链接 After every postback dropdownlist items re
我正在尝试为我的日历应用程序实现重复模式。我希望它的工作方式与 Outlook 在您设置重复约会时的工作方式相同。 public async Task> ApplyReccurrencePeriod
我有一个利用 cookie 来支持准向导的应用程序(即,它是一组相互导航的页面,它们必须以特定顺序出现以进行注册)。 加载 Logon.aspx 页面时 - 默认页面 - 浏览器 cookie 看起来
我有 3 个输入,代码检查它们是否为空,如果为空,则将变量值添加到输入中。 所以我有 3 个具有值的变量: var input1text = "something here"; var input2t
根据数组的长度更改数组的每个元素的最佳方法是什么? 例如: User #1 input = "XYZVC" Expected Output = "BLABL" User #2 input = "XYZ
我在让 Algolia 正常工作时遇到了一些麻烦。我正在使用 NodeJS 并尝试在我的数据库和 Algolia 之间进行一些同步,但由于某种原因似乎随机弹出大量重复项。 如您所见,在某些情况下,会弹
遵循以下规则: expr: '(' expr ')' #exprExpr | expr ( AND expr )+ #exprAnd | expr ( OR expr )+ #exprO
我有一个布局,我想从左边进入并停留几秒钟,然后我希望它从右边离开。为此,我编写了以下代码: 这里我在布局中设置数据: private void loadDoctor(int doctorsInTheL
我是一名优秀的程序员,十分优秀!