Могу ли я установить заголовок с помощью SimpleHTTPServer python?
Я использую SimpleHTTPServer
чтобы проверить некоторые веб-страницы над которой я работаю. Он отлично работает, однако мне нужно сделать несколько междоменных запросов. Это требует установки Access-Control-Allow-Origin
заголовок с доменами, к которым страница имеет доступ.
есть ли простой способ установить заголовок с SimpleHTTPServer и обслуживать исходный контент? Заголовок будет одинаковым для каждого запроса.
4 ответов
это немного Хак, потому что он меняется end_headers()
поведение, но я думаю, что это немного лучше, чем копирование и вставка всего .
мой подход переопределяет end_headers()
в подклассе и в нем вызывает send_my_headers()
с последующим вызовом суперкласса end_headers()
.
это не 1 - 2 линии, менее чем 20, хотя, в основном шаблонный.
#!/usr/bin/env python
import SimpleHTTPServer
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_my_headers()
SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Access-Control-Allow-Origin", "*")
if __name__ == '__main__':
SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)
я бы сказал, что нет простого способа сделать это, где простой означает "просто добавьте 1-2 строки, которые напишут дополнительный заголовок и сохранят существующую функциональность". Таким образом, лучшим решением было бы подкласс SimpleHTTPRequestHandler
class и повторно реализовать функциональность, с добавлением нового заголовка.
проблема, стоящая за тем, почему нет простого способа сделать это, можно наблюдать, глядя на реализацию SimpleHTTPRequestHandler
класс в библиотеке Python: http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server.py#l654
уведомления send_head()
метод, особенно строки в конце метода, которые посылают заголовки ответа. Обратите внимание на вызов end_headers()
метод. Этот метод записывает заголовки в выходные данные вместе с пустой строкой, которая сигнализирует конец всех заголовков и начало тела ответа: http://docs.python.org/py3k/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers
таким образом, было бы невозможно подкласс SimpleHTTPRequestHandler
обработчик, вызовите супер-класс do_GET()
метод, а затем просто добавьте еще один заголовок - потому что отправка заголовков уже завершена, когда вызов супер-класса do_GET()
возвращает метод. И это должно работать так, потому что do_GET()
метод должен отправить тело (файл, который запрошено), а для отправки тела-он должен завершить отправку заголовков.
Итак, опять же, я думаю, что вы застряли с подклассом SimpleHTTPRequestHandler
класса, реализации его точно так же, как код в библиотеке (просто копипастил?), и добавьте еще один заголовок перед вызовом end_headers()
метод 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
...
# coding: utf-8
import SimpleHTTPServer
import SocketServer
PORT = 9999
def do_GET(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', 'http://example.com')
self.end_headers()
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
Handler.do_GET = do_GET
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
хотя это более старый ответ, его первый результат в google...
в основном то, что предложил @iMon0..Кажется правильным?..Пример doPOST
def do_POST(self):
self.send_response()
self.send_header('Content-type','application/json')
self.send_header('Access-Control-Allow-Origin','*')
self.end_headers()
sTest = {}
sTest['dummyitem'] = "Just an example of JSON"
self.wfile.write(json.dumps(sTest))
делая это, поток чувствует себя правильно..
1: Вы получаете запрос
2: применение заголовков и тип ответ требуется
3: вы отправляете обратно данные, которые вы хотите, быть это то, что или как вы хотите.,
приведенный выше пример отлично работает для меня и может быть расширен дальше, это просто голый сервер JSON post. Поэтому я оставлю это здесь, на СОФ, если кому-то это понадобится, или я сам вернусь через несколько месяцев.
это создает действительный файл JSON только с объектом sTest, таким же, как сгенерированная PHP страница/файл.