最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 如何理解Flask中的endpoint

    正文概述    2020-09-07   377

    在Flask中我们常常会在请求处理中使用endpoint,那么如何理解Flask中的endpoint呢?

    如何理解Flask中的endpoint

    首先,我们看一个例子:

    @app.route('/user/<name>')
    def user(name):
        return 'Hello, %s' % name

    这个是我们在用flask框架写网站中最常用的。

    通过看源码,我们可以发现:

    函数等效于:

    def user(name)
        return 'Hello, %s' % name
        
    app.add_url_rule('/user/<name>', 'user', user)

    这个add_url_rule函数在文档中是这样解释的:

    add_url_rule(*args, **kwargs)
    Connects a URL rule. Works exactly like the route() decorator. If a view_func is provided it will be registered with the endpoint.

    add_url_rule有如下参数:

    抛开options这个参数不谈,我们看看前三个参数。

    rule:这个参数很简单,就是匹配的路由地址

    view_func:这个参数就是我们写的视图函数

    endpoint:这个参数就是我今天重点要讲的,endpoint

    很多人认为:假设用户访问http://www.example.com/user/eric,flask会找到该函数,并传递name='eric',执行这个函数并返回值。

    但是实际中,Flask真的是直接根据路由查询视图函数么?

    在源码中我们可以发现:

    1、每个应用程序app都有一个view_functions,这是一个字典,存储endpoint-view_func键值对。add_url_rule的第一个作用就是向view_functions中添加键值对(这件事在应用程序run之前就做好了)

    2、每个应用程序app都有一个url_map,它是一个Map类(具体实现在werkzeug/routing.py中),里面包含了一个列表,列表元素是Role的实例(werkzeug/routing.py中)。add_url_rule的第二个作用就是向url_map中添加Role的实例(它也是在应用程序run之前就做好了)

    我们可以通过一个例子来看:

    app = Flask(__name__)
    @app.route('/test', endpoint='Test')
    def test():
        pass
    @app.route('/', endpoint='index')
    def hello_world():
        return 'Hello World!'
    if __name__ == '__main__':
        print(app.view_functions)
        print(app.url_map)
        app.run()

    运行这个程序,结果是:

    {'static': <bound method Flask.send_static_file of <Flask 'flask-code'>>, 'Test': <function test at 0x10065e488>, 'index': <function hello_world at 0x10323d488>}
    Map([<Rule '/test' (HEAD, OPTIONS, GET) -> Test>,
     <Rule '/' (HEAD, OPTIONS, GET) -> index>,
     <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
     * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

    所以我们可以看出:这个url_map存储的是url与endpoint的映射!

    回到flask接受用户请求地址并查询函数的问题。实际上,当请求传来一个url的时候,会先通过rule找到endpoint(url_map),然后再根据endpoint再找到对应的view_func(view_functions)。通常,endpoint的名字都和视图函数名一样。

    这时候,这个endpoint也就好理解了:

    实际上这个endpoint就是一个Identifier,每个视图函数都有一个endpoint,当有请求来到的时候,用它来知道到底使用哪一个视图函数。

    在实际应用中,当我们需要在一个视图中跳转到另一个视图中的时候,我们经常会使用url_for(endpoint)去查询视图,而不是把地址硬编码到函数中。

    这个时候,我们就不能使用视图函数名当endpoint去查询了

    我们举个例子来说明。比如:

    app = Flask(__name__)
    app.register_blueprint(user, url_prefix='user')
    app.register_blueprint(file, url_prefix='file')

    我们注册了2个蓝图。

    在user中(省略初始化过程):

    @user.route('/article')
    def article():
        pass

    在file中(省略初始化过程):

    @file.route('/article')
    def article():
        pass

    这时候,我们发现,/article这个路由对应了两个函数名一样的函数,分别在两个蓝图中。当我们使用url_for(article)调用的时候(注意,url_for是通过endpoint查询url地址,然后找视图函数),flask无法知道到底使用哪个蓝图下的endpoint,所以我们需要这样:

    url_for('user.article')

    起源地下载网 » 如何理解Flask中的endpoint

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元