Flask 學習(三)路由介紹

Flask路由規則都是基於Werkzeug的路由模塊的,它還提供了不少強大的功能。css

兩種添加路由的方式html

方式一:
  @app.route('/xxxx')  # @decorator
  def index():
     return "Index"
方式二:
  def index():
     return "Index"
  app.add_url_rule('/xxx', "n1", index)  #n1是別名 

@app.route和app.add_url_rule參數

@app.route和app.add_url_rule參數:
            rule,                       URL規則
            view_func,                  視圖函數名稱
            defaults=None,              默認值,當URL中無參數,函數須要參數時,使用defaults={'k':'v'}爲函數提供參數
            endpoint=None,              名稱,用於反向生成URL,即: url_for('名稱')
            methods=None,               容許的請求方式,如:["GET","POST"]
            

            strict_slashes=None,        對URL最後的 / 符號是否嚴格要求,
                                        如:
                                            @app.route('/index',strict_slashes=False),
                                                訪問 http://www.xx.com/index/ 或 http://www.xx.com/index都可
                                            @app.route('/index',strict_slashes=True)
                                                僅訪問 http://www.xx.com/index 
            redirect_to=None,           重定向到指定地址
                                        如:
                                            @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
                                            或
                                            def func(adapter, nid):
                                                return "/home/888"
                                            @app.route('/index/<int:nid>', redirect_to=func)

舉例使用python

# ============對url最後的/符號是否嚴格要求=========
@app.route('/test',strict_slashes=True)  #當爲True時,url後面必須不加斜槓
def test():
    return "aaa"
@app.route('/test',strict_slashes=False)  #當爲False時,url上加不加斜槓都行
def test():
    return "aaa"

@app.route("/json_test/<int:age>" ,defaults={'age':66})
def json_test(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic) # 轉換json形式

 

帶參數的路由

@app.route('/hello/<name>')
def hello(name):
    return 'Hello %s' % name

@app.route('/hello/<name>_<age>_<sex>')  # 多個參數
def hello(name,age,sex):
    return 'Hello %s,%s,%s' %(name,age,sex)

在瀏覽器的地址欄中輸入http://localhost:5000/hello/Joh,你將在頁面上看到」Hello Joh」的字樣。json

URL路徑中/hello/後面的參數被做爲hello()函數的name參數傳了進來。瀏覽器

 

多個參數session

# 動態路由參數
@app.route("/json_param/<int:age>" ,strict_slashes=False)
def json_param(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic)

 

 

 

 endpoint

當請求傳來一個url的時候,會先經過rule找到endpoint(url_map),而後再根據endpoint再找到對應的view_func(view_functions)。一般,endpoint的名字都和視圖函數名同樣。
實際上這個endpoint就是一個Identifier,每一個視圖函數都有一個endpoint,
當有請求來到的時候,用它來知道到底使用哪個視圖函數
endpoint能夠解決視圖函數重名的狀況

Flask中裝飾器屢次使用
# 驗證用戶裝飾器
def wrapper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        if not session.get("user_info"):
            return redirect("/login")
        ret = func(*args, **kwargs)
        return ret
    return inner

@app.route("/login", methods=("GET", "POST"))
def login():
    # 模板渲染
    # print(request.path)
    # print(request.url)
    # print(request.headers)
    if request.method == "GET":
        print(request.args.get("id"))
        text_tag = "<p>你看見了嗎test:<input type='text' name='test'></p>"
        text_tag = Markup(text_tag)
        return render_template("login.html", msg=text_tag)  # sum = add_sum)
    else:

        # print(request.form)
        # print(request.values.to_dict())   # 這個裏面什麼都有,至關於body
        # print(request.json)  # application/json
        # print(request.data)
        username = request.form.get("username")
        password = request.form.get("password")
        if username == "alex" and password == "123":
            session["user_info"] = username
            # session.pop("user_info")  #刪除session
            return "登陸成功"
        else:
            return render_template("login.html", msg="用戶名或者密碼錯誤")


# endpoint能夠解決視圖函數重名的狀況
@app.route("/detail", endpoint="detail")
@wrapper  # f = route(wrapper(detail))
def detail():
    print(url_for("detail"))
    return render_template("detail.html", **STUDENT)


@app.route("/detail_list", endpoint="detail_list")
@wrapper  # f = route(wrapper(detail_list))
def detail_list():
    return render_template("detail_list.html", stu_list=STUDENT_LIST)


@app.route("/detail_dict")
def detail_dict():
    if not session.get("user_info"):
        return redirect("/login")
    return render_template("detail_dict.html", stu_dict=STUDENT_DICT)

反向生成URL: url_forapp

endpoint("name")   #別名函數

@app.route('/index',endpoint="xxx")  #endpoint是別名
def index():
    v = url_for("xxx")
    print(v)
    return "index"

靜態文件位置

一個Web應用的靜態文件包括了JS, CSS, 圖片等,Flask的風格是將全部靜態文件放在」static」子目錄下。而且在代碼或模板中,使用url_for('static')來獲取靜態文件目錄

app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style.css') }}">
<div class="page">
    {% block body %}
    {% endblock %}
</div>

 

兩個經常使用函數

@app.route("/bo")
def bo():
    # return render_template("bo.html")
    return send_file("s1.py") # 發送文件(能夠是圖像或聲音文件)


@app.route("/json_test/<int:age>" ,defaults={'age':66})
def json_test(age):
    ret_dic = {'name': 'xiaowang', 'age': age}
    return jsonify(ret_dic) # 轉換json形式,幫助轉換爲json字符串, 而且設置響應頭Content-Type: application/json
相關文章
相關標籤/搜索