HTTP серверы на Python

Введение

Примеры

  • 9

    Запуск простого HTTP-сервера

    python -m SimpleHTTPServer 9000 python -m http.server 9000 Выполнение этой команды служит файлы текущего каталога на порт 9000 .

    Если аргумент не предусмотрен как номер порта , то сервер будет работать по умолчанию порт 8000 .

    -m флаг будет искать sys.path для соответствующего .py файла для запуска в качестве модуля.

    Если вы хотите работать только на локальном хосте, вам нужно написать собственную программу на Python, такую ​​как:

     import sys
    import BaseHTTPServer
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    
    HandlerClass = SimpleHTTPRequestHandler
    ServerClass  = BaseHTTPServer.HTTPServer
    Protocol     = "HTTP/1.0"
    
    if sys.argv[1:]:
       port = int(sys.argv[1])
    else:
       port = 8000
    server_address = ('127.0.0.1', port)
    
    HandlerClass.protocol_version = Protocol
    httpd = ServerClass(server_address, HandlerClass)
    
    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever() 
  • 2

    Обслуживание файлов

    Предполагая, что у вас есть следующий каталог файлов:

    введите описание изображения здесь

    Вы можете настроить веб-сервер для обслуживания этих файлов следующим образом:

    import SimpleHTTPServer import SocketServer PORT = 8000 handler = SimpleHTTPServer.SimpleHTTPRequestHandler httpd = SocketServer.TCPServer (("localhost", PORT), обработчик) print "Обслуживание файлов в порту {}". Формат (PORT) httpd.serve_forever () import http.server import socketserver PORT = 8000 handler = http.server.SimpleHTTPRequestHandler httpd = socketserver.TCPServer (("", PORT), обработчик) print ("обслуживание в порту", PORT) httpd.serve_forever ()

    SocketServer модуль предоставляет классы и функциональные возможности для настройки сетевого сервера.

    SocketServer «s TCPServer класс настраивает сервер , используя протокол TCP. Конструктор принимает кортеж, представляющий адрес сервера (то есть IP-адрес и порт) и класс, который обрабатывает запросы сервера.

    SimpleHTTPRequestHandler класс SimpleHTTPServer модуля позволяет файлы в текущем каталоге будут обслужены.

    Сохраните скрипт в том же каталоге и запустите его.

    Запустите HTTP-сервер: python -m SimpleHTTPServer 8000 python -m http.server 8000 Флаг '-m' будет искать в 'sys.path' соответствующий файл '.py' для запуска в качестве модуля.

    Открыть локальный: 8000 в браузере, это даст вам следующее:

    введите описание изображения здесь

  • 0

    Программный API SimpleHTTPServer

    Что происходит , когда мы выполняем python -m SimpleHTTPServer 9000 ?

    Для того, чтобы ответить на этот вопрос , мы должны понять конструкцию SimpleHTTPServer ( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py ) и BaseHTTPServer ( https://hg.python.org/cpython/file /2.7/Lib/BaseHTTPServer.py ).

    Во - первых, Python вызывает SimpleHTTPServer модуль с 9000 в качестве аргумента. Теперь наблюдаем код SimpleHTTPServer,

     def test(HandlerClass = SimpleHTTPRequestHandler,
             ServerClass = BaseHTTPServer.HTTPServer):
        BaseHTTPServer.test(HandlerClass, ServerClass)
    
    
    if __name__ == '__main__':
        test()
    
     

    Тестовая функция вызывается после обработчиков запросов и ServerClass. Теперь BaseHTTPServer.test вызывается

     def test(HandlerClass = BaseHTTPRequestHandler,
             ServerClass = HTTPServer, protocol="HTTP/1.0"):
    """Test the HTTP request handler class.
    
    This runs an HTTP server on port 8000 (or the first command line
    argument).
    
    """
    
    if sys.argv[1:]:
        port = int(sys.argv[1])
    else:
        port = 8000
    server_address = ('', port)
    
    HandlerClass.protocol_version = protocol
    httpd = ServerClass(server_address, HandlerClass)
    
    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()
    
     

    Следовательно, здесь номер порта, который пользователь передал в качестве аргумента, анализируется и привязывается к адресу хоста. Далее выполняются основные этапы программирования сокетов с заданным портом и протоколом. Наконец сервер сокета инициируется.

    Это базовый обзор наследования от класса SocketServer другим классам:

         +------------+
        | BaseServer |
        +------------+
              |
              v
        +-----------+        +------------------+
        | TCPServer |------->| UnixStreamServer |
        +-----------+        +------------------+
              |
              v
        +-----------+        +--------------------+
        | UDPServer |------->| UnixDatagramServer |
        +-----------+        +--------------------+
    
     

    Ссылки https://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.py и https://hg.python.org/cpython/file/2.7/Lib/SocketServer.py полезны для нахождения дальнейшего Информация.

  • 0

    Базовая обработка GET, POST, PUT с использованием BaseHTTPRequestHandler

     # from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer # python2
    from http.server import BaseHTTPRequestHandler, HTTPServer # python3
    class HandleRequests(BaseHTTPRequestHandler):
        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("received get request")
    
        def do_POST(self):
            '''Reads post request body'''
            self._set_headers()
            content_len = int(self.headers.getheader('content-length', 0))
            post_body = self.rfile.read(content_len)
            self.wfile.write("received post request:<br>{}".format(post_body))
    
        def do_PUT(self):
            self.do_POST()
    
    host = ''
    port = 80
    HTTPServer((host, port), HandleRequests).serve_forever()
    
    
    
    
     

    Пример выходных данных с помощью curl :

    $ curl http://localhost/
    received get request%                                                                                                                                                                                       
    
    $ curl -X POST http://localhost/
    received post request:<br>%                                                                                                                                                                                 
    
    $ curl -X PUT http://localhost/
    received post request:<br>%                                                                                                                                                                                 
    
    $ echo 'hello world' | curl --data-binary @- http://localhost/
    received post request:<br>hello world

Синтаксис

Параметры

Примечания