Подтвердить что ты не робот

Создание ссылки на URL-адрес приложения Flask в шаблоне jinja2

В моем приложении Flask у меня есть представление, в котором отображается сообщение

@post_blueprint.route('/post/<int:year>/<int:month>/<title>')
def get_post(year,month,title):
    # My code

Чтобы отобразить последние 10 записей, у меня есть следующее представление:

@post_blueprint.route('/posts/')
def get_all_posts():
    # My code
    return render_template('p.html',posts=posts)

Теперь, когда я показываю последние 10 сообщений, я хочу преобразовать заголовок сообщения в гиперссылку. В настоящее время в моем шаблоне jinja я должен сделать следующее:

<a href="/post/{{year}}/{{month}}/{{title}}">{{title}}</a>

Есть ли способ избежать жесткого кодирования URL?

Как и функция url_for, которая используется для создания URL-адресов Flask, таких как:

url_for('view_name',**arguments)

Я попытался найти один, но я не смог его найти.

4b9b3361

Ответ 1

Мне кажется, что вы задаете здесь два вопроса, но я сделаю снимок...

Для URL-адреса проводки вы сделаете следующее:

<a href="{{ url_for('post_blueprint.get_post', year=year, month=month, title=title)}}">
    {{ title }}
</a>

Чтобы обрабатывать статические файлы, я бы предложил использовать диспетчер активов, например Flask-Assets, но сделать это с помощью фляжки для ванили:

{{ url_for('static', filename='[filenameofstaticfile]') }}

Если вам нужна дополнительная информация, я настоятельно рекомендую вам прочитать. http://flask.pocoo.org/docs/quickstart/#static-files и http://flask.pocoo.org/docs/quickstart/#url-building

Изменить для использования kwargs:

Просто подумал, что я буду более основательным...

Если вы хотите использовать url_for следующим образом:

{{ url_for('post_blueprint.get_post', **post) }}

Вы должны изменить свой вид на что-то вроде этого:

@post_blueprint.route('/posts/')
def get_all_posts():
    models = database_call_of_some_kind # This is assuming you use some kind of model
    posts = []
    for model in models:
        posts.append(dict(year=model.year, month=model.month, title=model.title))
    return render_template('p.html', posts=posts)

Тогда ваш код шаблона может выглядеть так:

{% for post in posts %}
    <a href="{{ url_for('post_blueprint.get_post', **post) }}">
        {{ post['title'] }}
    </a>
{% endfor %}

В этот момент я бы на самом деле создал метод на модели, поэтому вам не нужно превращать его в dict, но далеко не все: -).