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 根例...