#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