Python İstekleri kitaplığı ile bir gönderi isteğinde tanımlama bilgileri nasıl gönderilir?


101

Çerezleri gönderi isteği ile göndermek için İstekler kitaplığını kullanmaya çalışıyorum , ancak belgelerine göre çerezleri nasıl ayarlayacağımı bilmiyorum. Komut dosyası Wikipedia'da kullanılmak içindir ve gönderilmesi gereken çerez (ler) şu biçimdedir:

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

Ancak, requestsdokümantasyon hızlı başlangıcı bunu tek örnek olarak verir:

cookies = dict(cookies_are='working')

Bu kitaplığı kullanarak yukarıdaki gibi bir çerezi nasıl kodlayabilirim? Bunu python'un standart çerez kitaplığıyla yapıp POST isteği ile birlikte göndermem gerekir mi?


2
Tanımlama bilginiz birkaç a=b;çiftten oluşur . Bir tahmin olarak, bir sözlükte aanahtar ve bdeğer olarak kullanın .
Thomas K

Yanıtlar:


224

Requests'in en son sürümü, sizin için basit sözlüklerden CookieJars oluşturacaktır.

import requests

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

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

Zevk almak :)


Bu kodun tarayıcıma bir çerez yerleştirmesi gerekiyor mu? Denedim ve benim için işe yaramadı.
Chris Nielsen

18
@ChrisNielsen bu sorunun / cevabın tarayıcılarla ilgisi yok
ThiefMaster

@ThiefMaster: Normalde çerezler tarayıcılarda yaşar. Bu cevabın tarayıcılarla ilgisi yoksa, bununla ne alakası var?
Chris Nielsen

5
@ChrisNielsen: Bu soru ve yanıttaki kod, bir Python isteğinde bir çerez ayarlamakla ilgilidir. İstek, tarayıcı isteğine benzer bir şey yapar, ancak hiçbir tarayıcı dahil değildir.
GG

122

Önceki cevaba daha da genişletmek gerekirse, iki isteği birbirine bağlıyorsanız ve birinciden ikinciye döndürülen çerezleri göndermek istiyorsanız (örneğin, istekler arasında bir oturumu canlı tutmak) şunları yapabilirsiniz:

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

54
Ek olarak, requests.sessiontam olarak bu şey için, çerezleri birden fazla oturumda depolayarak, sessionbunun yerine döndürülen nesneden çağrılar yaparak kullanabilirsiniz .
TankorSmash

7
Bazen seansları kullanırken bile bunu kullanmak zorunda kaldım. Oturumlar, bazı durumlarda Set-Cookie başlıklarını kaçırıyor gibi görünüyor.
kervin

1
@kervin bu bana da oldu. İsteklerde bir hata gibi görünüyor, çünkü oturum bunu halletmelidir.
deweydb

3
@TankorSmash kesinlikle bir hata var, çerezlerim kullanılarak ileriye request.session
taşınmıyor

Bir oturumda (cevapsız) çerez ayarlamanın en iyi yolu bu mu? stackoverflow.com/a/17240616/143397
davidA

0

Çerezi tarayıcıya iletmek istiyorsanız, geri gönderilecek başlıklara eklemeniz gerekir. Wsgi kullanıyorsanız:

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 wsgi betiğim, auth kullanıcı / şifreyi python betiğime geçirerek ve çerezleri tarayıcıya ileterek aynı etki alanında barındırılan Bugzilla ve TWiki ile kimlik doğrulamasını başarıyla yapabiliyorum. Bu, Bugzilla ve TWiki sayfalarını aynı tarayıcıda açmama ve kimlik doğrulamasına izin veriyor. Aynı şeyi SuiteCRM ile yapmaya çalışıyorum, ancak SuiteCRM'nin başarıyla doğrulanmış olmasına rağmen python betiğinden elde edilen oturum çerezlerini kabul etmekte sorun yaşıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.