Параметр в маршруте с локальной переменной Flask, на которую ссылаются перед назначением

#python #flask

Вопрос:

Я пытаюсь обработать параметры в пути маршрутизации в Flask:

 @app.route('/example/<id>', methods=['GET'])
def tasks(id):

    if id == 1:
        obj = FirstTask()
    elif id == 2:
        obj = SecondTask()
    elif id == 3:
        obj = ThirdTask()

    result = obj.start()
    
    return make_response(jsonify({ 'data': { result } }), 200)
 

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

«локальная переменная ‘obj’, на которую ссылаются перед назначением»

Я никогда не программировал на Python и не знаю, как это решить.

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

1. Когда вы звонили obj.start() , obj еще не было определено, потому что ни одно из ваших утверждений if не было оценено как истинное. Другими словами, ни одно из ваших obj = Task() заявлений не было названо. Определите obj перед «если» или в «еще».

Ответ №1:

Это потому, что obj не определен в вашей логике оператора if. Может быть, добавить else и проверить, нет ли ничего подобного:

 @app.route('/example/<id>', methods=['GET'])
def tasks(id):

    if id == 1:
        obj = FirstTask()
    elif id == 2:
        obj = SecondTask()
    elif id == 3:
        obj = ThirdTask()
    else:
        obj = None

    if obj is not None:
        result = obj.start()
    
        return make_response(jsonify({ 'data': { result } }), 200)
 

Ответ №2:

У вас есть две ошибки, работающие согласованно:

  1. Вы сравниваете яблоки с апельсинами, то есть строки с целыми числами.
  2. Вы не обрабатываете недопустимые id s.

Решение для первого-добавить конвертер в маршрут ( int: ), решение для второго-добавить else :

 from flask import abort

@app.route('/example/<int:id>', methods=['GET'])
def tasks(id):

    if id == 1:
        obj = FirstTask()
    elif id == 2:
        obj = SecondTask()
    elif id == 3:
        obj = ThirdTask()
    else:
        abort(404)

    result = obj.start()
    
    return make_response(jsonify({ 'data': { result } }), 200)