Как я могу отобразить столбец ID в качестве гиперссылки маршрутизации в приложении flask?

#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. Отлично! Рад это слышать