Обработка представлений с повторяющимися именами функций

#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:

Есть два способа решить эту проблему.

  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 помощью и т.д. Однако вам нужно будет убедиться, что все ваши имена конечных точек уникальны, поэтому это не идеально.

  2. Используйте 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 .