假设我有一个像这样组织的烧瓶项目
app/
├── __init__.py
└── views.py
但我的views.py
文件开始包含大量代码,并且很容易被分解为一些概念上不同的部分。我的第一个想法是将视图分解为像这样的子模块
app/
├── __init__.py
└── views
├── __init__.py
├── some_views.py
└── some_other_views.py
当我这样做时,我的路线一切正常,但在使用url_for
时遇到了问题。我希望能够做url_for('views.some_views.my_view')
之类的事情,但只有{I} url_for('my_view')
才有效。这个问题是我有可能从不同子模块渲染的模板代码,它会根据深度而中断。
有没有办法像这样打破代码,同时仍允许使用视图的完整路径调用url_for
?谢谢!
答案 0 :(得分:0)
在查看Flask源代码之后,实际上很简单的方法就是如何确定默认端点的行为。 Flask定义了一个flask.helpers._endpoint_from_view_func
,它将函数作为参数并返回函数的名称。然后在flask.app.add_url_rule
中使用它来填充默认端点(如果未提供)。我刚刚添加了
import flask
flask.app._endpoint_from_view_func = lambda f: '.'.join(f.__module__.split('.')[1:] + [f.__name__])
到我的顶级__init__.py
文件,以自定义默认端点的构造方式。这让我可以使用url_for('views.some_views.my_view')
代替url_for('my_view')
,这是我最初的目标。就个人而言,我认为在使用子模块组织代码时,这允许更精细的命名空间。