1. 程式人生 > >python就業班第30天----Flask路由和檢視

python就業班第30天----Flask路由和檢視

Flask簡介

服務端不能主動向客戶端通訊,只有瀏覽器進行請求,伺服器才能做出響應

Flask:輕量級,沒有發郵件,不能連資料庫,需要安裝拓展包等。可拓展性強

djano:提供相對完善功能

tornado:偏嵌入,非阻塞伺服器

flask組成:兩個核心 werkzeug工具箱:負責路徑(url)的匹配 jinja2:用來生成模板(html) 額外的擴充套件包: flask_Sqlacemy:資料庫 flask_Mail:發郵件 …

Flask:英文,燒瓶的意思

虛擬環境

虛擬環境:非常方便呼叫各種版本框架

插入圖jybday30-1

virtualenv:虛擬環境 virtualenv --version:檢視版本 mkvirtualenv:建立虛擬環境 workon

:檢視當前有多少個虛擬環境 mkvirtualenv 虛擬環境名字:預設建立python2的直譯器,出現done建立完成 deactivate:退出虛擬環境 rmvirtualenv 虛擬環境名:刪除虛擬環境 mkvirtualenv -p python3 虛擬環境名字:建立python3.x的直譯器的虛擬環境 pip install flask==0.10.1:安裝flask pip freeze:檢視當前所在虛擬環境的環境 work on 虛擬環境:進入虛擬環境 pip install -r txt的檔名:一次把txt裡面的環境全部裝好

插入圖jybday30-2 圖示綠色V或者pycharm裡面終端,能看是否在虛擬環境

例:helloworld編寫

from flask import Flask
app = Flask(__name__)
@app.route("/")
def helloworld():
	return "hello world"

if __name__ == "__main__":
	app.run()

ctrl+p:可以提示你寫什麼形參

插入圖jybday30-3 return裡面也有很多東西 插入圖jybday30-4-7 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

路由

通過Flask建立應用程式物件 引數1[必須]: name 字串,如果從當前檔案啟動它的值是__main__ 引數2[可選]: static_folder,用來存放於靜態資源(html,css,js,imgs)的路徑,預設值是’statc’ 引數3[可選]: static_url_path,靜態資料夾資源的訪問地址,預設值是’/static’ 引數4[可選]: template_folder,預設值是templates

檢視函式:需要返回到頁面顯示的,必須有返回值 name:執行在自己的py檔案裡,就是__main__ 當程式執行起來後,檢視哪些檢視函式可以進行訪問:通過url_map 格式:直接列印 print(app.url_map) // 不能被例項化

插入圖jybday30-8

格式:路徑 訪問方式 檢視函式

Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
 <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])

路由器引數:methods=[“請求方式1” , “請求方式2” , …] 一個檢視函式寫好後,預設是GET請求,指定其他格式,方式:

@app.route("路徑",methods=["請求方式1" , "請求方式2", ...])

指定的請求方式: 例:app.route("index",methods=["POST" , "GET"]) 下面那個被裝飾的函式稚嫩和通過POST和GET方式訪問

405:請求方式不被允許 使用postman訪問

動態路由(選擇器)

動態路由(選擇器):在訪問的時候可以指定引數到地址中,格式: app.route("路徑/<資料型別:被裝飾函式的形參名(之一)>") 資料型別:int,float,path(字串,預設,預設的path可省略) 轉換器:<>裡面寫的內容 例:

@app.route("index/<number>",methods=["POST","GET"])
def hello(number):
	return number
@app.route("/<int:number>")
def get_int_number(number):
	return "the int number is %d"%number

如果滿足不了需求,可以自定義轉換器(自定義資料型別,使用正則) 使用者自定義轉換器: 比如需要接收三個整數 格式:

  • 1.自定義類,繼承BaseConverter
  • 2.編寫方法,init
  • 3.初始化子類、變數父類
  • 4.將自定義變數新增到轉換列表中

例:首頁可接收3位數、4位數,/hello接收電話號碼

from flask import Flask
from werkzeug.routing import BaseConverter
class MyRegexConverter(BaseConverter):
	def __init__(self,map,regex):
		super(MyRegexConverter,self).__init__()
		self.regex = regex
	app = Flask(__name__)
	app.url_map.converters['re'] = MyRegexConverter    # 新增自定義變數re
	# print(app.url_map)

@app.route('/re("\d{3}"):number')
def hello_world(number):
	return 'the number is %s'%number

# 接收4位數
@app.route('/<re("\d{4}"):number>')
def get_four_number(number):
	return "the four number is %s"%number

# 接收手機號
@app.route("/hello<re('1[3456789]\d{9}'):mobile>")
def get_mobile_number(mobile):
	return "the mobile number is %s"%number

