Я не могу найти проблему с регистрацией переменных.
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>
Причина, по которой 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
а затем возвращает другой шаблон, например, страницу с ошибкой или что-то еще.