HTTP серверы на Python

Введение

Примеры

Запуск простого 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() 

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

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

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

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 в браузере, это даст вам следующее:

Программный 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 полезны для нахождения дальнейшего Информация.

Базовая обработка 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

Синтаксис

Параметры

Примечания