1. 程式人生 > >Flask的第一個程式——hello world

Flask的第一個程式——hello world

一個簡單的Flask程式

步驟:
	1.匯入Flask
	2.建立Flask應用例項
	3.定義檢視函式並繫結URL
	4.啟動伺服器
# 匯入Flask(從falsk包中匯入Flask類)
from flask import Flask
建立Flask類的物件:Flask類原始碼規定此處必須要由一個引數:import_name,其餘的都有預設值,因此必須要傳入引數,但是為什麼要傳入__name__?
#同時原始碼規定這個引數必須要是字串.__name__在這個檔案中就是'__main__',但是不能是python中已有的標準模組名.
# 傳入__name__的原因:用來確定程式例項所在的路徑,方便訪問預設資料夾static,同時對於靜態請求的訪問和處理更方便.

app = Flask(__name__)

# endpoint:就是指檢視函式名的字串形式


# 定義路由的url地址:括號裡必須要由引數(第一個引數是Rule),同時必須要是字串形式,還要是用/開頭.methods可以修改請求方式,但是需要是列表格式。可以放多種請求方式。
@app.route('/' , methods=['POST'])
def hello():
return 'hello world',404

# 啟動伺服器
# __name__表示當前模組名.如果是在自身模組中,就是__main__如果成為是被匯入檔案的時候,表示的就是檔名
if __name__ == '__main__':
 	# 檢視路由對映:具有的url地址和試圖函式名的關係
	print(app.url_map)
	app.run(debug=True)
	#debug調式模式:幫助定位錯誤資訊,同時可以自動跟蹤程式碼變化。
控制檯輸出結果為:
Map([<Rule '/' (OPTIONS, GET, HEAD) -> hello>,
<Rule '/static/<filename>' (OPTIONS, GET, HEAD) -> static>])
 Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 Map和Rule分別是類,Map就是指路由對映,用列表儲存,第二個引數/,表示的就是裝飾器儲存的Rule規則,接下來的引數代表請求方法,最後一個引數代表檢視函式名的字串形式,就表示斷點(endpoint)。
注意return返回的hello world,不是僅僅只反映回的這個字串,而是一系列的響應報文。
預設的埠號是5000:在原始碼內有定義。
補充:
	1.如果定義了兩個同樣的檢視函式,即檢視函式名重名,會導致無法執行程式。
	2.如果定義了不同的試圖函式名,但是url路徑是一樣的,這個結果是可以執行,但是瀏覽器頁面的返回結果是取決於第一個檢視函式的返回值,這取決於Map的容器型別是列表,是按照順序查詢的,先找到就可以停止了。因此url地址是可以重複的。
	3.不同的http請求方法是對應不同的操作,GET查詢,POST插入,PUT修改,DELETE刪除。 
	4.注意return的返回值可以是其他的資料型別嗎?還是隻能是字串形式?
		字典型別:會報錯誤,500伺服器錯誤,啟動debug除錯之後,顯示字典型別錯誤。字典屬於python資料型別,瀏覽器無法識別,同時列表也是不可以。但是元組形式是可以的,但是需要是(str,int)第一個引數就是返回的字串數值。第二個數字以狀態碼的形式返回。json也是可以返回的。 
	5.我們可以不使用裝飾器定義路由url地址嗎?
		答案自然是肯定的,我們可以檢視route的原始碼,發現其實內部實現的功能程式碼是:
		self.add_url_rule(rule,endpoint,f,**options)
		return f
		實現裝飾器功能程式碼:
		app.add_url_rule('/' ,'hello' ,hello)
		前後hello代表的含義不一樣,第一個是但會的端點(試圖函式名的字串形式),第二個代表試圖函式名,注意不能加()
	6.程式碼在啟動後存在路由對映存在一個預設的路由對映,會有一個靜態的static路由對映。是flask自己實現的,方便靜態路徑訪問。
	7.return同樣可以在後面返回狀態碼:404,在這個過程中,即使是瀏覽器不存在狀態嗎,也是可以返回的。只不過顯示UNKNOWN,這個功能可以用來實現前後端的資料互動。

相關配置引數

	debug=True 就屬於一個配置資訊
	載入配置檔案有三種實現方式:
	1.載入配置物件 (config是flask的內建配置物件)
		前提:需要在當前路徑下有一個名字為config.py的檔案,裡面定義了一個Config的類,其中定義 debug=True
		from config import Config
		app.config.from_object(Config)
	2.載入配置檔案
		前提,有個config。ini的檔案嗎,裡面定義了debug=True
		app.config.from_pyfile('config.ini')
	3.載入環境變數
		app.config.from_envvar(‘SET’)
		此時更改環境變數,在其中新增一個SET,對應的是有debug除錯的檔案。
		注意 :重點掌握第一種,因為其是定義一個類,擴充套件性很強,可以將其Config設定為基本配置類。
		#基本配之類:
		class Config:
			DEBUG = None
		#開發模式配置
		class DevelopmentConfig(Config):
			DEBUG = True
		#生產模式配置
		class ProductionConfig(Config):
			DEBUG = False
		(debug除錯模式一般只在開發模式使用)
		然後定義一個字典對映:
		config_dict = {
			'dev':DevelopmentConfig,
			'pro’: ProductionConfig
		}
		然後在開發檔案中倒入這個字典,然後在家在配置檔案中使用字典config['div']來決定使用什麼配置檔案。

重定向(redirect/url_for)

1.	# 匯入flask內建函式redirect
	from flask import Flask,redirect
	# 重定向:重新發送網路請求
	app = Flask(__name__)
	@app.route('/')
	def hello():
   	 	# 重定向到百度
   	 	#當專案的路徑url或者是檔案發生變化時,可以使用重定向。
    	return redirect('http://www.baidu.com')

	if __name__ == '__main__':
    	app.run()
我們同樣是訪問根路徑,此時跳轉到百度頁面,同時注意瀏覽器的狀態碼為302.同時redirect的引數可以用變數來傳入。
**2. url_for方式**
	
	# 匯入flask內建函式redirect
	from flask import Flask,url_for
	app = Flask(__name__)
	@app.route('/')
	def index():
    # 重定向到百度
    # 當專案的路徑url或者是檔案發生變化的時候,可以使用
    return redirect('http://www.baidu.com')
@app.route('/for')
def demo_url_for():
    return redirect(url_for(index))

if __name__ == '__main__':
    app.run()
    注意url_for裡面的引數是endpoint(端點),而redirect接收的引數就是具體的地址。相比而言,重定向是使用url更方便,會使程式碼更靈活。