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