Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 Первый и самый примитивный сервер и клиент на питоне  [new]
black-manatee
Member

Откуда:
Сообщений: 79
Добрый вечер.

Помогите, пожалуйста со следующей проблемой.
Мне необходимо написать на питоне сервер и клиент для обработки POST запросов.
Я перерыл весь интернет и не могу даже написать самый примитивный сервер.

Вот клиент из трех строчек.

import requests
resp = requests.post("https://127.0.0.1:8080", {})
print(resp.text)

Если я в качестве адреса подставляю "https://httpbin.org/post", то все работает без проблем.


А вот сервер:

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.wfile.write(b"Hello !!!")
        return

httpd = HTTPServer(('127.0.0.1', 8080), SimpleHTTPRequestHandler)
httpd.serve_forever()


Если я в клиенте подставляю "https://127.0.0.1:8080", то на сервере получаю ошибку

127.0.0.1 - - [12/Oct/2021 22:39:46] code 400, message Bad request version ("\x15AU?e\x14\x12oGE\x9b\x1ai\x8b¶Ga?a?C\x05A\x99\x9cBUi|A\x9cC\x00V\x13\x02\x13\x03\x13\x01A,A0A+A/I©I?\x00\x9f\x00\x9eI?A?A\xadA®A¬A$A(A#A'A")
127.0.0.1 - - [12/Oct/2021 22:39:46] "

а на клиенте

requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=8080): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)')))

Если же вместо https использую http, то в сервере получаю

Traceback (most recent call last):
File "D:\work_scool\05\homework\dz\03_oop\homework\test1.py", line 11, in <module>
httpd.serve_forever()
File "C:\Users\animal\AppData\Local\Programs\Python\Python39\lib\socketserver.py", line 232, in serve_forever
ready = selector.select(poll_interval)
File "C:\Users\animal\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 324, in select
r, w, _ = self._select(self._readers, self._writers, [], timeout)
File "C:\Users\animal\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 315, in _select
r, w, x = select.select(r, w, w, timeout)
KeyboardInterrupt

А на клиенте

raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine('Hello !!!'))



Помогите, пожалуйста, мне бы только начать. Первый сервер и первый клиент.
12 окт 21, 22:50    [22382882]     Ответить | Цитировать Сообщить модератору
 Re: Первый и самый примитивный сервер и клиент на питоне  [new]
iot
Member

Откуда: Moscow
Сообщений: 40
black-manatee,

Добрый день.
попробуйте так https://gist.github.com/dergachev/7028596
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl, os
os.system("openssl req -nodes -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=mylocalhost'")
port = 443
httpd = HTTPServer(('0.0.0.0', port), SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, keyfile='key.pem', certfile="cert.pem", server_side=True)
print(f"Server running on https://0.0.0.0:{port}")
httpd.serve_forever()
13 окт 21, 11:24    [22383042]     Ответить | Цитировать Сообщить модератору
 Re: Первый и самый примитивный сервер и клиент на питоне  [new]
maxkar
Member

Откуда:
Сообщений: 173
black-manatee
Помогите, пожалуйста, мне бы только начать. Первый сервер и первый клиент.


HTTP протокол все же нужно соблюдать. Статусную строку и заголовки ведь тоже надо выводить.

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        self.send_response(200)
        self.send_header('Content-Type', 'application/binary')
        self.end_headers()
        self.wfile.write(b"Hello !!!")
        return


На опечтаки не проверял. Заголовков может быть и больше, и меньше, чем в примере. Они все идут после статуса и до end_headers.
13 окт 21, 19:59    [22383326]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить