将参数传递给烧瓶蓝图的预期方法是什么?

时间:2017-11-14 14:14:41

标签: python flask

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

我发现的最明显的例子是a school case of flask application。据我所知:

  • {em} app 模块中声明了app对象

  • 路由在 routes 模块

  • 中声明
  • 蓝图按我的意愿导入路线

然而,在我的应用程序中,我需要访问一些路径,我需要访问 app 模块中定义的参数(它们在创建app对象之前使用)。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

在[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)

答案 1 :(得分:0)

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

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

我建议创建一个structure(c(0.00857284996420482, -0.0214828379001606, 0.0493759635676962, 0.0593643780418613, -0.0260971572816295, -0.0718686084701758, 0.00959593733451847,..., -0.0119433191489424, 0, NA), .Dim = c(1674L, 1L), .Dimnames = list(NULL, "Return")) 文件并定义一个基于类的视图(或者你可以称之为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

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