如何使用Python Requests库在post请求中发送cookie?

问题描述 投票:0回答:4

我正在尝试使用 Requests 库通过 post 请求发送 cookie,但我不确定如何根据其文档实际设置 cookie。该脚本用于维基百科,需要发送的 cookie 具有以下形式:

enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly

但是,

requests
文档快速入门将此作为唯一的示例:

cookies = dict(cookies_are='working')

如何使用这个库对像上面这样的 cookie 进行编码?我需要用python的标准cookie库制作它,然后将其与POST请求一起发送吗?

python cookies http-request python-requests
4个回答
352
投票

最新版本的 Requests 将为您从简单的字典构建 CookieJars。

import requests

cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}

r = requests.post('http://wikipedia.org', cookies=cookies)

享受:)


157
投票

只是为了扩展之前的答案,如果您将两个请求链接在一起并希望将从第一个请求返回的 cookie 发送到第二个请求(例如,跨请求保持会话活动),您可以这样做:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)

1
投票

如果您想将 cookie 传递给浏览器,则必须附加到要发回的标头中。如果您使用 wsgi:

import requests
...


def application(environ, start_response):
    cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
    response_headers = [('Content-type', 'text/plain')]
    response_headers.append(('Set-Cookie',cookie))
...

    return [bytes(post_env),response_headers]

通过将身份验证用户/密码传递给我的 python 脚本并将 cookie 传递给浏览器,我成功地能够对托管在我的 python wsgi 脚本运行的同一域上的 Bugzilla 和 TWiki 进行身份验证。这允许我在同一浏览器中打开 Bugzilla 和 TWiki 页面并进行身份验证。我正在尝试对 SuiteCRM 执行相同的操作,但我在 SuiteCRM 接受从 python 脚本获取的会话 cookie 时遇到问题,即使它已成功通过身份验证。


0
投票

与 cookie 一起发送请求的最佳实践是使用

Session
对象。这样您就不需要每次请求时都解析 cookie。

举个例子:

import requests

cookie = dict(user_session="xxx-xxx-xxx")

with requests.Session() as s:
    s.cookies.update(cookie)
    response = s.post("https:xxx.com")
© www.soinside.com 2019 - 2024. All rights reserved.