1. 程式人生 > >flask框架1

flask框架1

flask框架1

文章目錄

一. flask介紹

二. 虛擬環境 (重點)

  • 虛擬環境: 獨立的python環境, 可以有效的避免框架的多版本衝突問題
    在這裡插入圖片描述
  • 三個命令:
    • 建立虛擬環境 mkvirtualenv -p python3 env20
    • 退出虛擬環境 deactivate
    • 進入虛擬環境 workon env20
    • 檢視所有的虛擬環境 workon 雙擊tab

mac安裝虛擬環境: https://www.jianshu.com/p/dc7ec6a303e3

三. 基本使用

3.1 第一個flask程式

  • 安裝第三方包 pip install flask==0.10.1
  • 檢視已安裝的包 pip freeze
from flask import Flask


# 1.建立web應用
app = Flask(__name__)


@app.route("/")   # 繫結路由: 當訪問指定的URL時, 會呼叫對應的檢視函式
def index
(): # 首頁展示 a = 10 / 20 return "首頁" if __name__ == '__main__': # 2. 執行web應用 (執行flask內建的測試伺服器, 接收將請求並轉發給web應用) # 引數: 1> 繫結的ip 2> 監聽的埠 3> 是否開啟除錯模式 # 萬能ip 0.0.0.0 可以同時接收本機/區域網/外網的請求 # 開啟除錯模式 1> 可以在網頁上顯示python錯誤 2> 更新程式碼後, 會自動重啟伺服器 app.run(host="0.0.0.0", port=8000, debug=True)

3.2 路由的基本定義

  • POSTMAN: WEB開發的除錯工具
from flask import Flask

app = Flask(__name__)


# methods引數用於設定路由支援的請求方式
@app.route('/', methods=['POST', 'GET'])  # 路由必須以路徑分隔符 / 開頭
def index():

    return "index"


if __name__ == '__main__':
    # 記錄了所有的路由規則(URL 支援的請求方式 檢視函式的名字)
    print(app.url_map)
    app.run(debug=True)

3.3 請求物件

3.3.1 基本資料
# 常用屬性 url method headers
print(request.url)  # 請求的URL
print(request.method) # 本次請求的請求方式
print(request.headers)  # 本次的請求頭  類字典物件
print(request.headers["Host"])
print(request.headers.get("Host"))  # 鍵不存在, 不會報錯 推薦
3.3.2 查詢字串 (重點)
  # 獲取查詢字串   一般用於GET傳遞資料    類字典物件
  print(request.args.get("name"))
3.3.3 請求體 (重點)
  • 鍵值對資料 如form表單發出的預設post
print(request.form.get("name"))
  • 檔案 如照片, 頭像
file = request.files.get("avatar")  # type: FileStorage
# 儲存到本地
file.save("image1.jpg")
  • 文字資料 如 html, json
# 獲取文字資料  bytes  類字串物件  包含二進位制資料
# 編碼 文字資料 -> 二進位制   str1.encode("utf-8") = bytes1
# 解碼  二進位制 -> 文字資料   bytes2.decode("utf-8") = str2
data = request.data
# print(data)
# print(type(data))
str1 = data.decode("utf-8")
print(str1)
print(type(str1))

3.4 響應

3.4.1 自定義響應物件
from flask import Flask, make_response

app = Flask(__name__)


# 自定義響應物件
@app.route('/')
def index():

    # 檢視函式返回值可以是str/bytes, 但最終都會被flask框架包裝為Response響應物件
    # return "index"

    # 可以手動包裝響應物件  作用: 自定義響應報文
    response = make_response("index")
    print(response.headers)  # 類字典物件  可以取值和賦值
    return response


if __name__ == '__main__':
    app.run(debug=True)
