Как сделать веб сервер на python
Перейти к содержимому

Как сделать веб сервер на python

  • автор:

Пишем простой сервер на Python

Ну, начнем как и везде с определений, берите тетрадь и ручку сейчас начнется нудятина. Чтобы мы cмогли написать свой сервер, нужно для начала понимать как он вообще работает, ловите определение:

Сервер – это программное обеспечение, которое ожидает запросов клиентов и обслуживает или обрабатывает их соответственно.

Если объяснять это своими словами, представьте фургон с хот-догами(сервер), проголодавшись, вы(клиент) подходите и говорите повару, что вы хотите заказать(запрос), после чего повар обрабатывает, что вы ему сказали и начинает готовить, в конечном итоге вы получаете свой хот-дог(результат) и сытый радуетесь жизни. Для наглядности посмотри схему.

Околопрактика

Для написания сервера мы будем использовать Python и модуль Socket.

Socket позволяет нам общаться с сервером с помощью сокетов. Весь код я постараюсь пояснять, дабы ты мой дорогой читатель все понял. В конце статьи будет готовый код.

Создайте два файла в одной директории:

Практика

Пишем код для серверной части, так что открывайте файл socket_server.py.

Начнем с импорта модуля и создания TCP-сокета:

import socket

Далее весь код будет с комментариями:

s.bind(('localhost', 3030)) # Привязываем серверный сокет к localhost и 3030 порту. s.listen(1) # Начинаем прослушивать входящие соединения conn, addr = s.accept() # Метод который принимает входящее соединение.

Добавим вечный цикл, который будет считывать данные с клиентской части, и отправлять их обратно.

while True: # Создаем вечный цикл. data = conn.recv(1024) # Получаем данные из сокета. if not data: break conn.sendall(data) # Отправляем данные в сокет. print(data.decode('utf-8')) # Выводим информацию на печать. conn.close()

Переходим к клиентской части, весь код теперь пишем в файле socket_client.py.

Начало у клиентской части такое-же как и у серверной.

import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Далее подключимся к нашему серверу и отправим сообщение «Hello. Habr!».

s.connect(('localhost', 3030)) # Подключаемся к нашему серверу. s.sendall('Hello, Habr!'.encode('utf-8')) # Отправляем фразу. data = s.recv(1024) #Получаем данные из сокета. s.close()

Слева сервер, справа клиент

Заключение

Вот мы с вами и написали свой первый сервер, рад был стараться для вас, ниже будет готовый код.

socket_server.py:

import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('localhost', 3030)) # Привязываем серверный сокет к localhost и 3030 порту. s.listen(1) # Начинаем прослушивать входящие соединения. conn, addr = s.accept() # Метод который принимает входящее соединение. while True: data = conn.recv(1024) # Получаем данные из сокета. if not data: break conn.sendall(data) # Отправляем данные в сокет. print(data.decode('utf-8')) conn.close()

socket_client.py:

import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 3030)) # Подключаемся к нашему серверу. s.sendall('Hello, Habr!'.encode('utf-8')) # Отправляем фразу. data = s.recv(1024) #Получаем данные из сокета. s.close()

Простой http сервер.¶

Любой online-сервис начинается с того, что необходимо приложение, которое способно принимать и обрабатывать http-запросы.

В python есть встроенный модуль, который полвзоляет создавать простой http-сервер.

from http.server import BaseHTTPRequestHandler from http.server import HTTPServer def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler): server_address = ('', 8000) httpd = server_class(server_address, handler_class) try: httpd.serve_forever() except KeyboardInterrupt: httpd.server_close() 

Если запустить функцию run() , то будет запущен http-сервер, и если в браузере Вы введете 127.0.0.1:8000 , то Вам вернутся ответ, но ответ будет содержать ошибку, потому что сервер не знает как обрабатывать запросы.

Для того что бы исправить эту ошибку трубется в обработчике( BaseHTTPRequestHandler ) реализовать метод по обработке GET-запросов:

class HttpGetHandler(BaseHTTPRequestHandler): """Обработчик с реализованным методом do_GET.""" def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(''.encode()) self.wfile.write('Простой HTTP-сервер.'.encode()) self.wfile.write('Был получен GET-запрос.'.encode()) 

Теперь, если запустить сервер с новым обработчиком run(handler_class=HttpGetHandler) , то при переходе по адресу 127.0.0.1:8000 можно будет увидеть ответ на запрос.

Обратите внимание, что при формировании ответа обработчика был использован метод encode() у строк. Сделано этого потому что в теле ответа могут быть использованы только байтовые строки.

