Selamun Aleyküm arkadaşlar. Bu seride Python ile "Web Server" nasıl oluşturabiliriz ? Ondan bahsedeceğim.
Web Server İnşa Edelim Part 1
Öncelikle basitce bir "Web server" nedir ? Ondan bahsedelim.
Yukarıdaki resimde bir "Web Server" nasıl çalışmakta olduğu basit bir şekilde şematize edilmiştir. Kısaca açıklamak gerekirse fiziksel bir sunucu üzerinde bulunan client(istemci) sunucunun bir istekte bulunmasını bekleyen ağ sunucusudur. Bir istek aldığında bu isteğe karşılık bir response(yanıt) üretir ve bunu geri client(istemci) geri yollar. "Client" ve "Server" arasındaki iletişim ise "HTTP" protokolü aracılığıyla olmaktadır. Burada bahsetmiş olduğumuz Client(istemci) bir tarayıcı ya da "HTTP" konuşabilen bir yazılım olabilir(curl v.b)
Basit bir "Web Serveri" Python ile nasıl kodlayabiliriz onu anlayabilmek için aşağıdaki kodu inceleyelim;
Burada görmüş olduğumuz kod bloğunu incelemeye başlarsak öncelikle "socket.socket" ile bir socket objesi oluşturduğumuzu görüyoruz.
Bu oluşturduğumuz socket objesi kullanılan "listen_socket.bind(HOST,PORT)" fonksiyonu sayesinde belirtilmiş olan "HOST" ve "PORT" üzerinden socket objesine "HOST" ve "PORT" tanımlaması yapar. Belirtilen IP ve PORT üzerinden dinlemeye "listen_socket.listen(1)" ile başlar.
Daha sonrasında ise "listen_socket.accept()" fonksiyonu ile gelen istekleri kabul ediyoruz. "client_connection.recv(1024)" fonksiyonu sayesinde istemciden gelmiş olan veriyi alıyoruz ve "utf-8" ile decode ediyoruz. Son olarak bizim istemciye bir veri göndermemiz gerektiğinden dolayı
"client_connection.sendall(http_response)" fonksiyonu sayesinde oluşturmuş olduğumuz HTTP mesajını client(istemci) sunucuya yolluyoruz.
İstemci sunucuya bir istek yaptığında karşısında oluşturduğumuz "http_response" mesajını görecektir.
Bakalım anlattıklarımız nasıl işliyor. Yukarıdaki kodu "webserver.py" olarak kaydettikten sonra programı "python3 webserver.py" şeklinde çalıştıralım.
Şu anda socket objemiz oluşmuş durumda ve "8888" porttan bir veri gelmesini bekliyor. Ben istemci olarak "curl" kullanacağım siz alternatif olarak bir tarayıcıdanda bu işlemleri yapabilirsiniz.(Firefox,chrome v.b)
Görmüş olduğunuz gibi "127.0.0.1:8888" üzerinden servere bir istek yolladığımda server tarafından bize gelen veri "http_response" mesajı olacaktır.
Resimde görmüş olduğunuz işlemler aynı şekilde gerçekleşmektedir. Biz burada "telnet" yerine "Curl" ile istek yolladık fakat mantık tamamen aynıdır.
Peki biz "Curl" ile bir mesaj yolladık ama ne mesajı yolladık ? Server bizim ondan bir veri istediğimizi nasıl anladı ? Bir de bunu inceleyelim.
Bir HTTP isteği üç ana kısımdan oluşur. Birinci kısmı isteğin tipini belli etmektedir. Yukarıdaki resimde görmüş olduğunuz üzere biz web servere "GET"
isteği yolladık çünkü biz web server'in bir veri döndürmesini istiyoruz bunun için kullanacağımız method "GET" methodudur. Path kısmında ise web server üzerinde görmek istediğimiz sayfayı belli ederken son kısımda ise kullanacağımız HTTP'nin versiyonunu belirtiyoruz. Burada eklemek istediğim bir şey var tarayıcı kullanırken url kısmına adresi ve portu yazdıktan sonra web tarayıcısı bize tam olarak bu işi yapmaktadır. Server kısmına otomatik olarak bir "GET" methodu oluşturup yollamaktadır. Dolayısıyla işin mantığını anlamak açısından tarayıcı yerine "Curl" kullanmanız daha iyi olacaktır.
Server bu isteği(request) alır ve gelen isteği okur. Ona uygun olan response(yanıtı) tekrar client(istemci) tarafına yollar. Yukarıda resimde istemci tarafından gelen isteğe yanıt olarak gidecek olan response paketini görüyoruz. Paketin içerisinde "200 OK" yazısı bulunmakta. Bu ne anlama geliyor ?
Bu "HTTP" isteğinin başarılı bir şekilde alındığını belli etmektedir. İlerleyen yazılarımızda farklı "HTTP Status Code" göreceğiz şimdilik "200" sayısının "HTTP" isteğinin başarılı olarak alındığını belli ettiğini bilmeniz yeterli olacaktır.
Yukarıdaki resim ise "Web Server" tarafını belirtiyor. Anlatmış olduğumuz "GET" methodunu yakalamış ve hangi "Host" üzerinden geldiğini bastırmıştır.
Görmüş olduğunuz "User-Agent" bilgisi ise kullanıcının isteği bize nereden ilettiğini belli etmektedir. Biz isteği "curl" ile yolladığımız için otomatik olarak "User-Agent" bilgisi "curl/7.88.1" şeklinde gözükmektedir. Bu bilgi değiştirilebilir. Gelen her veri doğru olacak diye düşünmeyin. Bunu manipüle etmenin çok basit yöntemleri bulunmaktadır.
İşte temel mantığıyla bir "Web Server" çalışma mimarisi...
Bu yazıda basit bir şekilde "Web Server" nasıl çalıştığından bahsetmeye çalıştık. Basitte olsa bir temel oluşturmuş olduk. Diğer yazılarda işin daha da derinine ineceğiz ve işler biraz daha karmaşıklaşacak. Burada anlamadığınız bir nokta varsa kesinlikle sormanızı bekliyorum.