Считать на сервере параметр post - запроса
Пишу простенький http сервер на python используя библиотеки BaseHTTPRequestHandler и HTTPServer и столкнулся с проблемой. Мне нужно в пост запросе передать атрибут, который определяет поведение на сервере. То есть например при переданном атрибуте 1, данные записываются в базу1, а при переданном атрибуте2, данные записываются в базу2.
Я пытаюсь это реализовать при помощи параметров data, и params, при передаче запроса.
res = requests.post(url, data = "aaa", params = 1)
Параметр data у меня считать получилось при помощи такого выражения:
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
Код функции:
def do_POST(self):
self.send_response(200)
self.send_header("Content-type", "text/html")
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
Как считать данные из params???
Ответы (1 шт):
Параметры из запроса нужно извлекать из url, в BaseHTTPRequestHandler он доступен через свойство path. А чтобы распарсить url используем функции модуля urllib.parse
Пример:
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlparse, parse_qs
class HttpProcessor(BaseHTTPRequestHandler):
def do_POST(self):
print(self.path)
result = urlparse(self.path)
print(result)
print(parse_qs(result.query))
length = int(self.headers['Content-Length'])
post_data = self.rfile.read(length).decode('utf-8')
print('post_data:', post_data)
self.send_response(200)
self.end_headers()
self.wfile.write(bytes("Ok!", 'utf-8'))
if __name__ == '__main__':
server = HTTPServer(("localhost", 80), HttpProcessor)
server.serve_forever()
Тестируем:
import requests
rs = requests.post('http://127.0.0.1', data='1234', params=dict(abc=123, name="Foo", value=True))
print(rs)
print(rs.content)
Результат на сервере:
/?abc=123&name=Foo&value=True
ParseResult(scheme='', netloc='', path='/', params='', query='abc=123&name=Foo&value=True', fragment='')
{'abc': ['123'], 'name': ['Foo'], 'value': ['True']}
post_data: 1234