Документация по Python

HTTP серверы на Python

В: Документация по 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

Синтаксис

Параметры

Примечания

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.