HTTP-сервер Python не отвечает на запросы POST и GET

#python #http

#python #http

Вопрос:

Мне нужно создать HTTP-сервер, который обрабатывает запросы Get и Post с помощью HTML-страницы. Я хочу, чтобы имя и фамилия были отправлены в Post-запросе на сервер, а затем отображались на экране с запросом Get. Я создал HTML-страницу и создал HTTP-сервер. Однако я не уверен, как заставить все подключиться. Я продолжаю получать ошибки. Ошибка, которую я получаю в настоящее время: Код ошибки: 501

Сообщение: неподдерживаемый метод (‘POST’).

Объяснение кода ошибки: HttpStatus.NOT_IMPLEMENTED — сервер не поддерживает эту операцию.

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

 import http.server
import socketserver

PORT = 8080
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
  

Комментарии:

1. используйте фреймворк Flask , Django , Bottle или аналогичный для создания веб-страницы. Это будет проще.

2. этот код не поддерживается POST , потому что каждый POST может отправлять разные данные, и серверы не будут знать, что делать с этими данными. Вы должны написать собственный класс Handler с методом post . Это должно быть в документации.

Ответ №1:

Вы должны создать собственный Handler метод with do_POST

 import http.server
import socketserver

class MyHandler(http.server.BaseHTTPRequestHandler):

    def do_POST(self):
        print("POST received")

        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("Hello World".encode('utf-8'))


PORT = 8080
Handler = MyHandler#http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()
  

Я протестировал его с

 import requests

r = requests.post('http://localhost:8080')
print(r.text)
  

Я не знаю, как получить значения, отправленные в POST-запросе — мне никогда не приходилось его использовать.

Это проще сделать с помощью Flask, Django, Bottle и т. Д.


РЕДАКТИРОВАТЬ: то же самое с Flask. Также показано, как получать отправленные значения и использовать их в ответ.

 from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        print(request.form['name'], request.form['last_name'])
        return "Hello "   request.form['last_name']
    return "Hello World"

app.run(port=8080)
  

Протестировано с

 import requests

form = {'name': 'James', 'last_name': 'Bond'}

r = requests.post('http://localhost:8080', data=form)

print(r.text) # Hello Bond