成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從app.route裝飾器引發(fā)對(duì)endpoint的思考

妤鋒シ / 2025人閱讀

摘要:為字段賦值,返回給客戶端進(jìn)行重定向總結(jié)一個(gè)視圖函數(shù)的如果不設(shè)置那么就是視圖函數(shù)名。為和搭起橋梁,使得整個(gè)后端框架更加靈活。返回的是視圖函數(shù)對(duì)應(yīng)的,是對(duì)應(yīng)視圖函數(shù)裝飾器傳入的值。

還是先來(lái)看看源碼

def route(self, rule, **options):
    """A decorator that is used to register a view function for a
    given URL rule.  This does the same thing as :meth:`add_url_rule`
    but is intended for decorator usage::

        @app.route("/")
        def index():
            return "Hello World"

    For more information refer to :ref:`url-route-registrations`.

    :param rule: the URL rule as string
    :param endpoint: the endpoint for the registered URL rule.  Flask
                     itself assumes the name of the view function as
                     endpoint
    :param options: the options to be forwarded to the underlying
                    :class:`~werkzeug.routing.Rule` object.  A change
                    to Werkzeug is handling of method options.  methods
                    is a list of methods this rule should be limited
                    to (``GET``, ``POST`` etc.).  By default a rule
                    just listens for ``GET`` (and implicitly ``HEAD``).
                    Starting with Flask 0.6, ``OPTIONS`` is implicitly
                    added and handled by the standard request handling.
    """
    def decorator(f):
        endpoint = options.pop("endpoint", None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f
    return decorator

route傳入了**options這樣一個(gè)字典,一般我們會(huì)傳方法methods進(jìn)去,GET、POST,如果不自己設(shè)置endpoint=....的話默認(rèn)就是No。
然后進(jìn)入add_url_rule函數(shù)看一看:

def add_url_rule(self, rule, endpoint=None, view_func=None, **options):

    if endpoint is None:
        endpoint = _endpoint_from_view_func(view_func)
    options["endpoint"] = endpoint
    methods = options.pop("methods", None)

...
...
...

    self.url_map.add(rule)
    if view_func is not None:
        old_func = self.view_functions.get(endpoint)
        if old_func is not None and old_func != view_func:
            raise AssertionError("View function mapping is overwriting an "
                                 "existing endpoint function: %s" % endpoint)
        self.view_functions[endpoint] = view_func

這里我截取了一些重點(diǎn)的,可以看到如果endpoint為None,會(huì)調(diào)用_endpoint_from_view_func函數(shù)來(lái)給endpoint賦值,
看一下_endpoint_from_view_func的代碼:

def _endpoint_from_view_func(view_func):

"""Internal helper that returns the default endpoint for a given
function.  This always is the function name.
"""
assert view_func is not None, "expected view func if endpoint " 
                              "is not provided."
return view_func.__name__

可以看到將視圖函數(shù)名賦值給了endpoint,所以如果我們創(chuàng)建視圖函數(shù)時(shí)不在**options中指明endpoint的話,默認(rèn)就是視圖函數(shù)名,
后半部分進(jìn)行了判斷,保證了endpoint的唯一,并將view_func保存在view_functions這個(gè)字典中,并且和endpoint形成映射關(guān)系,還將路徑加入到當(dāng)前應(yīng)用中, 這樣做的好處是,當(dāng)我們用url_for()從一個(gè)endpoint來(lái)找到一個(gè)URL時(shí),可以順著這個(gè)映射關(guān)系來(lái)找,而不用寫(xiě)URL, 常見(jiàn)的用法是url_for(blueprint.endpoint,parm=val...)進(jìn)行重定向,這樣可以獲取一個(gè)視圖函數(shù)的路徑,傳給redirect(),
redirect(location,code=302)函數(shù)會(huì)把接收的參數(shù)作為響應(yīng)body中的Location字段返回給客戶端,并且默認(rèn)是302臨時(shí)重定向。

def redirect(location, code=302, Response=None):
...
...

#為L(zhǎng)ocation字段賦值,返回給客戶端進(jìn)行重定向
response.headers["Location"] = location
        return response

總結(jié):
URL《————》endpoint《————》view
一個(gè)視圖函數(shù)的endpoint如果不設(shè)置那么就是視圖函數(shù)名。
為URL和view搭起橋梁,使得整個(gè)后端框架更加靈活。
url_for(.endpoint)返回的是視圖函數(shù)對(duì)應(yīng)的URL,URL是對(duì)應(yīng)視圖函數(shù)裝飾器傳入的值。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44735.html

相關(guān)文章

  • flask route設(shè)計(jì)思路

    摘要:引言本文主要梳理了源碼中的設(shè)計(jì)思路。協(xié)議將處理請(qǐng)求的組件按照功能及調(diào)用關(guān)系分成了三種。不論是什么,最終都會(huì)調(diào)用函數(shù)。 引言 本文主要梳理了flask源碼中route的設(shè)計(jì)思路。首先,從WSGI協(xié)議的角度介紹flask route的作用;其次,詳細(xì)講解如何借助werkzeug庫(kù)的Map、Rule實(shí)現(xiàn)route;最后,梳理了一次完整的http請(qǐng)求中route的完整流程。 flask rou...

    vvpale 評(píng)論0 收藏0
  • Python裝飾-裝飾流程,執(zhí)行順序

    摘要:最近看到一個(gè)關(guān)于的題文章其中的一個(gè)是裝飾器的順序問(wèn)題就想寫(xiě)篇博客回顧下裝飾器首先強(qiáng)烈推薦很久之前看的一篇博文翻譯理解中的裝飾器關(guān)于什么是裝飾器看這篇文章就好了這里主要想寫(xiě)關(guān)于多個(gè)裝飾器的執(zhí)行流程裝飾順序示例代碼初始化初始化輸出結(jié)果初始化初始 最近看到一個(gè)關(guān)于Flask的CTF(RealWorld CTF 2018 web題bookhub)文章其中的一個(gè)trick是裝飾器的順序問(wèn)題,就想...

    cpupro 評(píng)論0 收藏0
  • Flask注冊(cè)視圖函數(shù)

    摘要:鍵是函數(shù)名,值是函數(shù)對(duì)象,函數(shù)名也用于生成。注冊(cè)一個(gè)視圖函數(shù),用裝飾器。獲取儲(chǔ)存視圖函數(shù)字典中的函數(shù)對(duì)象視圖函數(shù)類中的字典儲(chǔ)存了注冊(cè)的視圖函數(shù)名和視圖函數(shù)對(duì)象。輸出視圖函數(shù)視圖函數(shù)名重復(fù)修改解決 那天莫名其妙出了個(gè)錯(cuò)。。就順便看了看Flask路由 在flask存儲(chǔ)路由函數(shù)是以函數(shù)名為鍵,函數(shù)對(duì)象為值 class Flask: def __init__(self, *args, ...

    2bdenny 評(píng)論0 收藏0
  • flask之三:視圖高級(jí)

    摘要:視圖高級(jí)和這個(gè)方法是用來(lái)添加與視圖函數(shù)的映射。小例子如下請(qǐng)求上下文的定義,結(jié)合類視圖之前我們接觸的視圖都是函數(shù),所以一般簡(jiǎn)稱視圖函數(shù)。 視圖高級(jí) app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個(gè)方法是用來(lái)添加url與視圖函數(shù)...

    hot_pot_Leo 評(píng)論0 收藏0
  • flask之三:視圖高級(jí)

    摘要:視圖高級(jí)和這個(gè)方法是用來(lái)添加與視圖函數(shù)的映射。小例子如下請(qǐng)求上下文的定義,結(jié)合類視圖之前我們接觸的視圖都是函數(shù),所以一般簡(jiǎn)稱視圖函數(shù)。 視圖高級(jí) app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個(gè)方法是用來(lái)添加url與視圖函數(shù)...

    RancherLabs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<