NO IMAGE

Flask檢視

Flask框架的基本認識

flask 是由python語言實現的

特點:輕量,簡潔,擴充套件性強

核心:werkzeug 和 Jinja2

環境的配置和安裝

為什麼要配置虛擬環境?

各個專案有獨立的執行空間,彼此互不影響,python直譯器彼此互不影響.

配置安裝

  1. 建立虛擬環境 mkvirtualenv -p python3
  2. 移除虛擬環境 rmvirtualenv
  3. 進入虛擬環境 workon
  4. 退出虛擬環境 deactivate

依賴包

  1. 批量匯出 pip freeze > requirements.txt
  2. 批量安裝 pip install -r requirements.txt

基本程式的實現

__name__ 確定程式所在的位置 可以傳入__main__,不能傳入數值,可以傳入字串

檢視函式

route方法必須傳入一個字串形式的url路徑,路徑必須以斜線開始

url可以重複嗎?檢視函式可以重複嗎?

url可以重複,url可以指定不同的請求方式

url 查詢檢視 從上往下執行,如果找到,不會繼續匹配

檢視函式不能重複,函式只允許有一個返回值

裝飾器路由的實現

建立一個url 預設會有兩個對映

  1. Rule 儲存url對映的檢視函式名,儲存的路由對映(儲存url路徑和檢視函式的對映關係)
  2. Map 儲存所有rule物件,一個獨立的flask專案只有一個map物件
  3. MapAdapter 匹配url和檢視函式

除錯模式(DEBUG)

特點: 動態載入程式碼,不用重啟伺服器,會除錯錯誤資訊;生產模式不能開啟

載入配置檔案

  1. 載入配置物件 app.config.from_object(配置物件)
  2. 載入配置檔案 app.config.from_pyfile(配置檔案)
  3. 載入環境變數 app.config.from_envvar(環境變數)

重定向(redirect)

本質: 把當前請求返回的響應,向其他url再次傳送請求,跳轉頁面.

作用: 當專案檔案或目錄發生改變時,可以使用重定向.

缺點: redirect函式接收的引數為固定url,不建議直接使用,擴充套件性不強,需要配合url_for 實現重定向,接收的引數為函式名,

# 重定向
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def index():
a = 'https://www.baidu.com'
return redirect(a)
if __name__ == '__main__':
app.run()
# redirect   url_for
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def center():
return 'hello Flask!'
@app.route('/get')
def geturl():
return redirect(url_for('index'))
@app.route('/c')
def index():
a = 'https://www.baidu.com'
return redirect(a)
if __name__ == '__main__':
app.run(port='8080')

狀態碼

return 後面可以自定義不符合http協議的狀態碼,實現前後端資料互動,也可以返回符合http協議的狀態碼,相當於修改了框架封裝好的預設響應報文中的狀態碼

異常處理(abort)

abort 函式接收的引數為符合http協議的狀態碼,作用為配合errorhandler修飾的函式必須傳入引數,引數為錯誤異常,實現自定義錯誤頁面

# 異常處理
from flask import Flask, abort
import flask_00.Configuration
app = Flask(__name__)
app.config.from_object(flask_00.Configuration.Config)
@app.route('/center')
def center():
abort(403)
@app.errorhandler(403)
def errorhandler(e):
return '伺服器已經理解請求,但是拒絕執行它。'
@app.route('/')
def index():
return 'hello python',999
if __name__ == '__main__':
print(app.url_map)
app.run(port='8080')

JSON

JavaScript Object Notation
基於鍵值對的字串,用來實現資料的傳輸

前端 —> json <—-python

JSON.parse(info): 把json轉成物件
JSON.stringify(): 把物件轉成json

json.dumps(info): 把字典轉成json
json.loads(info): 把json轉成字典

建議

建議使用Flask封裝的jsonfy方法,不僅返回json資料,可以指定響應的資料型別

傳參

固定引數

<args> 固定引數,必須傳給檢視函式,轉換器限制引數的資料型別

