Могу ли я установить заголовок с помощью 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 страница/файл.