Создание URL с использованием Flask и неуникальных имен обработчиков - PullRequest
17 голосов
/ 05 августа 2011

Flask предоставляет функцию url_for для генерации URL-адресов для обработчиков на основе шаблона URL-адреса.Но это будет означать, что функции-обработчики должны иметь уникальные имена во всем приложении.Это правильно?

Пример

Модуль A имеет обработчик index:

@app.route('/')
def index(): pass

И модуль B имеет другой обработчик index:

@app.route('/anotherindex')
def index(): pass

Как отличить обработчики, вызываемые index, при создании URL-адресов?

url_for('index')

1 Ответ

50 голосов
/ 05 августа 2011

Я не знаю, как вы могли бы поступить со всеми представлениями, маршрутизируемыми одним и тем же модулем.

Обычно я делаю свои представления в разных модулях (как вы делали с модулями A и B), и зарегистрируйте их как чертежи, после этого при использовании функции url_for() вы можете добавить префикс имени представления к имени чертежа, а затем избежать конфликтов и потенциальных проблем.

Вот пример:

main_views.py:

from flask import Blueprint
main = Blueprint('main', __name__)

@main.route('/')
def index():
    pass

admin_views.py:

from flask import Blueprint
admin = Blueprint('admin', __name__)

@admin.route('/admin')
def index():
    pass

application.py:

from flask import Flask
from main_views import main
from admin_views import admin

app = Flask('my_application')
app.register_blueprint(main)
app.register_blueprint(admin)

Теперь, чтобы получить доступ к двум индексным представлениям и по-прежнему отличать одно от другого, просто используйте url_for('main.index') или url_for('admin.index')

РЕДАКТИРОВАТЬ:

Еще одна полезная информация о маршрутизации с использованием чертежей. При регистрации чертежа вы можете передать аргумент url_prefix, который будет применяться к каждому представлению в этом чертеже.

Например, с учетом следующего кода:

admin_views.py

from flask import Blueprint
admin = Blueprint('admin', __name__)

@admin.route('/')
def index():
    pass

@admin.route('/logout')
def logout():
    pass

приложение.py:

from flask import Flask
from admin_views import admin

app = Flask('my_application')
app.register_blueprint(admin, url_prefix='/admin')

2 просмотра будут доступны по URL /admin/ и /admin/logout

...