จะส่งคุกกี้ในคำขอโพสต์ด้วยไลบรารีคำขอ Python ได้อย่างไร


105

ฉันพยายามใช้ไลบรารีคำขอเพื่อส่งคุกกี้พร้อมกับคำขอโพสต์ แต่ฉันไม่แน่ใจว่าจะตั้งค่าคุกกี้ตามเอกสารประกอบอย่างไร สคริปต์นี้มีไว้สำหรับใช้ใน Wikipedia และคุกกี้ที่ต้องส่งเป็นแบบฟอร์มนี้:

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

อย่างไรก็ตามการrequestsเริ่มต้นอย่างรวดเร็วของเอกสารให้สิ่งนี้เป็นเพียงตัวอย่างเดียว:

cookies = dict(cookies_are='working')

ฉันจะเข้ารหัสคุกกี้เช่นเดียวกับด้านบนโดยใช้ไลบรารีนี้ได้อย่างไร ฉันจำเป็นต้องสร้างด้วยไลบรารีคุกกี้มาตรฐานของ python จากนั้นส่งไปพร้อมกับคำขอ POST หรือไม่


2
คุกกี้ของคุณประกอบด้วยa=b;คู่ต่างๆ ในการเดาใช้aเป็นคีย์และbเป็นค่าในพจนานุกรม
Thomas K

คำตอบ:


233

คำขอรุ่นล่าสุดจะสร้าง CookieJars สำหรับคุณจากพจนานุกรมง่ายๆ

import requests

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

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

สนุก :)


รหัสนี้ควรจะวางคุกกี้ในเบราว์เซอร์ของฉันหรือไม่ ฉันลองแล้วมันไม่ได้ผลสำหรับฉัน
Chris Nielsen

19
@ChrisNielsen คำถาม / คำตอบนี้ไม่มีส่วนเกี่ยวข้องกับเบราว์เซอร์
ThiefMaster

@ThiefMaster: โดยปกติคุกกี้จะอยู่ในเบราว์เซอร์ ถ้าคำตอบนี้ไม่เกี่ยวกับเบราว์เซอร์มันต้องทำอย่างไร
Chris Nielsen

6
@ChrisNielsen: คำถามนี้และรหัสในคำตอบเกี่ยวกับการตั้งค่าคุกกี้ในคำขอ Python คำขอทำสิ่งที่คล้ายกับคำขอของเบราว์เซอร์ แต่ไม่มีเบราว์เซอร์ที่เกี่ยวข้อง
DDay

123

เพียงเพื่อขยายคำตอบก่อนหน้านี้หากคุณเชื่อมโยงสองคำขอเข้าด้วยกันและต้องการส่งคุกกี้ที่ส่งคืนจากคำขอแรกไปยังคำขอที่สอง (เช่นการรักษาเซสชันให้คงอยู่ในคำขอต่างๆ) คุณสามารถทำได้:

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

55
นอกจากนี้คุณสามารถใช้requests.sessionสำหรับสิ่งที่แน่นอนนี้จัดเก็บคุกกี้ในหลาย ๆ เซสชันโทรออกจากsessionวัตถุที่ส่งคืนแทน
TankorSmash

7
ฉันต้องใช้สิ่งนี้แม้ว่าจะใช้เซสชันในบางครั้ง ดูเหมือนว่าเซสชันจะพลาดส่วนหัว Set-Cookie ในบางสถานการณ์
kervin

1
@kervin สิ่งนี้ก็เกิดขึ้นกับฉันเช่นกัน ดูเหมือนว่าจะมีข้อบกพร่องในคำขอเนื่องจากเซสชันควรจัดการกับสิ่งนั้น
deweydb

3
@TankorSmash มีข้อผิดพลาดแน่นอนคุกกี้ของฉันไม่ได้ถูกส่งต่อโดยใช้request.session
Tjorriemorrie

นี่เป็นวิธีที่ดีที่สุดในการตั้งค่าคุกกี้ (พลาด) ในเซสชันหรือไม่? stackoverflow.com/a/17240616/143397
davidA

0

หากคุณต้องการส่งคุกกี้ไปยังเบราว์เซอร์คุณต้องต่อท้ายส่วนหัวเพื่อส่งกลับ หากคุณใช้ 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]

ฉันสามารถรับรองความถูกต้องด้วย Bugzilla และ TWiki ที่โฮสต์บนโดเมนเดียวกันสคริปต์ python wsgi ของฉันทำงานได้สำเร็จโดยการส่ง auth user / password ไปยังสคริปต์ python ของฉันและส่งคุกกี้ไปยังเบราว์เซอร์ สิ่งนี้ทำให้ฉันสามารถเปิดหน้า Bugzilla และ TWiki ในเบราว์เซอร์เดียวกันและได้รับการรับรองความถูกต้อง ฉันพยายามทำเช่นเดียวกันกับ SuiteCRM แต่ฉันมีปัญหากับ SuiteCRM ที่ยอมรับคุกกี้เซสชันที่ได้รับจากสคริปต์ python แม้ว่าจะได้รับการรับรองความถูกต้องสำเร็จแล้วก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.