Задания¶

  1. Ознакомьтесь с описанием протокола HTTP.
  2. Дополните обработчик запросов таким образом, что бы он мог обрабатывать запросы по методам POST, PUT и HEAD. Для проверки реализации используйте библиотку requests.

© Copyright Revision d00c0df4 .

Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest

Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.

Простой веб-сервер с использованием Python и Flask

Александр Менщиков

Существует множество способов поднять свой собственный веб-сервер, который будет обрабатывать HTTP запросы пользователей и возвращать им в браузеры результат.

Поскольку мы используем Python в качестве основного языка, библиотеку, упрощающую нам создание веб-сервера, выберем тоже из мира Python.

Flask — это инструмент для веб-сайтов на языке Python. Представляет из себя микрофреймворк со встроенным веб-сервером. Договоримся, что вы используете Linux в качестве операционной системы, либо знаете как выполнить аналоги команд в Windows.

Установка необходимых библиотек

В предыдущей статье вы уже установили и настроили python, pip и virtualenv. Осталось загрузить сам Flask:

pip install flask

Если вы желаете работать с виртуальными окружениями, перейдите в директорию с ним и выполните команду:

source venv/bin/activate

Чтобы проверить все ли правильно установилось, вы можете создать файл server.py со следующим содержимым:

from flask import Flask app = Flask(__name__) @app.route(«/») def hello(): return «Hello World!» if __name__ == «__main__»: app.run()

Выполнить его можно командой:

python server.py

По умолчанию, Flask работает на порту 5000. Перейдите по адресу http://localhost:5000 в браузере. Если вы все сделали правильно, на экране отобразится надпись «Hello World!».

Flask позволяет делать много замечательных вещей, например, обрабатывать GET и POST параметры. Более подробно можно ознакомиться со всеми функциями в официальной документации:

Модифицируем скрипт таким образом, чтобы он принимал имя пользователя и выводил на экран приветствие:

from flask import Flask app = Flask(__name__) @app.route(«/<username>», methods=[‘GET’]) def index(username): return «Hello, %s!» % username if __name__ == «__main__»: app.run(host=’0.0.0.0′, port=4567)

Теперь скрипт будет работать на 4567 порту, а также принимать от пользователя имя в адресной строке. Перейдите в браузере по ссылке: http://localhost:4567/yourname Вы увидите ответ: «Hello, yourname». Это значит, что сервер успешно работает и возвращает ожидаемую строку.

Настраиваем прокси

Чтобы ваш сайт был доступен другим людям, нужно иметь внешний IP адрес. Если вы знаете, что это такое или у вас есть VPS, вы можете настроить все самостоятельно. Если же вы слышите эти слова первый раз — воспользуйтесь более простым, хотя и не очень универсальным методом, который хорошо описан тут. Суть данного метода заключается в использовании прокси сервера.

В качестве прокси, будем использовать бесплатную программу ngrok. Ее главная задача — держать постоянное соединение и доставлять вам всю полученную от любого человека информацию. Запустите ее командой, передав в качестве параметра любой свободный порт:

./ngrok http 4567

В ответ вы получите несколько строчек информации, среди которой будет нечто подобное:

Forwarding http://7e9ea9dc.ngrok.io -> 127.0.0.1:4567

Адрес http://7e8ea9dc.ngrok.io можете смело пересылать своим друзьям, пройдя по нему, они попадут на ваш сайт.

If you like this article, share a link with your friends

Read more

We talk about interesting technologies and share our experience of using them.

Как сделать веб сервер на python

В статье содержится руководство по первичной настройке инфраструктуры сервера для хостинга web–сайтов на основе Debian 11, разработанных с использованием Python.
Получаемое окружение предназначено для использования в процессе разработки, но, с некоторыми оговорками, может использоваться и в production–режиме.

  1. сайт, размещаемый на сервере имеет название mysite.com ;
  2. команды начинающиеся с символа # выполняются с root –правами;
  3. читатель обладает базовыми знаниями о Linux и предназначении используемого ПО, а также может самостоятельно восполнить пробелы из документации; в связи с этим в тексте опущены пояснения «очевидных» моментов.

Обновление дистрибутива, локаль и пользователь

При первом подключении к серверу необходимо.

  1. Обновить пакеты дистрибутива:
# apt-get update; apt-get upgrade 
  1. Добавить русскоязычную локаль:
# dpkg-reconfigure locales 

В появившемся окне выбора локалей и их кодировок нужно выбрать en-us.UTF-8 и ru_RU.UTF-8 . По умолчанию ставим en-us.UTF-8 .

  1. Перезагрузить сервер:
# reboot 
  1. Добавить пользователя admin , от имени которого будут запускаться приложения:
# adduser admin 

ssh

Для доступа по ssh будет использоваться сертификат, поэтому если его нет, нужно предварительно его создать.

