Представление Flask создает DataFrame, но по-прежнему вызывает «UnboundLocalError: локальная переменная« df », на которую ссылаются до назначения»

1

Я не могу найти проблему с регистрацией переменных.

Jinja2 показать мне:

builtins.UnboundLocalError UnboundLocalError: локальная переменная 'df', на которую ссылаются перед назначением

Когда я пытаюсь добавить: global df после определения функции Flask сказал мне, что variable is not definied.

@app.route("/<stop_id>")
def show_table(stop_id):
    stops = pd.read_csv('stops.csv', header=0, usecols=[1, 2])
    chosen_stop = stops['stop_name'] == stop_id
    output_stops = (stops[chosen_stop])
    stop_codes = tuple(output_stops['stop_code'])
    for i, j in enumerate(stop_codes):
        specific_url = URL + str(j)
        response = requests.get(specific_url, auth=HTTPDigestAuth(USERNAME, PASSWORD), verify=False)
        if len(response.content) > 0:
            data = response.json()
            df = pd.DataFrame.from_dict(data, orient='columns')
    return render_template('view.html', tables=[pd.DataFrame.to_html(df, index=False)])


if __name__ == "__main__":
    app.run(debug=True)

HTML:

<div class=page>
  <h1>Project</h1>
  {% for table in tables %}
    {{ table|safe }}
  {% endfor %}
</div>
Теги:
pandas

1 ответ

2
Лучший ответ

Причина, по которой df не определена, заключается в том, что она не определена в области, которую вы пытаетесь использовать. Вы создаете переменную df в этой строке

df = pd.DataFrame.from_dict(data, orient='columns')

Но эта переменная df является переменной, которая будет доступна только для чего-либо внутри оператора if.

if len(response.content) > 0:
    data = response.json()
    df = pd.DataFrame.from_dict(data, orient='columns')

Попробуйте следующее, которое просто изменяет область действия переменной, доступной для функции render_template, которую вы вызываете.

@app.route("/<stop_id>")
def show_table(stop_id):
    stops = pd.read_csv('stops.csv', header=0, usecols=[1, 2])
    chosen_stop = stops['stop_name'] == stop_id
    output_stops = (stops[chosen_stop])
    stop_codes = tuple(output_stops['stop_code'])
    df = None
    for i, j in enumerate(stop_codes):
        specific_url = URL + str(j)
        response = requests.get(specific_url, auth=HTTPDigestAuth(USERNAME, PASSWORD), verify=False)
        if len(response.content) > 0:
            data = response.json()
            df = pd.DataFrame.from_dict(data, orient='columns')
    return render_template('view.html', tables=[pd.DataFrame.to_html(df, index=False)])

Однако вы, вероятно, должны сделать какую-то проверку, чтобы узнать, является ли значение df None а затем возвращает другой шаблон, например, страницу с ошибкой или что-то еще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню