Как извлечь данные из входящего HTTP POST с помощью Python - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть веб-сервер Ubuntu LAMP, и данные непрерывно отправляются на веб-сервер методом HTTP POST.Мне нужно извлечь данные из HTTP POST и вставить их в базу данных.Я не знаю, как это сделать.Существует множество примеров того, как обрабатывать исходящий запрос HTTP POST, но входящий запрос HTTP POST.Я хочу написать скрипт на python3, который будет извлекать данные из входящего HTTP-запроса POST и сохранять их как переменные, которые я буду использовать для вставки данных в базу данных, а также для возврата ответа клиенту. Кто-нибудь может мне помочь в этом отношении?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

@ oetoni, я получаю ошибку тайм-аута при использовании:

#!/usr/bin/python3
import socketserver
from http.server import BaseHTTPRequestHandler
import time
import threading


def do_something(site_id, first, last, pass1):
    print(site_id)
    print(first)
    print(last)
    print(pass1)
    #just to illustrate the point and print the variables


class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):    # !important to use 'do_POST' with Capital POST
        global site_id, first, last, pass1  #those are still undefined at the module level ;) remember this for later
        if self.path == '/do_something':

            request_headers = self.headers

            site_id = request_headers["m_site_name"]
            first = request_headers["m_first_name"]
            last = request_headers["m_last_name"]
            pass1 = request_headers["m_device_name"]

            do_something(site_id, first, last, pass1)
        self.send_response(200)
        self.end_headers()             #as of P3.3 this is required

try:
    httpd = socketserver.TCPServer(("localhost", 9001), MyHandler)
    httpd.serve_forever()
finally:
    httpd = socketserver.TCPServer(("localhost", 9001), MyHandler)
    httpd.server_close()

Но я получаю правильный ответ при использовании этого кода:

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

import cgi
import cgitb
cgitb.enable()

print('Content-Type: text/html')
print('')

arguments = cgi.FieldStorage()
for i in arguments.keys():
        print(arguments[i].value)

и распечатывает полученные данные в веб-браузере. Я использую этот скрипт как скрипт cgi на веб-сервере apache, доступ к которому можно получить через веб-браузер. Я не запускаю этот скрипт в качестве службы или приложения.

0 голосов
/ 22 ноября 2018
#!/usr/bin/python3

# -*- coding: UTF-8 -*-

import cgi
import cgitb
cgitb.enable()

print('Content-Type: text/html\n')
arguments = cgi.FieldStorage()
print(arguments["m_site_name"].value)
print("<br />\n")
print(arguments["m_first_name"].value)
print("<br />\n")
print(arguments["m_last_name"].value)
print("<br />\n")
print(arguments["m_device_name"].value)
print("<br />\n")
site = arguments["m_site_name"].value
first = arguments["m_first_name"].value
last = arguments["m_last_name"].value
device = arguments["m_device_name"].value
-----do_other_things_with_the_variables(site,first,last,device)-----

Этот код решил мою проблему. Теперь я могу хранить данные HTTP POST в переменных с помощью этого скрипта Python CGI.

мой запрос HTTP POST: http://your_server_url_or_IP/cgi-bin/python_script.py?m_site_name=MySite&m_first_name=anyname&m_last_name=anylastanme&m_device_name=anydeviceidorname

0 голосов
/ 17 ноября 2018

ОБНОВЛЕНИЕ

В соответствии с кодом, который вы разместили ниже, вот рабочий ответ.

#!/usr/bin/python3
import socketserver
from http.server import BaseHTTPRequestHandler
import time
import threading


def do_something(site_id, first, last, pass1):
    print(site_id)
    print(first)
    print(last)
    print(pass1)
    #just to illustrate the point and print the variables


class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):    # !important to use 'do_POST' with Capital POST
        global site_id, first, last, pass1  #those are still undefined at the module level ;) remember this for later
        if self.path == '/do_something':

            request_headers = self.headers

            site_id = request_headers["m_site_name"]
            first = request_headers["m_first_name"]
            last = request_headers["m_last_name"]
            pass1 = request_headers["m_device_name"]

            do_something(site_id, first, last, pass1)
        self.send_response(200)
        self.end_headers()             #as of P3.3 this is required

try:
    httpd = socketserver.TCPServer(("localhost", 9001), MyHandler)
    httpd.serve_forever()
finally:
    httpd = socketserver.TCPServer(("localhost", 9001), MyHandler)
    httpd.server_close()

Звонок с почтальоном enter image description here

и вывод командной строки:

C:\Development\Python\test\venv\Scripts\python.exe C:/Development/Python/test/webserver_old.py
1001
jyoti0
127.0.0.1 - - [19/Nov/2018 21:53:45] "POST /do_something HTTP/1.1" 200 -
jyoti1
101

Здесь я соединил ответы из них: Ссылка один , два и третий И это также очень важно прочитать: https://docs.python.org/3/library/http.server.html

http.server не рекомендуется для производства.Он реализует только базовые проверки безопасности.

Я считаю, что это нормально для небольшой реализации и некоторого тестирования или подтверждения концепции, но в конечном итоге вам придется справиться с этим лучше, может быть, я могу предложить вам потратитьНекоторое время и использование Flask на самом деле является превосходной и очень легкой структурой для создания и создания прототипов Python API.

-

Предыдущий ответ (устарело и обновлено выше)

-

Согласно очень легкой и простой ссылке на this one:

def do_POST(self):
        # Doesn't do anything with posted data
        content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
        post_data = self.rfile.read(content_length) # <--- Gets the data itself
        self._set_headers()
        self.wfile.write("<html><body><h1>POST!</h1></body></html>")

Update (без API и API):

Предполагается, что вы работаете на компьютере или работаете на нестандартном порте с настраиваемой конечной частью по URL, тогда «чистый» python будет выглядеть так:

import SocketServer
from BaseHTTPServer import BaseHTTPRequestHandler

def doSomething():
    print "i did"

class MyHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path == '/doSomething':
            mail = self.request.POST.get('email')
            something = self.request.POST.get('something')

            doSomething()
        self.send_response(200)

httpd = SocketServer.TCPServer(("", 8080), MyHandler)
httpd.serve_forever()

Я предполагаю, что такВы можете использовать переменные свободно.Проверьте также эту ссылку здесь , ответ Бренды.

...