0

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

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')但只有当我这样做时它才有效url_for('my_view')。这样做的问题是我有可能从不同的子模块呈现的模板代码,它会根据深度而中断。

有没有办法像这样分解代码,同时仍然允许url_for使用视图的完整路径调用?谢谢!

4

1 回答 1

0

在查看了 Flask 源代码后,实际上很简单,可以很简单地在任何你想要的行为中修改默认端点的确定方式。Flask 定义了 a 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'),这是我最初的目标。就个人而言,我认为这允许在使用子模块组织代码时进行更合理的命名空间。

于 2016-02-11T14:35:01.170 回答