Max*_*xPY 6 python backend url-routing flask
有一个蓝图定义了很多有用的路由,但我无法控制它(无法以任何方式更改它的代码)尝试在不同的应用程序中重用它,但蓝图的端点之一必须重载。我怎样才能做到这一点?
我尝试在现有路线的基础上添加一条新的蓝图路线:
@blueprint.route('/my/route', methods=['PUT', 'POST'])
def my_new_view_func(program, project):
# some new behavior for the endpoint
Run Code Online (Sandbox Code Playgroud)
结果有重复的 url_rule app.url_map.iter_rules():
<Rule '/my/route' (PUT, POST) -> my_view_func>,
<Rule '/my/route' (PUT, POST) -> my_new_view_func>,
Run Code Online (Sandbox Code Playgroud)
当请求/my/route旧查看器时my_view_func被执行
我可以以某种方式摆脱旧的 url 规则吗?或者也许有更好的方法来覆盖路线?
我找到了两种解决方案。第一的:
from flask import Flask, Blueprint
simple_page = Blueprint('simple_page', __name__, )
@simple_page.route('/my/route/')
def my():
# for example it's a registered route somewhere...
return 'default'
@simple_page.route('/my/route/')
def new_my():
# new endpoint / should works instead my()
return 'new'
# map of views which we won't register in Flask app
# you can store this somewhere in settings
SKIP_VIEWS = (
# route, view function
('/my/route/', my, ),
)
class CustomFlask(Flask):
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
# Flask registers views when an application starts
# do not add view from SKIP_VIEWS
for rule_, view_func_ in SKIP_VIEWS: # type: str, func
if rule_ == rule and view_func == view_func_:
return
return super(CustomFlask, self).add_url_rule(rule, endpoint, view_func, **options)
app = CustomFlask(__name__)
app.register_blueprint(simple_page)
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
第二种方式:
Two.py - 带有端点的默认蓝图
from flask import Blueprint
bp_two = Blueprint('simple_page2', __name__, )
@bp_two.route('/my/route/')
def default():
return 'default'
Run Code Online (Sandbox Code Playgroud)
test.py - 你的蓝图+应用程序
from flask import Flask, Blueprint
from two import bp_two
your_bp = Blueprint('simple_page', __name__, )
@your_bp.route('/my/route/')
def new_route():
return 'new'
app = Flask(__name__)
# register blueprint and turn off '/my/route/' endpoint
app.register_blueprint(bp_two, **{'url_defaults': {'/my/route/': None}})
app.register_blueprint(your_bp)
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
运行应用程序。打开/my/route/。您将看到默认端点未添加/工作。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
6788 次 |
| 最近记录: |