1. 程式人生 > 其它 >8 flask之路由系統

8 flask之路由系統

1 預設method是get

main.py

from flask import Flask, request, render_template, redirect

app = Flask(__name__)


@app.route('/login')
def login():
    if request.method == "GET":
        return render_template('login.html', a1=1)
    else:
        # request.query_string
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'dzg' and pwd == '123':
            return redirect('http://www.baidu.com')
        return render_template('login.html', error='使用者名稱或密碼錯誤')


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

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
    <h1>使用者登入</h1>
    <form method="post">
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="submit" value="登入">{{error}}
    </form>
</body>
</html>

 

 

 

 

 

2 典型寫法

endpoint 相當於起別名

@app.route('/detail/<int:id>', methods=['GET'], endpoint='detail')
def detail(id):
    pass

3 預設轉換器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

4 路由系統本質

"""
1. decorator = app.route('/',methods=['GET','POST'],endpoint='n1')
    def route(self, rule, **options):
        # app物件
        # rule= /
        # options = {methods=['GET','POST'],endpoint='n1'}
        def decorator(f):
            endpoint = options.pop('endpoint', None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f
        return decorator
2. @decorator
    decorator(index)
"""
#同理
def login():
    return '登入'
app.add_url_rule('/login', 'n2', login, methods=['GET',"POST"])
#與django路由類似
#django與flask路由:flask路由基於裝飾器,本質是基於:add_url_rule
#add_url_rule 原始碼中,endpoint如果為空,endpoint = _endpoint_from_view_func(view_func),
最終取view_func.__name__(函式名)