Takip Edin

element image element image element image element image

Python Requests Session Kullanımı

Anasayfa Bloglar Python Requests Session Kullanımı
Python Requests Session Kullanımı image

Selam dost ! günlerden bir gün, mantra-man adında genç bir python  developer vardı. Python ile hem web uygulamaları hem de otomasyon scriptleri geliştiriyordu ve bunu zevkle yapıyordu. Elinde basic bir görev vardı: birkaç farklı web sitesine ardı ardına GET isteği atacak ve gelen yanıtları bir csv dosyasına kaydedecekti. "Ne kadar zor olabilir ki ya" diye düşündü. Mac book unun kapağını kaldırdı, ice americano sundan bir yudum aldı ve başladı kodları yazmaya:

 

İlk çözüm gayet basitti. Her seferinde requests.get() çağırarak verileri çekiyordu. Kod şöyle görünüyordu:

import requests

url_list = [
    "https://example.com/api/data1",
    "https://example.com/api/data2",
    "https://example.com/api/data3",
]

for url in url_list:
    response = requests.get(url)
    print(response.status_code, response.text[:50])

İlk bakışta her şey yolunda görünüyordu. Kod çalışıyor, veriler geliyordu. Fakat developer fark etti ki her istekte bağlantı tekrar kuruluyor, her seferinde çerezler(leblebiler diyorum ben bunlara) kayboluyor, authentication bilgileri tekrar tekrar gönderiliyordu sanki burada yanlış bir şeyler vardı ya. Üstelik bazı API lar 429 statü kodu dönmeye bile başlamıştı. "Neden bu kadar yavaş?" diye düşündü. İşte o an Session nesnesiyle tanışmasının zamanı gelmişti.


Session Nedir?

Python’un requests kütüphanesi içinde Session classı, basitçe bir tür “bağlantı yöneticisi” gibidir. Diğer bir deyişle ve Türkçe mealiyle Oturum da diyebiliriz. Yani tek seferde açılır, tekrar tekrar kullanılabilir her seferinde istek atmaz aynı oturum üzerinden istekleri gerçekleştirir ve leblebileri(çerezleri) kendi içerisinde saklar. Bir developer için bu, her yeni istekte yeniden çorap örmek yerine, hazır çorabı giyip çıkmak gibidir. Yani daha hızlı, daha düzenli ve daha güvenli yeme yanında yat öyle bi şey

Session ın sunduğu bazı özellikler şöyle efenim:

  • Connection pooling: Aynı TCP bağlantısı tekrar kullanılabiliyordu. Böylece her istekte bağlantı kurma maliyeti düşüyordu.

 

  • Cookie yönetimi: Bir kez login olunca, çerezler ler session içinde saklanıyordu. Böylece her istekte tekrar login olmaya gerek kalmıyordu.

 

  • Header kalıcılığı: Ortak header bilgileri (örneğin User-Agent, Authorization token) her isteğe otomatik eklenebiliyordu.

 

  • Performans: Özellikle onlarca, yüzlerce istek atarken büyük hız kazandırıyordu.

 

Developer bu özellikleri öğrenince heyecanlandı. "Demek ki ben her isteği get() ile yapmak yerine, bir Session açıp onunla yoluma devam etmeliyim." dedi.


Session ile İlk Deneme

Artık kodu biraz değiştirme zamanıydı. Developer Session kullanarak aynı örneği tekrar yazdı:

import requests

session = requests.Session()

url_list = [
    "https://example.com/api/data1",
    "https://example.com/api/data2",
    "https://example.com/api/data3",
]

for url in url_list:
    response = session.get(url)
    print(response.status_code, response.text[:50])

session.close()

Sonuç mu? tabikide çok bariz bir hız farkı! Artık bağlantı her seferinde yeniden kurulmadığı için işlemler çok daha seri gerçekleşiyordu. Üstelik login olmuş bir siteye arka arkaya istek atıldığında session otomatik olarak cookie’leri koruyordu. Developer kendini bir sihirbaz gibi hissetti 🪄


Neden Sadece get() Değil?

Developer düşündü: "Ulan requests.get() zaten işimi görüyor, neden Session kullanayım abi ben?" İşte bunun birkaç cevabı vardı:

  1. Kimlik doğrulama: Bazı API’lere login olunca sana cookie verilir. Eğer get() ile her defasında istek atarsan çerezler kaybolur. Ama Session bunları zaten kendi içinde saklar.

 

  1. Performans: Her get() çağrısında yeni bir TCP bağlantısı açmak zorunda kalırsın. Bu da yavaşlık ve gereksiz kaynak tüketimi demek. Session bunu önler her seferinde aynı bağlantı üzerinden devam edersin.

 

  1. Ortak ayarlar: Her isteğe aynı header veya aynı parametreleri eklemek istiyorsan, bunu Session üzerinden bir kere tanımlayıp tüm isteklere uygulatabilirsin bu da sana aşırı derecede bir kolaylık sağlar.

 

  1. Kurumsal entegrasyon: Büyük sistemlerde API çağrıları genellikle yüzlerce kez yapılır. Tek tek get() kullanmak yerine session ile daha sağlam bir yapı kurulur.

 

