如何在仍然有效地使用url_for的情况下将Flask中的视图拆分为子模块?

时间:2016-02-10 17:49:57

标签: python flask module url-for

假设我有一个像这样组织的烧瓶项目

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?谢谢!

1 个答案:

答案 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'),这是我最初的目标。就个人而言,我认为在使用子模块组织代码时,这允许更精细的命名空间。