在询问a previous question有人告诉我我的应用程序的组织很奇怪之后,所以我查看了其他示例以了解我如何处理我想要做的事情。
我发现的最明显的例子是a school case of flask application。据我所知:
{em} app 模块中声明了app
对象
路由在 routes 模块
蓝图按我的意愿导入路线
然而,在我的应用程序中,我需要访问一些路径,我需要访问 app 模块中定义的参数(它们在创建app对象之前使用)。
如何在 routes 模块中访问这些参数?
我不能只从 app 导入它们,因为那将是循环导入。
我可以使用像this question中建议的构造函数,但考虑到我之前问题的评论,似乎不是处理这个问题的常用方法。
答案 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
请注意,该类将在每个请求上实例化,而不仅仅是一次。所以你不应该在构造函数中做任何特别密集的事情(比如读取文件)。