【问题标题】:What is the intended way to pass a parameter to a flask blueprint?将参数传递给烧瓶蓝图的预期方式是什么?
【发布时间】:2017-11-14 14:14:40
【问题描述】:

在询问 a previous question 后,有人告诉我我的应用程序的组织很奇怪,所以我查看了其他示例,看看我如何处理我想做的事情。

我发现的最清晰的例子是a school case of flask application。据我了解:

  • app 对象在 app 模块中声明

  • 路由在 routes 模块中声明

  • 蓝图按需导入路由

但是,在我的应用程序中,为了回答一些路由,我需要访问在 app 模块中定义的参数(它们在创建应用程序对象之前使用)。

如何使这些参数在 routes 模块中可访问?

我不能只从 app 导入它们,因为那将是循环导入。

我可以使用 this question 中建议的构造函数,但考虑到我之前问题的评论,这似乎不是处理此问题的常用方法。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    听起来您可能需要使用class-based views

    您面临的问题是视图函数在运行时需要值,但很难将它们导入到定义函数的路由模块中。您最初尝试使用函数中的函数来解决此问题(虽然完全有效,但不是 Python-y)。

    我建议创建一个views.py 文件并定义一个基于类的视图(或者您可以将其称为routes.py,这并不重要):

    from flask.views import View
    
    
    class MyView(View):
        methods = ['GET']
    
        def __init__(self, param1, param2):
            self.param1 = param1
            self.param2 = param2
    
        def dispatch_request(self):
            return 'param1: {}\nparam2: {}'.format(self.param1, self.param2)
    
    
    def add_routes(app, param1, param2):
        # `param1` and `param2` will get passed to the view class constructor
        app.add_url_rule('/', view_func=MyView.as_view('myview', param1, param2))
    

    然后,在您的 server.py 文件(或您所称的任何文件)中,您可以将应用程序和参数传递给 add_routes 函数:

    from flask import Flask
    from .views import add_routes
    
    param1 = 'foo'
    param2 = 'bar'
    app = Flask(__name__)
    
    add_routes(app, param1, param2)
    

    add_routes 不必住在views.py,它可以住在任何地方。或者,如果您没有很多路线,您可以完全摆脱它:

    from flask import Flask
    from .views import MyView
    
    param1 = 'foo'
    param2 = 'bar'
    
    app = Flask(__name__)
    app.add_url_rule('/', view_func=MyView.as_view('myview', param1, param2))
    

    请注意,该类将在每个请求上实例化,而不仅仅是一次。所以你不应该在构造函数中做任何特别密集的事情(比如读取文件)。

    【讨论】:

    • 与我在第一个问题中使用的函数构造函数相比,这有什么优势?它似乎更复杂,每个请求都需要实例化,我错过了什么吗?
    • 对不起,你说得对,我不是很清楚。我更新了答案以澄清我的意图。
    【解决方案2】:

    按照史蒂夫的回答精神,我得到了这个可行的解决方案:

    在 [routes.py] 中:

    class Routes:
        # constructor
        def __init__(self, config: dict):
            self.__config = config
    
        # init_session
        def init_session(self, type_response: str):
            # using the config
            config = self.__config
            ...
    
        # authenticate_user
        def authenticate_user(self):
            # using the config
            config = self.__config
            ...
    

    在 [main.py] 中

    config={...}
    
    # Flask app
    app = Flask(__name__, template_folder="../templates", static_folder="../static")
    
    # routes                                                                                                         # routes
    from routes import Routes
    
    # class instance with needed parameters
    routes = Routes(config)
    
    # adjusting urls with routes
    
    app.add_url_rule('/init-session/<string:type_response>', methods=['GET'],
                     view_func=routes.init_session)
    app.add_url_rule('/authenticate-user', methods=['POST'],
                     view_func=routes.authenticate_user)
    

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2017-07-13
      • 2021-02-08
      • 2023-03-09
      相关资源
      最近更新 更多