#flask
#flask
Вопрос:
Есть ли в Flask какой-либо способ решить проблему дублирования имен функций для представлений в файлах? Просто для ясности, я говорю об имени функции, а не о маршруте, определенном для функции. Итак, представьте, что у file1.py
меня есть:
@app.route('/some/unique/route')
def duplicateFunctionName():
...python code...
И затем у file2.py
меня есть:
@app.route('/another/unique/route/name')
def duplicateFunctionName():
...python code...
А затем main.py
я импортирую эти функции просмотра:
import file1
import file2
<<code to run the flask server>>
Проблема в том, что в больших проектах действительно сложно сохранить уникальные имена функций. В какой-то момент у вас обязательно будут вызваны две функции def saveData()
или что-то еще, и отлаживать эти проблемы действительно сложно. Есть ли элегантное решение этой проблемы?
Комментарии:
1. Если вы не используете
from fileN import *
две функции, они останутся в своих собственных пространствах имен какfile1.duplicateFunctionName
иfile2.duplicateFunctionName
.
Ответ №1:
Есть два способа решить эту проблему.
-
Используйте аргумент
endpoint
ключевого слова, чтобы.route
:@app.route('/some/unique/route', endpoint="unique_name_1") def duplicateFunctionName(): pass @app.route('/another/unique/route', endpoint="unique_name_2") def duplicateFunctionName(): pass
Это гарантирует, что все ваши функции можно адресовать с
url_for
помощью и т.д. Однако вам нужно будет убедиться, что все ваши имена конечных точек уникальны, поэтому это не идеально. -
Используйте
Blueprint
‘s для разделения ваших маршрутов на более мелкие автономные пакеты:bp1 = Blueprint("module_one", __name__) @bp1.route("/some/unique/route") def duplicateFunctionName(): pass bp2 = Blueprint("module_two", __name__) @bp2.route("/another/unique/route") def duplicateFunctionName(): pass
Преимущество здесь в том, что имя конечной точки имеет префикс с именем схемы элементов, что означает, что вместо двух конечных точек с конфликтующими именами
duplicateFunctionName
у вас теперь есть две конечные точки с именамиmodule_one.duplicateFunctionName
иmodule_two.duplicateFunctionName
.