#python #pandas #flask #url-routing
#python #pandas #flask #url-маршрутизация
Вопрос:
Я новичок в flask, и мне нужно пошаговое объяснение (если возможно) о том, как добавить гиперссылку маршрутизации ко всем моим значениям в столбце ID в моей view.html
таблице.
Я попытался добавить интерактивный URL-адрес в столбец pandas, но, похоже, это не работает. Мне нужно перейти к /templates/ids/.html из каждого значения в столбце ID в таблице, отображаемого в view.html
Сможет ли кто-нибудь объяснить, как это можно сделать шаг за шагом? Спасибо за ваше понимание и помощь!
my.csv
date,ID,Name,Value1,Value2,Value3
01-09-2020,1,ACME,0,0,0
02-09-2020,1,ACME,0,0,0
app.py
from flask import *
import pandas as pd
app = Flask(__name__)
@app.route('/ids/<id>')
def landing_page(id):
return print("Hello World" <ID>)
@app.route("/")
def show_home():
data = pd.read_csv("/path/my.csv", quotechar='"')
def make_clickable(val):
return '<a href="{{ url_for('templates', filename='ids/<ID>.html') }}">{<ID>}</a>'.format(val,val)
data['ID'].style.format(make_clickable)
data.set_index(['ID'], inplace=True)
data.index.ID=None
myId = data.loc[data.Item=='Sword']
return render_template('view.html',tables=[myId.to_html(classes='sword')],
titles = ['na', 'Sample title'])
if __name__ == "__main__":
app.run(debug=True)
view.html
<!doctype html>
<title>Project</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='styles/style.css') }}">
<div class=page>
<h1>My header</h1>
{% for table in tables %}
<h2>{{titles[loop.index]}}</h2>
{{ table|safe }}
{% endfor %}
</div>
желаемый результат в view.html:
Комментарии:
1. Это выглядит очень сложным для того, что вы, наконец, хотите показать. Не могли бы вы привести какой-нибудь пример вашего конечного результата (html)? Я уверен, что для этого есть гораздо более простые решения, за исключением случаев, когда вы намеренно хотите, чтобы это было настолько сложным
2. вам нужно поместить ссылку href в цикл вашего шаблона. Jinja не заменяет дополнительные переменные внутри переменных (есть способы предварительной обработки, но это было бы бессмысленно). Следуйте инструкциям flask, чтобы понять, как работают Flask и Jinja
3. Привет, арчер, я определенно стремлюсь сделать это как можно проще, но поскольку у меня очень мало знаний о flask, я, вероятно, делаю это неправильно… Я добавил желаемый результат и свой формат.csv. Не могли бы вы помочь с этим? Спасибо!
4. Cfreak Я просмотрел документы flask, но я думаю, что мне все еще нужно пошаговое руководство, если это возможно…
Ответ №1:
Попробуйте следующий способ. Дайте мне знать, если это сработает. Одно замечание: измените папку с файлами id на статическую и поместите их туда, потому что файл templates выдает ошибку и требует дополнительной работы
Ваш app.py
from flask import *
import pandas as pd
app = Flask(__name__)
@app.route('/ids/<id>')
def landing_page(id):
return print("Hello World" <ID>)
@app.route("/")
def show_home():
data = pd.read_csv("/path/my.csv", quotechar='"')
return render_template('view.html', data=data, cols=data.columns)
if __name__ == "__main__":
app.run(debug=True)
view.html
<!doctype html>
<title>Project</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='styles/style.css') }}">
<div class=page>
<h1>My header</h1>
<table>
<th>
{% for i in cols %}
<td> {{i}} </td>
{% endfor %}
</th>
{% for k in range(data|length) %}
<tr>
<td> <a href="{{ url_for('static', filename='ids/' data.iloc[k,0]|string) }}"> {{data.iloc[k,0]}} </a> </td>
{% for j in cols[1:] %}
<td> {{data.iloc[k][j]}} </td>
{% endfor %}
</tr>
{% endfor %}
</table>
</div>
Комментарии:
1. большое спасибо, Арчер! Теперь это работает для меня! Мне просто нужно было добавить
.html
в эту строку:<td> <a href="{{ url_for('static', filename='ids/' data.iloc[k,0]|string) '.html' }}"> {{data.iloc[k,0]}} </a> </td>
2. Отлично! Рад это слышать