flask路由註冊的深入了解

2022-09-09 11:15:17 字數 3515 閱讀 3189

1.利用裝飾器來註冊

def hello():

return 'hello flask'

2.利用flask自帶的add_url_rule註冊

def hello():

return 'hello flask'

兩個方法的實質都是通過呼叫add_url_rule方法來實現

下面看看裝飾器的內部

def route(self, rule: str, **options: t.any) -> t.callable:

def decorator(f: t.callable) -> t.callable:

endpoint = options.pop("endpoint", none)

self.add_url_rule(rule, endpoint, f, **options)

return f

return decorator

只是呼叫了乙個add_url_rule

再進去add_url_rule內部:

@setupmethod

def add_url_rule(

self,

rule: str,

endpoint: t.optional[str] = none,

view_func: t.optional[t.callable] = none,

provide_automatic_options: t.optional[bool] = none,

**options: t.any,

) -> none:

raise notimplementederror

在scaffold類中,函式是空的,去flask類中找下他的override

# flask類中

@setupmethod

def add_url_rule(

self,

rule: str,

endpoint: t.optional[str] = none,

view_func: t.optional[t.callable] = none,

provide_automatic_options: t.optional[bool] = none,

**options: t.any,

) -> none:

# 獲取endpoint,如果為空則取函式名

if endpoint is none:

endpoint = _endpoint_from_view_func(view_func) # type: ignore

# 設定endpoint

options["endpoint"] = endpoint

# method為http動作的元組或列表,如['get', 'post']

methods = options.pop("methods", none)

# 如果為空,則尋找這個view_func的methods屬性

# 否則預設是('get'),即預設只處理get動作

if methods is none:

methods = getattr(view_func, "methods", none) or ("get",)

# method不能是字串

if isinstance(methods, str):

raise typeerror(

"allowed methods must be a list of strings, for"

)# 將methods的所有元素轉為大寫,即能夠在methods引數中使用小寫,如('get', 'post'),因為這裡有轉換

methods =

# methods that should always be added

# 必須要新增的http動作

required_methods = set(getattr(view_func, "required_methods", ()))

# starting with flask 0.8 the view_func object can disable and

# force-enable the automatic options handling.

# 是否自動新增options動作

if provide_automatic_options is none:

provide_automatic_options = getattr(

view_func, "provide_automatic_options", none

)if provide_automatic_options is none:

if "options" not in methods:

provide_automatic_options = true

required_methods.add("options")

else:

provide_automatic_options = false

# add the required methods now.

# 將兩個集合合併

methods |= required_methods

# 建立規則

rule = self.url_rule_class(rule, methods=methods, **options)

rule.provide_automatic_options = provide_automatic_options # type: ignore

# 將規則新增到url_map中

self.url_map.add(rule)

if view_func is not none:

# 不同檢視必須有不同的endpoint,即endpoint唯一,是不同檢視的識別符號

old_func = self.view_functions.get(endpoint)

if old_func is not none and old_func != view_func:

raise assertionerror(

f" endpoint function: "

)# 將檢視存入view_functions

self.view_functions[endpoint] = view_func

self.view_functions[endpoint] = view_func這一步是以endpoint作為字典的值將檢視函式繫結給路由。

可以看出,flask 內部是先把url位址對映到端點(endpoint)上,然後再對映到檢視函式(view_func),endpoint沒有, 就呼叫_endpoint_from_view_func方法返回view_func的名稱

endpoint通常用作反向查詢url位址(viewfunction–>endpoint–>url)

在flask中有個檢視,你想把它關聯到另乙個檢視上(或從站點的一處連線到另一處),可以直接使用url_for(),採用這種方法能夠使程式更高、更快、更強

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

03 深入了解元件 元件註冊(註冊方式)

模組系統中 註冊方式 大小寫 小寫kebab case或者pascalcase。eg my component name或者mycomponentname 字串模板 就是反引號。dom 非字串模板。推薦 kebab case,都能使用。註冊方式 全域性註冊 註冊之後可以用在任何新建立的 vue 根例...