国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從app.route裝飾器引發對endpoint的思考

妤鋒シ / 2006人閱讀

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

還是先來看看源碼

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這樣一個字典,一般我們會傳方法methods進去,GET、POST,如果不自己設置endpoint=....的話默認就是No。
然后進入add_url_rule函數看一看:

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

這里我截取了一些重點的,可以看到如果endpoint為None,會調用_endpoint_from_view_func函數來給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__

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

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

#為Location字段賦值,返回給客戶端進行重定向
response.headers["Location"] = location
        return response

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44735.html

相關文章

  • flask route設計思路

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

    vvpale 評論0 收藏0
  • Python裝飾-裝飾流程,執行順序

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

    cpupro 評論0 收藏0
  • Flask注冊視圖函數

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

    2bdenny 評論0 收藏0
  • flask之三:視圖高級

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

    hot_pot_Leo 評論0 收藏0
  • flask之三:視圖高級

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

    RancherLabs 評論0 收藏0

發表評論

0條評論

妤鋒シ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<