1. 程式人生 > >flask原始碼閱讀筆記(4)-路由實現分析

flask原始碼閱讀筆記(4)-路由實現分析

一、url路由實現

1.基礎路由

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

分析裝飾器原始碼:

    def route(self, rule, **options):
        def decorator(f):
            endpoint = options.pop('endpoint', None)
            self.add_url_rule(rule, endpoint, f, **options)
            return
f return decorator

通過這個裝飾器將view function註冊到url。(url-route-registrations)。

程式碼註釋提及:

        # Basically this example::

            @app.route('/')
            def index():
                pass

        # Is equivalent to the following::

            def index():
                pass
            app.add_url_rule('/'
, 'index', index)

2.複雜路由

# 官方demo:

@app.route('/')
def index():
    pass

@app.route('/<username>')
def show_user(username):
    pass

@app.route('/post/<int:post_id>')
def show_post(post_id):
    pass

@app.route('/users/', defaults={'page': 1})
@app.route('/users/page/<int:page>')
def show_users(page): pass

二、總結

1.

在路由系統中定義規則可以的方法可以概括為三種:

  • 使用 flask.Flask.route() 裝飾器
  • 使用 flask.Flask.add_url_rule() 函式
  • 直接訪問暴露為 flask.Flask.url_map 的底層的 Werkzeug 路由系統(不推薦)

2. route() 和 add_url_rule() 接受的引數

引數名 解釋
rule URL 規則的字串
endpoint 註冊的 URL 規則的末端。如果沒有顯式地規定,Flask 本身假設末端的名稱是檢視函式的名稱,。
view_func 當請求呈遞到給定的末端時呼叫的函式。如果沒有提供,可以在用在 view_functions 字典中以末端作為鍵名儲存,來在之後設定函式。
defaults 規則預設值的字典。上面的示例介紹了預設值如何工作。
subdomain 當使用子域名匹配的時候,為子域名設定規則。如果沒有給定,假定為預設的子域名。
**options 這些選項會被推送給底層的 Rule 物件。一個 Werkzeug 的變化是 method 選項的處理。methods是這個規則被限定的方法列表( GET , POST 等等)。預設情況下,規則只監聽 GET (也隱式地監聽 HEAD )。從 Flask 0.6 開始,OPTIONS 也被隱式地加入,並且做標準的請求處理。 它們需要作為關鍵字引數來給定。

檢視當前app的路由情況

>>> app.url_map

待補充