if __name__ == "__main__":
	app.run()

敲完super()按Tab,自動補全 繼承不寫super,也會預設呼叫super

響應

檢視函式的返回值(響應):

  • 1.直接響應體 return ‘hello’
  • 2.直接返回響應體,狀態碼 return ‘hello’ , 666 return ‘hello’ , “666 BIG ERROR”
  • 3.直接返回響應體,狀態碼,響應頭 return ‘hello’ , 666 , {‘name’:‘zhangsan’ , ‘Content-Type’:‘application/json’}

插入圖jybday30-9

手動建立響應體物件,使用make_response(需要匯入)

from flask import Flask,make_response
...
response = make_response('響應體')
response.status = '888 XIAGAO'
response.headers['Content-type'] = 'application/json'
return response

插入圖jybday30-10

使用jsonify,生成jsonGS資料響應體: 需要匯入jsonify from flask import jsonify 返回json資料: dict = {"name":"zhangsan", "age":13} return jsonify(dict) 簡化格式: return jsonify(name="zhangsan",age="12")

插入圖jybday30-11

響應體重定向:redirect(需要匯入) 重定向狀態碼為302

from flask import Flask,redirect
app = Flask(__name__)
@app.route('/')
def hello():
	response = redirect('/重定向後的資源路徑')
	return response
@app.route('/重定向後的資源路徑')
def hello_2():
	return jsonify(name='zhangsan',age=18)
...

插入圖jybday30-12

資源路徑可以是伺服器內部的,也可以是外部的

@app.route('jingdong')
def jingdong():
	return redirect('http://www.tmail.com')

url_for:反解析,根據檢視函式的名稱找到檢視函式的路徑地址,可以攜帶引數(形參名=引數值) 形參指的是路由函式的形參

需要匯入:from flask import Flask,url_for,redirect

格式:url_for('函式名' , key=value) 有返回值,是資源路徑的字串

from flask import Flask,url_for,redirect
app = Flask(__name__)
@app.route("/jingdong")
def jingdong():
	print(app.url_for('taobao',token=111))
	return redirect(url_for('taobao',token=111))

@app.route('/taobao/<int:token>')
def taobao(token):
	if(token==111):
		return "歡迎京東使用者,光臨淘寶,給你打骨折"
	elif(token==222):
		return "歡迎易迅使用者,光臨淘寶,給你打5折"
	else:
		return "小樣,你來不來無所謂"

if __name__ == "__main__":
	app.run()

插入圖jybday30-13 、jybday30-14

注意:redirect和url_for經常配合使用,可以傳遞引數

註釋換顏色: “”"

“”"""

處理錯誤:abort和errorhandler

包不知道知道在哪導,Alt+Enter

403:禁止訪問 404:找不到資源 405:請求方式錯誤 500:伺服器錯誤

匯入abort:from flask import Flask,abort errorhandler不需要匯入

格式: abort(代號) 丟擲錯誤代號 errorhandler(代號) 捕捉錯誤代號(不管是不是abort()產生的都捕捉),作用是自定義異常頁面(只要產生裡面的代號,不管是不是由abort產生的,都執行) 注意:沒有下劃線

app.abort(403) 返回403,直接不往下走了,該檢視函式的return 不會執行

from flask import Flask
from flask import abort
app = Flask(__name__)

@app.route("/<int:age>")
def playgame(age):
	if(age<18):
		abort(403)
	elif(age<20):
		abort(404)
	else:
		return "helloworld"

@app.errorhandler(403)
def no_pass(e):
	print(e)
	return "禁止訪問該資源"

@app.errorhandler(404)
def page_not_found(e):
	print(e)
	return "伺服器搬家了"

if __name__ == "__main__"::
	app.run()

== 注意:不能自己定義狀態碼 (常用403/405)==

路由引數

app執行時有預設三個引數

插入圖jybday30-15

如果debug設定為True

  • 1.程式碼改的不需要重新啟動程式,只需要ctrl+s即可
  • 2.程式碼如果報錯,友情提示

app.run(port=5002,debug=True)

ip(host)寫錯0.0.0.0,可以跨系統訪問(無所謂,需要配置vmware)

app_config

app_config:整個應用程式的所有配置資訊屬性靠app_config啟動,它掛了,伺服器就完了

通過載入應用程式的配置資訊的三種方式 1.通過類裡面的配置資訊載入 app.config.from_object(類名) 2.通過配置檔案的方式載入 app.config.from_pyfile('檔案.txt 或 檔案.ini') 3.通過環境變數(瞭解) app.config.from_envvar('FLASKING') // 不懂,不寫了

插入圖jybday30-16/17/18 在這裡插入圖片描述 在這裡插入圖片描述

pycharm裡面檔案改名:shift+F6