【问题标题】:Overwrite route in flask blueprint覆盖烧瓶蓝图中的路线
【发布时间】:2018-09-21 22:13:25
【问题描述】:

有一个定义了很多有用路线的蓝图,但我无法控制它(不能以任何方式更改它的代码) 尝试在不同的应用程序中重用它,但必须重载蓝图的端点之一。我怎样才能做到这一点?

我尝试在现有路由的基础上添加一条新路由到蓝图:

@blueprint.route('/my/route', methods=['PUT', 'POST'])
def my_new_view_func(program, project):
    # some new behavior for the endpoint

结果app.url_map.iter_rules()中有重复的url_rule:

<Rule '/my/route' (PUT, POST) -> my_view_func>,
<Rule '/my/route' (PUT, POST) -> my_new_view_func>,

当请求/my/route老查看器my_view_func时被执行

我能以某种方式摆脱旧的 url 规则吗?或者也许有更好的方法来覆盖路线?

【问题讨论】:

  • 我理解正确吗?你不能改变旧的端点吗?
  • 不,我不能。原来的蓝图没有控制权,我只能用。试图找到一种方法来删除/替换蓝图对象中的路由

标签: python flask url-routing backend


【解决方案1】:

我找到了 2 个解决方案。 第一

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)

第二种方式

two.py - 带端点的默认蓝图

from flask import Blueprint

bp_two = Blueprint('simple_page2', __name__, )


@bp_two.route('/my/route/')
def default():
    return 'default'

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)

运行应用程序。打开/my/route/。您将看到默认端点未添加/工作。

希望这会有所帮助。

【讨论】:

  • 第二种方式向bp_two添加第二条路由(test)时,无法访问该路由。 TypeError: test() got an unexpected keyword argument '/my/route/' 出错。
  • @siebz0r 抱歉,但我的回答中没有看到任何 test() 方法/功能。您的代码似乎有问题。
  • @DanilaGanchar 这就是为什么我说“添加时”,换句话说;获取代码并添加其他功能时。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 2017-02-09
  • 1970-01-01
  • 2012-09-27
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多