听起来您可能需要使用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))
请注意,该类将在每个请求上实例化,而不仅仅是一次。所以你不应该在构造函数中做任何特别密集的事情(比如读取文件)。