Введение
Примеры
Запуск простого 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