IDE使用pyCharm。
首先從flask初始化的一個(gè)例子說(shuō)起。 打開(kāi)pyCharm新建一個(gè)Flask的項(xiàng)目之后,會(huì)初始化一個(gè)Flask的程序目錄(假設(shè)創(chuàng)建一個(gè)名為flaskblog的項(xiàng)目)。首先來(lái)看flaskblog.py這個(gè)文件里的代碼: (包含注釋)
#flaskblpg.py#1、初始化:創(chuàng)建一個(gè)程序?qū)嵗齠rom flask import Flaskapp = Flask(__name__)#flask用name這個(gè)參數(shù)決定程序的根目錄,以便稍后能夠找到相對(duì)于程序根目錄的資源文件位置。#2、路由和視圖函數(shù):客戶端把請(qǐng)求發(fā)送給web服務(wù)器,web服務(wù)器再把請(qǐng)求發(fā)送給flask程序?qū)嵗3绦驅(qū)嵗枰缹?duì)每個(gè)URL請(qǐng)求運(yùn)行哪些代碼#所以保存了一個(gè)URL到Python函數(shù)的映射關(guān)系。處理URL和函數(shù)之間的關(guān)系稱為路由。# @app.route('/')flask是使用程序?qū)嵗峁┑腶pp.route修飾器,把修飾的函數(shù)注冊(cè)為路由。@app.route('/user/<name>')#尖括號(hào)中得內(nèi)容就是動(dòng)態(tài)部分,任何能匹配靜態(tài)部分的URL都會(huì)映射到這個(gè)路由上。# flask支持在路由中使用int(如:@app.route('/user/<int:id>'))/float/path類型.path類型也是字符串,但不把斜線視作分隔符,而將其當(dāng)做動(dòng)態(tài)片段的一部分。def hello_world(name):# 視圖函數(shù),返回的響應(yīng)可以是包含HTML的簡(jiǎn)單字符串,也可以是復(fù)雜的表單 return '<h1>Hello,%s!</h1>' %name#3、啟動(dòng)服務(wù)器:程序?qū)嵗胷un方法啟動(dòng)flask集成的開(kāi)發(fā)web服務(wù)器。服務(wù)器啟動(dòng)后會(huì)進(jìn)入輪詢,等待并處理請(qǐng)求。輪詢會(huì)一直運(yùn)行,直到程序#停止,比如按Ctrl-C鍵。if __name__ == '__main__': app.run(debug=True)#啟用調(diào)式模式,ps:flask提供的web服務(wù)器不適合在生產(chǎn)環(huán)境中使用。請(qǐng)?jiān)敿?xì)閱讀注釋,然后在pyCharm中選中flaskblog.py運(yùn)行(Run),在瀏覽器中測(cè)試。在瀏覽器地址欄中輸入http://127.0.0.1:5000/user/imagineXie進(jìn)行測(cè)試。
請(qǐng)求對(duì)象封裝了客戶端發(fā)送的HTTP請(qǐng)求。在多線程服務(wù)器中,多個(gè)線程同時(shí)處理不同客戶端發(fā)送的不同請(qǐng)求時(shí),每個(gè)線程看到的request對(duì)象必然不同。Falsk使用上下文讓特定的變量在一個(gè)線程中全局可訪問(wèn),與此同時(shí)卻不會(huì)干擾其他線程。
Flask兩種上下文: (1)程序上下文
current_app:當(dāng)前激活程序的程序?qū)嵗齡:處理請(qǐng)求時(shí)用作臨時(shí)存儲(chǔ)的對(duì)象。每次請(qǐng)求都會(huì)重設(shè)這個(gè)變量(2)請(qǐng)求上下文
request:請(qǐng)求對(duì)象,封裝了客戶端發(fā)出的HTTP請(qǐng)求中得內(nèi)容session:用戶會(huì)話,用于存儲(chǔ)請(qǐng)求之間需要“記住”的值的詞典在使用這些變量時(shí),我們需要先激活(push())程序(app_context())或請(qǐng)求上下文,否則會(huì)報(bào)錯(cuò)。
URL映射是URL和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系。Falsk使用app.route修飾器或者非修飾器形式的app.add_url_rule()生成映射。
Falsk為每個(gè)路由都指定了請(qǐng)求方法,這樣不同的請(qǐng)求方法發(fā)送到相同的URL上時(shí),會(huì)使用不同的視圖函數(shù)進(jìn)行處理。
請(qǐng)求鉤子使用修飾器實(shí)現(xiàn)。Falsk支持4種鉤子。
before_first_request:注冊(cè)一個(gè)函數(shù),在處理第一個(gè)請(qǐng)求之前運(yùn)行。before_request:注冊(cè)一個(gè)函數(shù),在每次請(qǐng)求之前運(yùn)行。after_request:注冊(cè)一個(gè)函數(shù),如果沒(méi)有未處理的異常拋出,在每次請(qǐng)求之后運(yùn)行。teardown_request:注冊(cè)一個(gè)函數(shù),即使有未處理的異常拋出,也在每次請(qǐng)求之后運(yùn)行。HTTP響應(yīng)中一個(gè)很重要的部分是“狀態(tài)碼”,默認(rèn)為200,表示請(qǐng)求已被成功處理。
Flask視圖函數(shù)還能返回Response對(duì)象。make_response()函數(shù)可接受1、2或3個(gè)參數(shù),并返回一個(gè)Response對(duì)象。 eg:
from flask import [email protected]('/')def index(): response=make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer',42) return response有一種名為“重定向”的特殊響應(yīng)類型。這種響應(yīng)沒(méi)有頁(yè)面文檔,只告訴瀏覽器一個(gè)新地址用以加載新頁(yè)面。 重定向常使用302狀態(tài)碼表示,指向的地址由Location首部提供。Flask提供redirect()輔助函數(shù)用于生成這種響應(yīng):
from flask import [email protected]('/')def index(): return redirect('http://www/example.com')還有一種響應(yīng)用于處理錯(cuò)誤,由abort函數(shù)生成:
from flask import [email protected]('/user/<id>')def get_user(id): user=load_user(id) if nor user: abort(404)return '<h1>Hello,%s</h1>'%user.name以上例子中,如果URL中動(dòng)態(tài)參數(shù)id對(duì)應(yīng)的用戶不存在,就返回狀態(tài)碼404。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注