Как анализировать POST-запросы с кодировкой x-www-form-urlencode?Python

Программы на Python
Anonymous
Как анализировать POST-запросы с кодировкой x-www-form-urlencode?

Сообщение Anonymous »

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

Код: Выделить всё

POST / HTTP/1.1
Host: example.com
Accept: */*
Content-Length: 264
Content-Type: application/x-www-form-urlencoded
User-Agent: Arma Reforger/1.1.0.42 (Headless; Windows)
{"token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","events":[{"name":"serveradmintools_conflict_base_captured","title":"Base André's Beacon captured by Soviet Army","data":{"faction":"Soviet Army","base":"André's Beacon"},"timestamp":1716526768}]}
Я использую Postman для имитации этих запросов с использованием тех же заголовков HTTP, поскольку я тестирую локально. Я пробовал анализировать эти запросы разными способами и не смог получить желаемые результаты. Два ближайших решения, которые я нашел, следующие:
1.) Первая попытка использовать request.get_data() и снять кавычки:

Код: Выделить всё

from flask import Flask, request
from urllib.parse import unquote

app = Flask(__name__)

@app.route('/', methods=['POST'])
def events():
requestData = request.get_data()
eventData = unquote(requestData) # works but replaces first colon with equals sign?
return eventData

if __name__ == '__main__':
app.run(debug=True)
Результаты, которые я вижу в Postman, выглядят следующим образом (обратите внимание, как первое двоеточие в строке JSON заменяется знаком равенства. Я не могу понять, почему это происходит для жизнь моя):

Код: Выделить всё

{"token"="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","events":[{"name":"serveradmintools_conflict_base_captured","title":"Base André's Beacon captured by Soviet Army","data":{"faction":"Soviet Army","base":"André's Beacon"},"timestamp":1716526768}]}
2.) Вторая попытка использования request.form:

Код: Выделить всё

from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=['POST'])
def events():
eventData = request.form
return eventData

if __name__ == '__main__':
app.run(debug=True)
Но результаты в Postman выглядят следующим образом (обратите внимание на дополнительные экранированные двойные кавычки и некоторые символы, отображаемые неправильно). Мне удалось исправить проблему с отображением символов, и я мог бы использовать регулярное выражение или замену строки, чтобы удалить лишние экранированные двойные кавычки, но почему они там вообще и есть ли лучший способ сделать это?) :

Код: Выделить всё

{
"{\"token\"": "\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"events\":[{\"name\":\"serveradmintools_conflict_base_captured\",\"title\":\"Base Andr\u00e9's Beacon captured by Soviet Army\",\"data\":{\"faction\":\"Soviet Army\",\"base\":\"Andr\u00e9's Beacon\"},\"timestamp\":1716526768}]}"
}

Я просто хочу проанализировать отправленные данные POST как JSON, чтобы затем вставить их в базу данных. Как мне это сделать правильно? Я пробовал такие вещи, как request.get_json(force=True) и json.loads(), но он терпит неудачу с ошибками о недопустимом JSON (хотя запуск строки JSON через валидатор говорит, что она действительна).
Вот скриншоты заголовков и тела запроса в Postman:
Тело POST-запроса в Postman
Заголовки HTTP-запроса в Postman
Любая помощь приветствуется! :)

Подробнее здесь: https://stackoverflow.com/questions/785 ... t-requests

Вернуться в «Python»