Bu nedenler developer için yeterliydi. Artık get() yerine Session kullanmak adeta bir refleks haline gelmeliydi.


Header ve Auth Bilgilerini Saklamak

API istekleri yaparken sıkça headers diye bir değişken oluşturup Authorization keyi ile birlikte buraya gerekli bilgileri yerleştirirz. Her seferinde bunları oluşturup tekrar tekrar istek atmaktansa session içerisine bunları gömüp koruyabiliriz.

import requests

session = requests.Session()
session.headers.update({
    "User-Agent": "...",
    "Authorization": "Bearer token123"
})

response = session.get("https://example.com/api/protected")
print(response.json())

 

Artık her istek otomatik olarak bu header bilgileriyle gidiyor. Artık bir sıkıntıyı daha çözdük diyebiliriz.


Cookie Yönetimi

 

Bir gün developerın  bir web app ine login olması gerekti. Her zaman yaptığı gibi get() ile login olup sonra başka bir sayfaya gitmeye çalıştı ama çerezler kayboldu ve hata aldı.  "Demek ki login olduktan sonra bu çerez meretlerini saklamam lazım" diye düşündü. İşte o an Session bir kez daha süper kahraman edasıyla ortaya çıktı ve developer ın imdadına yetişti:

import requests

login_url = "https://example.com/login"
protected_url = "https://example.com/dashboard"

session = requests.Session()

session.post(login_url, data={"username": "mantra-man", "password": "thisismypasswordlol"})

r = session.get(protected_url)

print(r.text)

 

Developer artık web scraping projelerinde çok daha rahattı. Çünkü bir kez login olunca, tüm istekler login kalıyordu. İşte bu yüzden Session, sıradan get()’ten çok daha güçlüydü.


Gerçek Hayat Senaryosu

 

Bir müşteri bizden şöyle bir şey istedi: “Bana bir script yaz, her gün şu API a 1000 kez istek atsın sonra gerekli verileri toplayıp bir excel dosyasına kaydetsin ben onlara bakıcam..” Burda şöyle düşünebiliriz: “Eğer her istekte get() kullanırsam bu sunucu beni engeller, yavaşlar, hatta belki IP mi bile banlaryabilir sonra ayıkla piricin taşını ama Session kullanırsam bunları düşünmeme gerek yok.”

Ve gerçekten öyle oldu. Session sayesinde aynı bağlantı tekrar ve tekrar kullanıldı, kodumuzun performansı ciddi derecede arttı ve script problemsiz çalıştı. Müşteri mutlu developer mutlu win-win 😎


Sonuç

eveet sonuç olarak requests.get() kullanmak çoğu zaman küçük çaplı projelerde ve hızlı sonuç alınması gereken işlerde yeterli olabilir ama işler büyüyüp gerçek dünyadaki case ler ile karşılaşınca Session kullanmanın avantajları çok daha fazla oluyor. Yine de Session gibi bir yapıya alışmak size ilerleyen projelerde çok daha rahatlık sağlıycak diyebiliriz.

SubLogoBlog Yazılarımız

Blog

"Yeni Makalelerle İlham Alın"

Django Mülakat Soruları

Django Mülakat Soruları

Django mülakat soruları için 5 gerçek case: ORM performansı, transaction & race condition, Celery idempotensi, caching ve prod güvenliği.

Daha Fazla
Python Requests Session Kullanımı

Python Requests Session Kullanımı

Python requests kütüphanesinde Session nesnesinin get yerine nasıl ve neden kullanılacağını öğrenin. Daha hızlı, güvenli ve verimli HTTP istekleri için Ses

Daha Fazla
Django HTML Düzenleme Scripti

Django HTML Düzenleme Scripti

Django projelerinde HTML dosyalarındaki asset yollarını otomatik olarak {% static %} etiketine çeviren Python scripti. Zaman kazandıran pratik çözüm.

Daha Fazla

Teknoloji Çözümleriyle Dijital Gücünüzü Artırın

Web geliştirme, oyun geliştirme, SEO ve veritabanı çözümleri için uzman ekibimizle şimdi tanışın.