После получения сертификата в /home/admin :

mkdir .ssh cd .ssh nano authorized_keys 

В открывшемся редакторе вставляем публичную часть ключа пользователя, которая выглядит примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCv5rWbJVspLpviY4. 9ILXJOxIKpHH0luUiTQcVaRqyTYt1 p.menshih@gmail.com 

Далее редактируем конфигурационный файл демона ssh:

# nano /etc/ssh/sshd_config 

Минимальное содержимое конфига:

AuthorizedKeysFile .ssh/authorized_keys ClientAliveCountMax 10000 ClientAliveInterval 60 PasswordAuthentication no PermitRootLogin no PubkeyAuthentication yes Subsystem sftp /usr/lib/openssh/sftp-server TCPKeepAlive yes UsePAM yes 
# systemctl restart ssh 

Если все сделано правильно и ssh–клиент настроен корректно, можно отключиться от сервера и переподключиться с использованием сертификата.

Смена имени хоста

Ясно определенное имя хоста (например, mysite.com ) отображается в приглашении консоли и, когда консолей много, снижает риск выполнения каких-либо команд не на той машине.

Для изменения имени необходимо отредактировать файл hostname :

# nano /etc/hostname 

В открывшемся редакторе пишем новое имя хоста.

После перезагрузки сервера в приглашении консоли появится новое имя.

TLS сертификат

Для получения валидного TLS–сертификата можно воспользоваться утилитой Certbot от сервиса Let’s Encrypt.

Документация по установке находится на официальном сайте.

Для корректной работы сайта необходимо получить сертификат на домен mysite.com :

certbot certonly --standalone -d mysite.com 

nginx

Документация по установке находится на официальном сайте.

После установки нужно удалить конфигурационный файл по умолчанию и создать конфигурационный файл сайта /etc/nginx/conf.d/mysite.com.conf :

# cd /etc/nginx/conf.d # rm -rf default.conf # nano mysite.com.conf 
# Обработка 80-го порта для домена mysite.com. server < listen 80; server_name mysite.com; return 301 https://mysite.com$request_uri; ># 443 порт для mysite.com. server < listen 443 ssl http2; server_name mysite.com; # Пути к используемым сертификатам. ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; # Логирование запросов. access_log /var/log/nginx/mysite.com_access.log combined; error_log /var/log/nginx/mysite.com_error.log error; # Проксирование всех запросов на локальный порт 8000. location / < proxy_http_version 1.1; proxy_pass http://127.0.0.1:8000; >> 

Обратите внимание, что описанная конфигурация:

  1. предполагает использование сайта только по SSL;
  2. Для проксирования запросов от сайта используется порт 8000, который будет указан позже в конфигурации gunicorn.

После проверки конфигурационного файла с помощью команды:

# nginx -t 

сервер необходимо запустить командой:

# systemctl start nginx 

Python

Для установки и управления нужными версиями Python используется pyenv .

Документация по установке находится на официальном сайте. В случае с сервером рекомендуется установить pyenv с помощью pyenv-installer для пользователя admin .

После установки pyenv необходимо обновить переменные окружения для используемого терминала и установить зависимости для сборки Python.

После установки зависимостей нужную версию Python можно установить командой:

pyenv install X.Y 

где X.Y — версия Python, например 3.11 .

Напоследок нужную версию Python нужно сделать глобальной:

pyenv global X.Y 

Служба systemd для gunicorn

Gunicorn — WSGI HTTP–сервер для запуска приложений, созданных на Python. Используется в качестве прослойка между nginx и приложением cайта.

Прежде всего необходимо установить gunicorn. Сделать это можно в виртуальном окружении вашего проекта:

(venv) $ pip install gunicorn 

Далее создаем директории и файл службы для systemd:

mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/gunicorn.service 

Содержимое ~/.config/systemd/user/gunicorn.service (предполагается, что приложение сайта находится в папке /home/admin/mysite.com ):

[Unit] After=network.target Description=gunicorn daemon [Service] WorkingDirectory=/home/admin/mysite.com/ ExecStart=/home/admin/venv/bin/gunicorn -b 127.0.0.1:8000 mysite.wsgi:application Restart=always [Install] WantedBy=multi-user.target 
systemctl --user enable gunicorn.service 
systemctl --user start gunicorn.service 

Важно!
Systemd останавливает все службы пользователя после закрытия последней сессии.
Таким образом после закрытия всех соединений с сервером gunicorn перестанет работать.
Чтобы подобного не происходило, нужно выполнить следующую команду от имени root :

# loginctl enable-linger admin 

PostgreSQL

Руководство по установке на официальном сайте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *