Server

# primer zahteva: http://localhost:8888/srbija/stanovnika/ukupno/2001
# primer zahteva: http://localhost:8888/srbija/stanovnika/muskih/1930
# primer zahteva: http://localhost:8888/srbija/stanovnika/zenskih/1965

import http.server, json

popisi = {"musko":{1921:1367044+752060,1931:1749920+797330,1948:2015317+784839,1953:2177791+817205,
                   1961:2361534+903273,1971:2585625+951152,1981:2817555+993380,1991:2860986+980731,
                   2002:3645930,2011:3499176},
          "zensko":{1921:1476382+784934,1931:1799770+825828,1948:2144072+855918,1953:2285910+882340,
                    1961:2461740+951692,1971:2664740+1001381,1981:2876909+1041392,1991:2947920+1033158,
                    2002:3852071, 2011:3687686}
          }
godina_popisa = sorted([g for g in popisi['musko']])
musko =  {}
zensko = {}
for i in range (len(godina_popisa)-1):
    g1 = godina_popisa[i]
    g2 = godina_popisa[i+1]
    musko[g1] = popisi['musko'][g1]
    zensko[g1] = popisi['zensko'][g1]
    m1 = popisi['musko'][g1]
    m2 = popisi['musko'][g2]
    z1 = popisi['zensko'][g1]
    z2 = popisi['zensko'][g2]
    for g in range(godina_popisa[i]+1,godina_popisa[i+1]):
        musko[g]  = int(m1 + ( g - g1)/(g2-g1)*(m2-m1))
        zensko[g] = int(z1 + ( g - g1)/(g2-g1)*(z2-z1))
    musko[godina_popisa[-1]]  = popisi['musko'][godina_popisa[-1]]
    zensko[godina_popisa[-1]] = popisi['zensko'][godina_popisa[-1]] 

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()
        if "favicon.ico" in self.path:
            return
        zahtev = self.path.split("/")
        if len(zahtev) < 5:
            print("Pogresan zahtev",self.path)
            self.wfile.write(str.encode("Pogresan zahtev "+self.path))
            return
            
        dummy,zemlja,podatak,pol,godina = zahtev
        if zemlja != 'srbija' or podatak != "stanovnika" or pol not in ['muskih','zenskih','ukupno'] \
           or not godina.isnumeric():
            print("Pogresan zahtev",self.path)
            self.wfile.write(str.encode("Pogresan zahtev "+self.path))
            return
        g = int(godina)
        if g < godina_popisa[0] or g > godina_popisa[-1]:
            self.wfile.write(str.encode("Nema podataka za godinu "+str(g)))
            return         
        if pol == "ukupno":
            poruka = {"srbija":{"godina":g,"ukupno-stanovnika":musko[g]+zensko[g]}}
        elif pol == "muskih":
            poruka = {"srbija":{"godina":g,"muskih-stanovnika":musko[g]}}
        elif pol == "zenskih":
            poruka = {"srbija":{"godina":g,"zenskih-stanovnika":zensko[g]}}
        self.wfile.write(str.encode(json.dumps(poruka)))
          
port=8888
web_server = Server(('',port), Handler)
print ('Server čeka zahteve na portu',port)
web_server.serve_forever()