Làm thế nào để gửi cookie trong một yêu cầu bài đăng với thư viện Yêu cầu Python?


94

Tôi đang cố gắng sử dụng thư viện Yêu cầu để gửi cookie với một yêu cầu đăng, nhưng tôi không chắc cách thực sự thiết lập cookie dựa trên tài liệu của nó. Tập lệnh được sử dụng trên Wikipedia và (các) cookie cần được gửi có dạng sau:

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

Tuy nhiên, phần khởi động requestsnhanh tài liệu đưa ra ví dụ duy nhất:

cookies = dict(cookies_are='working')

Làm cách nào để mã hóa một cookie như trên bằng thư viện này? Tôi có cần tạo nó bằng thư viện cookie chuẩn của python, sau đó gửi nó cùng với yêu cầu ĐĂNG không?


2
Cookie của bạn bao gồm một số a=b;cặp. Khi đoán, hãy sử dụng alàm khóa và blàm giá trị trong từ điển.
Thomas K,

Câu trả lời:


214

Bản phát hành mới nhất của Request sẽ xây dựng CookieJars cho bạn từ các từ điển đơn giản.

import requests

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

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

Thưởng thức :)


Mã này có phải đặt cookie trong trình duyệt của tôi không? Tôi đã thử nó và nó không hiệu quả với tôi.
Chris Nielsen

15
@ChrisNielsen này câu hỏi / câu trả lời không có gì để làm với các trình duyệt
ThiefMaster

@ThiefMaster: Thông thường, cookie nằm trong trình duyệt. Nếu câu trả lời này không liên quan đến trình duyệt, thì nó liên quan gì?
Chris Nielsen

4
@ChrisNielsen: Câu hỏi này và đoạn mã trong câu trả lời là về việc thiết lập một cookie trong một yêu cầu Python. Yêu cầu thực hiện một cái gì đó tương tự như một yêu cầu trình duyệt, nhưng không có trình duyệt nào liên quan.
DDay

118

Chỉ để mở rộng cho câu trả lời trước đó, nếu bạn đang liên kết hai yêu cầu với nhau và muốn gửi cookie được trả về từ yêu cầu đầu tiên đến yêu cầu thứ hai (ví dụ: duy trì một phiên hoạt động qua các yêu cầu), bạn có thể làm:

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

54
Ngoài ra, bạn có thể sử dụng requests.sessioncho điều chính xác này, lưu trữ cookie trên nhiều phiên, thực hiện các cuộc gọi từ sessionđối tượng được trả về .
TankorSmash

7
Tôi đã phải sử dụng điều này ngay cả khi sử dụng các phiên. Các phiên dường như thiếu tiêu đề Set-Cookie trong một số tình huống.
kervin

1
@kervin điều này cũng xảy ra với tôi. Có vẻ như một lỗi trong yêu cầu, vì phiên sẽ xử lý điều đó.
deweydb

3
@TankorSmash chắc chắn có lỗi, cookie của tôi không được chuyển tiếp khi sử dụngrequest.session
Tjorriemorrie

Đây có phải là cách tốt nhất để đặt cookie (bị bỏ lỡ) trong một phiên không? stackoverflow.com/a/17240616/143397
davidA

0

Nếu bạn muốn chuyển cookie đến trình duyệt, bạn phải thêm vào các tiêu đề để được gửi lại. Nếu bạn đang sử dụng 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]

Tôi có thể xác thực thành công với Bugzilla và TWiki được lưu trữ trên cùng một miền mà tập lệnh python wsgi của tôi đang chạy bằng cách chuyển người dùng / mật khẩu auth tới tập lệnh python của tôi và chuyển cookie vào trình duyệt. Điều này cho phép tôi mở các trang Bugzilla và TWiki trong cùng một trình duyệt và được xác thực. Tôi đang cố gắng làm điều tương tự với SuiteCRM nhưng tôi gặp sự cố khi SuiteCRM chấp nhận cookie phiên thu được từ tập lệnh python mặc dù nó đã được xác thực thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.