over 3 years ago

Flask 是所謂的 microframework,它不像 Django 本身就內建許多功能,例如 ORM 以及 form validation,這些功能必須自己寫或是安裝人家寫好的外掛。雖然麻煩了點,但也提供了我們選擇的彈性。

官網上為了強調 Flask 的輕巧,展示了僅僅只有七行的的 Hello World 範例

app.py
from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run()

執行 app.py,然後連到 http://localhost:5000 就可以看到結果。這段程式的重點在於加入 URL rules,@app.route("/") 是一個 decorator (精確點應該是 decorator factory),實際上是轉呼叫 add_url_rule() ,上面的程式也可以這麼寫

def hello():
    return "Hello World!"
app.add_url_rule('/', view_func=hello)

以下是原始碼簡化的版本。

from werkzeug.routing import Map, Rule
from .globals import _request_ctx_stack

class FakeFlask(object):

    def __init__(self):
        self.view_functions = {}
        self.url_map = Map()

    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        if endpoint is None:
            endpoint = view_func.__name__
        options['endpoint'] = endpoint
        methods = options.pop('methods', None) or ('GET',)
        self.url_map.add(Rule(rule, methods=methods, **options))
        if view_func is not None:
            self.view_functions[endpoint] = view_func

    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

    def dispatch_request(self):
        req = _request_ctx_stack.top.request
        rule = req.url_rule
        return self.view_functions[rule.endpoint](**req.view_args)

add_url_rule() 會將我們寫的 routing 處理函式 hello() 放入 view_functions 這個 dictionary 中,它的 key 預設是函式的名稱,之後有 request 進來時,就可以藉由 view_functions 所存的值轉發。

← REST 簡介 FLASK 簡介 - Blueprints →
 
comments powered by Disqus