Flask маршрутизирует пропущенные аргументы, которые уже заданы

#flask #routes

#flask #маршруты

Вопрос:

Я пытаюсь вызвать следующий маршрут:

 @bp.route("/notify/<user_id>/<title>/<message>",
methods=["POST"])
def trigger_notification(user_id, title, message):
    data = request.get_json() or {}
    # do_somthing_by_data
 

Я вызвал маршрут с помощью httpie:

 http POST http://127.0.0.1:5000/api/notify/b2bbbf67956c3db9/title/message_txt 
 

Но я получил следующие ошибки:

 TypeError: notify() missing 3 required positional arguments: 'user_id', 'title', and 'message'
 

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

1. Имя функции для вашего маршрута — trigger_notification but, вы получаете ошибку для функции с именем notify . Где вы определяете notify и где вы его вызываете?

2. Не могли бы вы дать немного больше контекста для примера кода, пожалуйста? Я предполагаю, что что-то в другом месте вызывает эту ошибку

3. Спасибо @MattKeane amp; @tsamaya, ваши комментарии действительно помогают. Ошибка была в data переменной, которая была пустой dict в моем вызове. правильный вызов http POST url user_id=user_id title=title message=my_message . или рефакторинг функции маршрута.

Ответ №1:

Следующий пример отлично работает на моей стороне:

Использование Flask v1.1.2.

app.py

 from flask import Flask
from flask import request

app = Flask(__name__)


@app.route("/notify/<user_id>/<title>/<message>", methods=["POST"])
def trigger_notification(user_id, title, message):
    print ("{} {} {}".format(user_id, title, message))
    data = request.get_json() or {}
    return data
 

Проверено с

 curl -X POST http://localhost:5000/notify/user/title/message 
    -d '{"body":"some data"}' 
    -H 'Content-Type: application/json'
 

Он выводит

                                                                                                     
(65050335) ➜  65050335 flask run
 * Serving Flask app "app.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL C to quit)
user title message
127.0.0.1 - - [28/Nov/2020 14:11:30] "POST /notify/user/title/message HTTP/1.1" 200 -
 

и он возвращает

 {"body":"some data"}