六安網(wǎng)站推廣獲客app第一接單網(wǎng)app地推和拉新
路由
路由的作用是將 HTTP 請求的 URL 路徑映射到相應(yīng)的函數(shù)處理程序。這樣我們在開發(fā)過程中,就能將不同的 URL 路徑與相應(yīng)的函數(shù)處理程序關(guān)聯(lián)起來,從而實(shí)現(xiàn)對(duì) Web 應(yīng)用的靈活控制。
路由可以分為靜態(tài)路由和動(dòng)態(tài)路由。兩者主要是在形式上有一些區(qū)別,通常靜態(tài)路由使用 @app.route(‘/’) 這樣的裝飾器形式。
而動(dòng)態(tài)路由會(huì)使用變量名 ,形式通常為 @app.route(‘/’, )。當(dāng)然,其中還可以傳入其他類型的參數(shù),如整型、浮點(diǎn)型,甚至 Path 路徑等。
靜態(tài)路由
路由的裝飾器形式是 @app.route(‘/’),裝飾器中的第一個(gè)參數(shù)是 ‘/’,括號(hào)當(dāng)中的斜杠表示項(xiàng)目根路徑。
靜態(tài)路由的工作機(jī)制很容易理解:在我們的項(xiàng)目開發(fā)過程中,都是在根路徑的基礎(chǔ)上去修改 URL,對(duì)于不同的 URL 需要使用裝飾器的方式來綁定不同的視圖函數(shù)。
裝飾器的重要參數(shù)
methods 參數(shù)
methods 是當(dāng)前視圖函數(shù)支持或者說函數(shù)指定的 HTTP 請求方法,比如POST
、GET
等
from flask import Flask, request
app = Flask(__name__)
@app.route('/message', methods=['POST'])def message():name = request.form['name']location = request.form['location']age = request.form['age']return f'Hi, {name} ,you have live in {location} for {age} years!'
if __name__ == '__main__':app.run()
methods 參數(shù)主要用來指定函數(shù)的請求方法。在上面的案例中,路由裝飾器的 methods 參數(shù)指定 message() 函數(shù)使用 POST 請求方法。在 message() 函數(shù)里的參數(shù) name、location、age 使用 request 方法從表單中獲取數(shù)據(jù),message() 函數(shù)最后返回了表單中的名字、地址和年齡。
當(dāng)用戶在提交表單數(shù)據(jù)的時(shí)候,(你可以理解為前端設(shè)計(jì)了一個(gè)小框,你在框內(nèi)輸入東西然后點(diǎn)擊回車,這個(gè)過程就是在提交表單數(shù)據(jù),即POST),Flask 會(huì)自動(dòng)調(diào)用視圖函數(shù) message(),并且從請求當(dāng)中獲取提交的數(shù)據(jù)。最后,我們將提交的數(shù)據(jù)返回并展示給用戶。這就是 methods 核心作用。
endpiont 函數(shù)
Flask 路由裝飾器 @app.route 中的 endpoint 參數(shù)是一個(gè)函數(shù),用于指定要處理的 URL 的名稱。這個(gè)參數(shù)可以是一個(gè)字符串,用于匹配要處理的 URL,也可以是一個(gè)函數(shù),用于生成 URL
簡單來說,就是指定該路由裝飾器會(huì)調(diào)用哪個(gè)函數(shù),本來不指定endpoint 的時(shí)候都會(huì)默認(rèn)認(rèn)為該路由是下面的函數(shù),如果添加了endpoint參數(shù),就會(huì)調(diào)用指定的函數(shù),主要作用是實(shí)現(xiàn)函數(shù)的復(fù)用,可以讓 Flask 能夠處理相同 URL 的請求。比方說,如果有多個(gè)處理相同 URL 的視圖函數(shù),但是它們使用不同的 endpoint 參數(shù),Flask 就會(huì)根據(jù)傳入的 endpoint 參數(shù)來選擇正確的視圖函數(shù)。
from flask import Flask
app = Flask(__name__)
@app.route('/hello', endpoint='hello_world')
def hello_world(): return 'Hello, World!'
if __name__ == '__main__':app.run()
url_for 裝飾器
url_for 是一個(gè)用于生成 URL 的裝飾器,接受函數(shù)名作為為第一個(gè)參數(shù),返回的是該函數(shù)對(duì)應(yīng)的裝飾器的路徑,主要是配合redirect()函數(shù)的使用
from flask import Flask, escape, url_forapp = Flask(__name__)@app.route('/')
def index():return 'index'@app.route('/login')
def login():return 'login'@app.route('/user/<username>')
def profile(username):return '{}\'s profile'.format(escape(username))# url_for可以規(guī)定這些函數(shù)的url地址
with app.test_request_context():print(url_for('index')) #輸出/print(url_for('login')) #輸出/loginprint(url_for('login', next='/')) #輸出/login?next=%2Fprint(url_for('profile', username='John Doe')) # 輸出/user/John%20Doe
redirect_to
redirect_to 是重定向裝飾器。當(dāng)用戶點(diǎn)擊路由跳轉(zhuǎn)鏈接時(shí),瀏覽器會(huì)發(fā)送一個(gè) HTTP 重定向請求,Flask 路由裝飾器 redirect_to 可以捕獲這個(gè)重定向請求,并將用戶重定向到目標(biāo) URL。
應(yīng)用 redirect_to 裝飾器的重點(diǎn),就是了解它需要接收一個(gè)參數(shù),這個(gè)參數(shù)就是重定向后要跳轉(zhuǎn)到的目標(biāo) URL,會(huì)直接跳到這個(gè)重定向后的URL
通常配合url_for使用,因?yàn)閡rl_for會(huì)返回一個(gè)URL,而redirect_to需要傳的就是一個(gè)URL路徑
request對(duì)象
request 是一個(gè)非常有用的對(duì)象,它包含了客戶端與服務(wù)器之間的所有請求和響應(yīng)數(shù)據(jù)。
在 Flask 中,視圖函數(shù)的 request 對(duì)象通常是由客戶端發(fā)送給服務(wù)器的第一個(gè)請求對(duì)象,它包含了客戶端發(fā)送給服務(wù)器的所有數(shù)據(jù),比如后面這些信息。
- 請求頭信息:如 Accept、Content-Type 等
- 請求的 URL 參數(shù) request.url
- 發(fā)送給服務(wù)器的請求體數(shù)據(jù) request.json
- 請求方法 request.method
- 表單數(shù)據(jù),即 POST 請求中傳遞的數(shù)據(jù) request.form
案例實(shí)戰(zhàn)
- get 輸入到URL內(nèi),按下回車,request相當(dāng)于是URL內(nèi)的東西,客戶端會(huì)從URL內(nèi)得到request,所以是服務(wù)器到客戶端
- post,我們在框內(nèi)輸入,按下回車,相當(dāng)于客戶端發(fā)往服務(wù)器了,request是從客戶端發(fā)往服務(wù)器的請求
from flask import Flask, render_template, request, redirect, url_forapp = Flask(__name__)@app.route('/')
def index():return render_template('practice_2_index.html')@app.route('/<code>', methods=['GET'])
def check_(code):Cipher = '路由裝飾器'if request.method == 'GET' and code == Cipher:return '使用GET方法,口令正確'else:return redirect(url_for('failure'))@app.route('/check', methods=['POST'])
def check():Cipher = '路由裝飾器'ci = request.form.get('cipher')if request.method == 'POST' and ci == Cipher:return redirect(url_for('success'))else:return redirect(url_for('failure'))@app.route('/success')
def success():return '暗號(hào)對(duì)接成功!'def failure():return '暗號(hào)對(duì)接失敗!'if __name__ == '__main__':app.run()