# 給路由傳引數
# 語法格式 <args>
#網址後面輸入引數 
from flask import Flask
app = Flask(__name__)
@app.route('/<args>')
def index(args):
return 'hello %s' %args
if __name__ == '__main__':
app.run()

轉換器

為什麼自定義轉換器?

已有的轉換器無法滿足需要,無法定義長度.

查詢字串

url?後面的,以=進行傳參,以&進行分隔,叫做查詢字串

獲取值 request.args.get(key)
獲取表單資料 request.form.get(表單中欄位的key)
獲取表單的檔案 request.files.get(表單中的檔案key)
cookies: request.cookies.get(cookie的key)

request

屬性說明型別
data記錄請求的資料,並轉換為字串*
form記錄請求中的表單資料MultiDict
args記錄請求中的查詢引數MultiDict
cookies記錄請求中的cookie資訊Dict
headers記錄請求中的報文頭EnvironHeaders
method記錄請求使用的HTTP方法GET/POST
url記錄請求的URL地址string
files記錄請求上傳的檔案*

請求鉤子

兩種請求前執行

  1. before_first_request 在處理第一個請求前執行(只執行一次)
  2. before_request 每次請求前都執行

兩種請求後執行

  1. after_request 沒有錯誤,每次請求後執行
  2. teardown_request 每一次請求之後都會呼叫,接受一個引數(引數時伺服器出現的錯誤資訊)

裝飾器路由的具體實現

  1. Rule類 ——用來構造不同的URL模式的物件,路由URL規則
  2. Map類———儲存所有的URL規則和一些配置引數
  3. MapAdapter類—-負責協調Rule做具體的匹配的工作
  4. BaseConverter的子類—–負責定義匹配規則

上下文

請求上下文: 封裝了客戶端和伺服器互動過程中的資訊

  1. request 表示請求的引數資訊 user = request.args.get(‘user’) –> 獲取的是get請求的引數
  2. session 表示使用者資訊 記錄使用者資訊 session[‘name’]=user.id 獲取使用者資訊 session.get(‘name’)

應用上下文: 封裝了程式執行過程中的一些配置資訊,比如呼叫的函式,模組,載入的工具類,檔案等

  1. current_app 生命週期最長,用來記錄專案日誌
  2. g物件 可以在請求過程中臨時儲存資料

狀態保持

為什麼要進行狀態保持?

http協議是一種無狀態協議,瀏覽器請求伺服器是無狀態的.

http協議底層是TCP/IP協議,三次握手,四次揮手,返回資料後會斷開連線,下次連結相當於新的請求,不會記得剛剛的請求資訊.

cookie :在伺服器中生成,儲存在瀏覽器中,不安全.

session:session_id儲存在瀏覽器中,它的值存在伺服器中,相對安全.

cookie

from flask import Flask,make_response,request
from setting import Config
app = Flask(__name__)
app.config.from_object(Config)
@app.route('/')
def hello_world():
# 使用響應物件,設定cookie
response = make_response('set cookie')
# 設定cookie,並制定有效期
response.set_cookie('name','python2',max_age=60)
return response
# 獲取cookie
@app.route('/get')
def get_cookie():
name = request.cookies.get('name')
return name
@app.route('/hello')
def index():
return 'hello world'
# 狀態保持---session:session基於cookie實現
# session資料儲存在記憶體型資料庫,redis、
# 設定session
@app.route('/set')
def set_session():
session['name']='python02'
return 'set session success!'
# 獲取session
@app.route('/get_session')
def get_session():
name = session.get('name')
return name
if __name__ =='__main__':
app.run()

Flask_script 擴充套件包

from flask import Flask
# 匯入Flask_script擴充套件包
from flask_script import Manager
# 匯入配置檔案
from setting import Config
app = Flask(__name__)
app.config.form_object(Config)
# 例項化管理器物件
manager = Manager(app)
@app.route('/')
def hello_world():
return 'hello world!'
if __name__ == '__main__':
# 代替app.run()
# 在終端使用命令動態指定host和port,在生產環境下不用手動修改程式碼的host和port
# 在pycharm執行需要新增runserver引數
manager.run()

模板template

reader_template 函式呼叫了模板引擎Jinja2