Powiedziałbym, że nie ma prosty sposób to zrobić, gdzie proste środki „wystarczy dodać 1-2 linie, które będą pisać dodatkowy nagłówek i zachować istniejącą funkcjonalność”. Najlepszym rozwiązaniem byłoby więc podklasować klasę SimpleHTTPRequestHandler
i ponownie zaimplementować funkcjonalność, dodając nowy nagłówek.
Problem z tyłu, dlaczego nie istnieje prosty sposób w ten sposób można zaobserwować patrząc na wdrażaniu klasy SimpleHTTPRequestHandler
w bibliotece Python: http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server.py#l654
Wskazówka metoda send_head()
, zwłaszcza wiersze na koniec metoda, która wysyła nagłówki odpowiedzi. Zwróć uwagę na wywołanie metody end_headers()
. Metoda ta pisze nagłówki do wyjścia, razem z pustą linią, która sygnalizuje koniec wszystkich nagłówków i początek korpusu odpowiedzi: http://docs.python.org/py3k/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers
Dlatego też nie byłoby możliwe do podklasy obsługi SimpleHTTPRequestHandler
, wywołać Super -class do_GET()
metoda, a następnie po prostu dodaj kolejny nagłówek - ponieważ wysyłanie nagłówków zostało już zakończone, gdy zostanie zwrócone wywołanie metody super-klasy do_GET()
. I musi działać tak, ponieważ metoda do_GET()
musi wysłać ciało (żądany plik) i wysłać ciało - musi sfinalizować wysyłanie nagłówków.
Więc jeszcze raz, myślę, że utkniesz z sub-classing klasę SimpleHTTPRequestHandler
, wdrażanie go dokładnie jak kod w bibliotece (wystarczy skopiować i wkleić go?) I dodać kolejny nagłówek przed wywołaniem do end_headers()
Sposób send_head()
:
...
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
# this below is the new header
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
return f
...
Nie zapomnij również wysłać nagłówków, jeśli redefiniujesz do_GET: 'def do_GET (self): self.send_head()' – user474708
To rozwiązanie nie działa, jeśli używasz domyślnej metody do_GET(). Nie wywołuje end_headers. – Koffiman