Web server

Web server je program koji koristi HTTP protokol (Hypertext Transfer Protocol) da isporuči(servira) fajlove koje zahtevaju udaljeni korisnici putem klijentskih programa (najčešće brauzera). Serverom se mogu zvati i kompjuteri i drugi uređaji koji učestvuju u ovom procesu.

Proces kojim serveri pružaju usluge klijentima nazivamo klijent/server modelom (arhitekturom). Poznati serveri su Apache (najviše korišćeni web server)m Microsoft IIS server i NGNIX (izgovara se engine X).

Web aplikacije se mogu razvijati i na bazi ovih servera. Mi ćemo, međutim, za naše web aplikacije koristiti vlastite servere, jer je to najčešći način razvoja složenijih web aplikacija.

Jednostavni Python socket server

Ovde je prikazan vrlo jedan jednostavan http server korišćenjem standardne Python biblioteke.

Server:

# HTTP server - Ja sam server, a onaj koji mi se obraca je klijent

import socket

uticnica = socket.socket()       # Kreiranje socket-a ( prikljucka )
uticnica.bind(('', 8888))        # Povezivanje sa port-om
uticnica.listen(5)               # Max. broj zahteva u redu za cekanje je 5

print("Čekam zahteve na portu: ",8888)   # Log
while True:
    klijent, adresa = uticnica.accept()                             # Čekaj i prihvati novi zahtev
    zahtev = klijent.recv(1024)                                     # Preuzmi sadržaj zahteva
    print("Poziv sa adrese: ",adresa,"\n",zahtev.decode("utf-8"))   # Prikaži zahtev
    klijent.send(str.encode('HTTP/1.1 200 OK\r\n'))                 # Potvrda prijema zahteva,
    klijent.send(str.encode("Content-Type: text/html\r\n\r\n"))     # Tip odgovora
    klijent.send(str.encode("Pozdrav iz Beograda!"))                # Odgovor na zahtev
    klijent.close()                                                 # Prekini vezu sa korsinikom

uticnica.close()  # Zatvaranje server socket-a

Dodatne informacije o socket modulu možete da nađete u Standardnoj biblioteci

Složeniji Python web server

Server:

import http.server
Server = http.server.HTTPServer
BaseHandler = http.server.BaseHTTPRequestHandler

class Handler(BaseHandler):
        def _set_headers(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()

        def do_GET(self):
            self._set_headers()
            self.wfile.write(str.encode("<html><body><h1>hi!</h1></body></html>"))

        def do_HEAD(self):
            self._set_headers()

        def do_POST(self):
            # Print posted data
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length)
            print (post_data)
            self._set_headers()
            html = "<html><body><h1>POST!</h1><pre>" +
           str(post_data.decode("utf-8")) + "</pre></body></html>"
            self.wfile.write(str.encode(html))


def run(server_class=Server, handler_class=Handler, port=8888):
        server_address = ('', port)
        httpd = server_class(server_address, handler_class)
        print ('Starting httpd...')
        httpd.serve_forever()

if __name__ == "__main__":
        from sys import argv

        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()

Eksperimetisaćemo sa ova dva servera sa cilje da bolje shvatimo njihovu ulogu i način funkcionisanja.

Dodatne informacije o http.server-u možete da nađete u Stanadardnoj biblioteci