3.4.2 返回json (重點)
# 返回json
@app.route('/demo1')
def demo1():
    # json 是一種常用的資料交換格式  本質 帶有格式的字串  {}  []  xml
    dict1 = {"name": "zs", "age": 20}

    # dict -> json字串
    json_str = json.dumps(dict1)
    # print(json_str)
    # print(type(json_str))

    # json字串 -> dict
    dict2 = json.loads(json_str)
    print(type(dict2))

    # return json_str

    # flask中內建了jsonify語法, 可以自動將dict轉為json字串, 並且設定響應的content-type為 applictiion/json
    # return jsonify(dict1)
    return jsonify(name="zs", age=20)  # 也支援關鍵字實參形式來設定, 但是資料必須是內建型別
3.4.3 重定向
# 重定向: 跳轉到網路的另一個位置   如:頁面跳轉  a href  js  window.location.href
@app.route('/demo2')
def demo2():
    # return redirect("http://www.baidu.com")
    # return redirect("/demo1")

    # url_for獲取檢視函式的URL
    # url1 = url_for("demo")
    # print(url1)
    
    # return "demo2"
    
    # 開發中經常讓redirect和url_for進行聯用   有利於程式碼升級和重構
    return redirect(url_for("demo"))
3.4.4 自定義狀態碼
# 自定義狀態碼   作用: 方便快速排錯
@app.route('/demo3')
def demo3():
    # 設定第二個返回值, 用於自定義狀態碼 
    return "demo3", 700

4. 異常處理

  • flask中封裝了對於http錯誤的異常處理和主動丟擲
from flask import Flask, abort

app = Flask(__name__)


@app.route('/')
def index():
    # a = 10 / 0

    abort(404)   # 主動丟擲http錯誤
    return "index"


# errorhandler可以捕獲http錯誤, 還可以捕獲系統內建錯誤
@app.errorhandler(404)
def error_404(e):  # 必須設定形參來接收具體的錯誤資訊

    return "您訪問的頁面去浪跡天涯了... %s" % e


@app.errorhandler(ZeroDivisionError)
def error_zero(e):
    return "除數不能為0"


if __name__ == '__main__':
    app.run(debug=True)

四. 狀態保持 (重點)

  • 使用者的訪問狀態進行記錄的機制, 如 使用者是否觀看過幫助資訊, 使用者是否已經登入, 使用者的搜尋記錄等

4.1 cookie

  • 特點:
    • 將資料儲存在客戶端
    • 瀏覽器會自動將該網站的cookie資料發給伺服器
  • 場景: 一般存放一些不太重要的資料, 可以減輕伺服器的儲存壓力

Alt text
在這裡插入圖片描述

  • cookie設定過期時間

  • max-age

    • -1: 瀏覽器關閉時刪除cookie 預設值
    • 0: 立即刪除cookie
    • 正數: max-age=5, 表示5秒後刪除cookie
      在這裡插入圖片描述
  • cookie細節

    • 只要cookie儲存了資料, 無論訪問網站的哪個路由, 瀏覽器都會自動攜帶cookie資料
    • 同源策略: 瀏覽器只會將cookie傳送給對應的網站(ip/域名是否一致)
    • cookie也可以前端進行設定

4.2 session

  • 特點:

    • 將資料儲存在服務端
    • session機制是需要依賴cookie機制(sessionid需要儲存到cookie中)
  • 場景: 一般存放一些重要/敏感的資料, 安全性更高
    在這裡插入圖片描述

  • 登入的基本實現

from flask import Flask, request, redirect, url_for

app = Flask(__name__)


@app.route('/')
def index():

    return "首頁"


# 使用者登入
@app.route('/login', methods=['GET', 'POST'])
def login():
    # 判斷是否為GET請求
    if request.method == 'GET':  # 顯示頁面
        # 讀取網頁內容, 返回html字串
        with open("login.html") as f:
            html_str = f.read()
            return html_str

    # POST處理  提交資料
    # 獲取引數
    username = request.form.get("username")
    password = request.form.get("password")
    # 校驗密碼
    if username == "laowang" and password == "123":
        # 如果登入成功, 跳轉到首頁
        return redirect(url_for("index"))
    else:
        return "登入失敗"



if __name__ == '__main__':
    app.run(debug=True)
  • session實現免密碼登入

在這裡插入圖片描述