Как маршрутизировать несколько элементов навигации в одной папке с помощью flask

#python #flask

#python #flask

Вопрос:

Я разрабатываю туристический веб-сайт с использованием flask. У меня есть папка destinations с названиями городов. При нажатии на выпадающий элемент навигации появляются эти города, и при нажатии на город страница должна быть перенаправлена в соответствующий город. Код навигации выглядит следующим образом;

 <li><a href="#">Destinations</a>
  <ul class="nav-dropdown">
   <li><a href="destinations/london">London</a></li>
   <li><a href="destinations/paris">Paris</a></li>
   <li><a href="destinations/newyork">New York</a></li>
   <li><a href="destinations/moscow">Moscow</a></li>
   <li><a href="destinations/vegas">Las Vegas</a></li>
   <li><a href="destinations/pataya">Pataya</a></li>
  </ul>
</li>
 

The demo.py код выглядит следующим образом;

 from flask import Flask, render_template

@app.route('/destinations/{id}', methods = ['GET'])
def destinations(id):
    page = 'destinations/' id '.html'
    return render_template(page)
 

Как правильно маршрутизировать эти страницы?

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

1. Почему вы думаете, что это не очень хороший способ для маршрутизации?

2. Вы правы. На самом деле была одна глупая ошибка, которая предотвратила перенаправление. Это был {id}, который следует заменить на <id> . После исправления этой ошибки все работало нормально.

Ответ №1:

В вашем коде есть только небольшая ошибка. Вам нужно изменить фигурные скобки идентификатора в /destinations/{id} toa /destinations/<id> , и тогда код будет работать идеально…

Ответ №2:

У меня был бы контекстный процессор, который поддерживает словарь необходимых ссылок:

 @app.context_processor
def processor():
  """ This function injects vars into every page """
  cities = {
            'paris':'Paris',
            'newyork': 'New York',
            'moscow':'Moscow',
            'vegas':'Las Vegas',
            'pataya':'Pataya'
            }
  
  return dict(CITIES=cities)
 

В какой-то момент вы могли бы создать этот словарь из базы данных или другого хранилища.

Затем включите в свой шаблон:

 <li><a href="#">Destinations</a>
  <ul class="nav-dropdown">
   {% for city_id,city_name in CITIES.items() %}

     <li><a href="{{ url_for('destinations', id=city_id) }}">{{city_name}}</a></li>

   {% endfor %}
  </ul>
</li>
 

Эта url_for функция генерирует URL-адрес, подобный: /destinations/paris .

Этот метод позволяет избежать необходимости вручную записывать названия / идентификаторы городов в файл шаблона.