Flask註冊視圖函數

那天莫名其妙出了個錯。。就順便看了看Flask路由前端

在flask存儲路由函數是以函數名爲鍵,函數對象爲值flask

class Flask:
    def __init__(self, *args, **kwargs):
        #全部視圖函數的註冊將被放在字典。鍵是函數名,值是函數對象,函數名也用於生成URL。註冊一個視圖函數,用route裝飾器。
        self.view_functions= {}

app.route裝飾器註冊視圖函數app

def route(self, rule, **options):
    #用來給給定的URL註冊視圖函數的裝飾器,也能夠用add_url_rule函數來註冊。endpoint關鍵字參數默認是視圖函數的名字
    def decorator(f):
            endpoint = options.pop('endpoint', None) #pop刪除endpoint的值沒有爲None並返回它賦值給endpoint
            self.add_url_rule(rule, endpoint, f, **options) #調用add_url_rule函數
            return f
        return decorator

add_url_rule函數ide

def add_url_rule(self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options):
    if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func) #_endpoint_from_view_fun函數返回視圖函數名view_fun.__name__
        options['endpoint'] = endpoint
    #......
    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) #old_func對象從儲存視圖函數的字典中取出,若是它不爲空而且不等於視圖函數那麼就會報錯視圖函數覆蓋當前端點函數,若是有同名函數能夠經過修改endpoint值來避免這個錯誤。
            self.view_functions[endpoint] = view_func #函數名做爲鍵,函數對象做爲值存儲到view_functions中。

獲取儲存視圖函數字典中的函數對象函數

from flask import Flask

app = FLask(__name__)

@app.route('/')
def index():
    return '<h1>視圖函數:{} /endpoint:{}</h1>'.format(app.view_functions.get('index','None').__name__,
        app.view_functions.keys()) #FLask類中的view_functions字典儲存了註冊的視圖函數名和視圖函數對象。函數名爲endpoint默認就是視圖函數的名字,get方法得到視圖函數對象,__name__過的函數名。這個字典的鍵就是endponit的值。
輸出: endpoint:dict_keys(['static', 'index'])/視圖函數:index

若是自定義endponit = 'hello'url

@app.route('/', endpoint='hello')
def index():
    return '<h1>endpoint:{}/視圖函數:{}</h1>'.format(app.view_functions.keys(),
        app.view_functions.get('hello','None').__name__) #字典鍵值就是endponit值改成自定義的值來獲取試圖函數對象。
輸出: endpoint:dict_keys(['static', 'hello'])/視圖函數:index

視圖函數名重複code

@app.route('/s/')
def a():
    return 'helloooo'

@app.route('/ss/')
def a():
    return 'ahahaha' 
#AssertionError: View function mapping is overwriting an existing endpoint function: a

修改endpoint解決orm

@app.route('/s/', endpoint='h')
def a():
    return 'helloooo'

@app.route('/ss/')
def a():
    return 'ahahaha'
相關文章
相關標籤/搜索