我愛Flask之URL和Flask檢視介紹

2020-10-17 14:02:16

黃色標註部分重點注意

1. URL與函數的對映

       •一個URL要與執行函數進行對映,使用的是@app.route裝飾器。
       •@app.route裝飾器中,可以指定URL的規則來進行更加詳細的對映,如果現在要對映一個文章篇數的URL,文章篇數的URL是/article/number/,number有可能為1、2、3…,那麼可以通過以下方式來對映:

@app.route('/article/<number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)

       •上述其中,尖括號是固定語法不可改變,表示路由地址中傳入的引數,預設的資料型別是字串。如果需要限制引數型別,則要寫成限制型別:變數名,限制型別包括以下幾種:

string預設的資料型別,接受任何沒有斜槓 / 的字串。
int整型
float浮點型
path和string作用類似,但是可以傳遞斜槓 /
uuiduuid型別的字串
any可以指定多條路路徑
路由對映測試:
from flask import Flask

app = Flask(__name__)

# 裝飾器,將當前路由對映到指定函數
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

       •我們在瀏覽器中輸入http://127.0.0.1:5000/ycx即可存取到以下頁面:

在這裡插入圖片描述
       •同時我們還可以動態傳入引數,並指定引數型別

from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函數
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>') #規定資料型別為int
def article(number):
    return '這是我的第{}篇文章'.format(number)


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

顯然,此時引數只能是整型數位了不能是其它資料型別

       •一般情況下引數中不能包含 /, 如果要包含 /,必須將資料型別限制為path型別,除此區別之外,path型別與string型別使用基本一樣

如下測試:
from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函數
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>') #path型別可用string 和 /
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

如果為字串型別或者引數中含有 / 時,則匹配comment_list(aid)函數

       •兩個路由存取同一個函數可以用any型別來限制

如下測試:
from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函數
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>')
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


@app.route('/<any(list,dict):url_path>/')
def message(url_path):
    if url_path == 'list':
        return '當前路由是list'
    else:
        return '當前路由是dict'


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

此時存取路由時需要在路徑最後新增 / 才能正常存取,如/<any(list,dict):url_path>/

       •如果不想通過指定子路徑來傳遞引數,也可以通過 ?=的形式來傳遞引數,例如:/article?id=xxx這種情況下,可以通過request.args.get(‘id’)來獲取id的值
       •如果是post方法,則需要通過request.form.get(‘id’)來進行獲取id的值。
       •如果需要在flask中使用上述方法,需先匯入request庫 from flask import request

如下測試:
from flask import Flask, request

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函數
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>')
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


@app.route('/<any(list,dict):url_path>/')
def message(url_path):
    if url_path == 'list':
        return '當前路由是list'
    else:
        return '當前路由是dict'


@app.route('/cx')
def search():
    return request.args.get('name')


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

request.args.get()中傳入的引數未在URL中傳入,會出現報錯,因為URL未傳入name引數,所以request.args.get()方法的值為空,即檢視函數search()返回的值為空,不能渲染,所以會出現報錯
網頁顯示:

在這裡插入圖片描述

有問題可以在評論指正,歡迎討論,謝謝大家!!