python就業班第30天----Flask路由和檢視
Flask簡介
服務端不能主動向客戶端通訊,只有瀏覽器進行請求,伺服器才能做出響應
Flask:輕量級,沒有發郵件,不能連資料庫,需要安裝拓展包等。可拓展性強
djano:提供相對完善功能
tornado:偏嵌入,非阻塞伺服器
flask組成:兩個核心 werkzeug工具箱:負責路徑(url)的匹配 jinja2:用來生成模板(html) 額外的擴充套件包: flask_Sqlacemy:資料庫 flask_Mail:發郵件 …
Flask:英文,燒瓶的意思
虛擬環境
虛擬環境:非常方便呼叫各種版本框架
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裡面的環境全部裝好
圖示綠色V或者pycharm裡面終端,能看是否在虛擬環境
例:helloworld編寫
from flask import Flask
app = Flask(__name__)
@app.route("/")
def helloworld():
return "hello world"
if __name__ == "__main__":
app.run()
ctrl+p:可以提示你寫什麼形參
return裡面也有很多東西
路由
通過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)
// 不能被例項化
格式:路徑 訪問方式 檢視函式
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’}
手動建立響應體物件,使用make_response(需要匯入)
from flask import Flask,make_response
...
response = make_response('響應體')
response.status = '888 XIAGAO'
response.headers['Content-type'] = 'application/json'
return response
使用jsonify,生成jsonGS資料響應體:
需要匯入jsonify
from flask import jsonify
返回json資料:
dict = {"name":"zhangsan", "age":13}
return jsonify(dict)
簡化格式:
return jsonify(name="zhangsan",age="12")
響應體重定向: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)
...
資源路徑可以是伺服器內部的,也可以是外部的
@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()
注意: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執行時有預設三個引數
如果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')
// 不懂,不寫了
pycharm裡面檔案改名:shift+F6