摘要:為字段賦值,返回給客戶端進行重定向總結一個視圖函數的如果不設置那么就是視圖函數名。為和搭起橋梁,使得整個后端框架更加靈活。返回的是視圖函數對應的,是對應視圖函數裝飾器傳入的值。
還是先來看看源碼
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的設計思路。首先,從WSGI協議的角度介紹flask route的作用;其次,詳細講解如何借助werkzeug庫的Map、Rule實現route;最后,梳理了一次完整的http請求中route的完整流程。 flask rou...
摘要:最近看到一個關于的題文章其中的一個是裝飾器的順序問題就想寫篇博客回顧下裝飾器首先強烈推薦很久之前看的一篇博文翻譯理解中的裝飾器關于什么是裝飾器看這篇文章就好了這里主要想寫關于多個裝飾器的執行流程裝飾順序示例代碼初始化初始化輸出結果初始化初始 最近看到一個關于Flask的CTF(RealWorld CTF 2018 web題bookhub)文章其中的一個trick是裝飾器的順序問題,就想...
摘要:鍵是函數名,值是函數對象,函數名也用于生成。注冊一個視圖函數,用裝飾器。獲取儲存視圖函數字典中的函數對象視圖函數類中的字典儲存了注冊的視圖函數名和視圖函數對象。輸出視圖函數視圖函數名重復修改解決 那天莫名其妙出了個錯。。就順便看了看Flask路由 在flask存儲路由函數是以函數名為鍵,函數對象為值 class Flask: def __init__(self, *args, ...
摘要:視圖高級和這個方法是用來添加與視圖函數的映射。小例子如下請求上下文的定義,結合類視圖之前我們接觸的視圖都是函數,所以一般簡稱視圖函數。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個方法是用來添加url與視圖函數...
摘要:視圖高級和這個方法是用來添加與視圖函數的映射。小例子如下請求上下文的定義,結合類視圖之前我們接觸的視圖都是函數,所以一般簡稱視圖函數。 視圖高級 app.route和app.add_url_rule app.add_url_rule app.add_url_rule(/list/,endpoint=myweb,view_func=my_list) 這個方法是用來添加url與視圖函數...
閱讀 3027·2023-04-25 18:06
閱讀 3272·2021-11-22 09:34
閱讀 2858·2021-08-12 13:30
閱讀 2045·2019-08-30 15:44
閱讀 1661·2019-08-30 13:09
閱讀 1630·2019-08-30 12:45
閱讀 1715·2019-08-29 11:13
閱讀 3608·2019-08-28 17:51