Flask 簡單使用,這一篇就夠了!

#Flask 安裝依賴包及做用
- jinja2 模板語言  (flask依賴包)
- markupsafe   防止css攻擊  (flask依賴包)
- werkzeug  --wkz 相似於django中的wsgi,承載服務  (flask依賴包)

1.1Flask啓動

# 三行啓動
from flask import Flask
app = Flask(__name__)
app.run("0.0.0.0",9527)  #監聽地址,監聽端口

1.2 Response

  1. return "字符串" -->httpresponse
  2. return render_template('html文件',變量='字符串') -->默認存儲位置是remplates,返回模板,依賴markupsafe包
  3. return redirect("/login") -->重定向 在響應頭中加入-location:url地址,而後跳轉
  • 特殊的Response
  1. return send_file("文件名稱或者文件路徑+文件名稱") -->打開文件,返回文件你內容,自動識別文件類型,在響應頭中加入content-Type:文件類型
  2. return jsonify({k:v}) -->返回標準格式的json字符串,在響應投中加入content-Type:appcation/json
    • 在Flask 1.1.1版本中,直接返回dict時,本質上是在運行jsonify
    • 在Flask1.1.1中,能夠直接返回字典,flask默認先把字典序列化以後再返回,在content-type中加入application/json

1.3 FLask Request

  • request.from 獲取FormData中的數據(相似Djnago中的request.POST)
    • to_dict() 轉化爲相似字典類型,能夠經過get和[key]取值,[key],當key不存在時,出現KeyError錯誤
  • request.args 獲取url中的數據(相似Djnago中的request.GET)
    • to_dict() 轉化爲相似字典類型,能夠經過get和[key]取值,[key],**當key不存在時,出現KeyError錯誤
  • request.files 獲取Fome中上傳文件:
  • request.json
    • 若是請求中存在 Content-Type:application/json ,那麼請求體中的數據 被序列化到 request.json 中,而且以 以字典的形式存放
  • request.data
    • 若是請求中 存在Content-Type 中不包含 Form 或 FormData ,保留請求體中的原始數據,是base類型 b" ".存放
  • request.method #請求方法
  • request.host #主機位: 127.0.0.1:5000
  • request.url #完整的url,包括參數
  • request.path #請求路徑,路由地址
  • request.cookies #字典獲取瀏覽器請求時帶上的cookie
  • request.files # request文件,返回filestorage,.save保存文件
  • request.heads 獲取請求頭

1.4 Flask session

  • 交由客戶端保管機制,客戶端保存的是一串加密字符串,保存在服務器的內存中css

  • 設置sessionhtml

    1.在Flask中設置密鑰 
    app.secret_key = "@#^%&*&@^&%^#*@"
    或者:
    app.config['SECRET_KEY'] = "@#^%&*&@^&%^#*@"
    2.設置session
    session["user"]="123"
    3.獲取session
    session.get('user')
    
    
    # 交由客戶端保管機制
    1.登錄成功後設置session,Flask根據密鑰和要設置的session鍵值對通過位運算,生成session,保存到內存中,須要的話就經過get獲取,不須要關閉時刪除,並在瀏覽器中設置鍵值對--session:string
    2.在發出請求時,根據瀏覽器中的--session:string和Flask中secret_key,反序列化就獲得了session鍵值對

1.5 Flask 路由

from flask import Flask  
app = Flask(__name__)  

@app.route('/',methods=("POST","GET"),endpoint='別名',defaults={"count":20} ) 
def home(count): 			
count = request.args.get('count',count)  #指定頁數就優先,若是沒有取默認值

app.run()
  • rule= '/' 第一個時url,python

  • methods= ["GET","POST",..] 支持的請求方式(get查詢,post增長,put更新,delete刪除,options跨域)redis

  • endpoint 別名 * 同一個項目中別名不能重複,默認值是視圖函數名,django

    Mapping,別名.
    反向解析  url = url_for('別名')
  • strict_slashes = True 嚴格遵照路由匹配json

  • defaluts 默認參數flask

  • redirect_to ='/' 永久重定向,無論url是什麼都會跳轉到'/'跨域

    • 應用場景: 地址更換時,點擊原來地址跳轉到新地址
    #添加路由時不必定用裝飾器,可使用 
    app.add_url_rule(rule,  # 路由地址
                     view_func  #視圖函數
                    )

1.6 動態參數路由

  • 能夠分頁,獲取文件,解決分類,解決正則路由問題
from flask import Flask  
app = Flask(__name__)  

@app.route('/home/<page>')  #page默認類型是字符串接收 
def home(page):   # 須要傳參接收			
    pass  

@app.route('/home/<page>_<id>_<id2>')  #默認類型是字符串接收 
def home(page,id,id2):   # 須要傳參接收			
    pass 

app.run()

1.7 Flask初始化配置##重要!!!

from flask import Flask  
app = Flask(
    __name__,
    template_folder = 'templates',   # 更改母版存放路徑,默認值是templates  ##重要!!!
    static_folder = 'static',  # 指定靜態文件保存目錄,默認值是static    "家"  ##重要!!! 
    static_url_path = "/static",  # 靜態文件訪問路徑,默認值是 /+static_folder  "回家的路"  ##重要!!!
    
)  

#原理
@app.route('/<filename>', )
def func(filename):
    filepath = os.path.join('img', filename)  # img就是家
    return send_file(filepath)  				# filepath就是訪問路徑


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

1.8 Flask實例配置

  • 基本配置
from flask import Flask  
app = Flask(
    __name__,
    template_folder = 'templates',   # 更改母版存放路徑,默認值是templates  ##重要!!!
    static_folder = 'static',  # 指定靜態文件保存目錄,默認值是static    "家"  ##重要!!! 
    static_url_path = "/static",  # 靜態文件訪問路徑,默認值是 /+static_folder  "回家的路"  ##重要!!!
    
)  

# 實例化配置
app.debug = True # 修改代碼自動重啓
app.secret_key = '$%^^$'   #設置session值須要改密匙
app.session_cookie_name = 'session'  # 設置的session名稱 ,默認是session
app.permanent_session_lifetime=  # session生命週期,以秒計時,默認31天

# 另一種更改配置方式
app.config['DEBUG']= True  # 這種方式速度更快

#app.config   Flask配置
#app.defalut_config     flask默認配置

if __name__ == '__main__':
	app.run()
  • settings文件配置(重要!!!),快速切換工做模式
# settinigs.py文件代碼

class DebugConfig(object):
    """線上開發環境"""
    DEBUG = True
    SECRET_KEY = "#$%^&*($#$%^&*%$#$%^&*^%$#$%"
    PERMANENT_SESSION_LIFETIME = 3600
    SESSION_COOKIE_NAME = "I am Not Session"


class TestConfig(object):
    """測試環境"""
    TESTING = True
    SECRET_KEY = hashlib.md5(f"{time.time()}#$%^&*($#$%^&*%$#$%^&*^%$#$%{time.time()}".encode("utf8")).hexdigest()
    PERMANENT_SESSION_LIFETIME = 360000
    SESSION_COOKIE_NAME = "#$%^&*($#$%^&*%$#$%^&*^%$#$%"   # session名字
    
    
    
#配置生效
1.導入配置文件
from settings import DebugConfig,TestConfig
2.環境生效
app.config.from_object(DebugConfig)  # 線上環境
app.config.from_object(TestConfig)	# test環境,須要的時候只須要啓用DebugConfig,TestConfig其中一條

1.9 Flask藍圖 Blueprint

  • Blueprint,相似普通的Flask實例,不能被run的Flask實例,不存在config
  1. 建立藍圖bp_users.py文件,名字能夠更改瀏覽器

    from flask import Blueprint
    
    bp = Blueprint('bp01', __name__,url_prefix='url前綴')  # 'bp01'第一個參數是惟一標識,整個環境不能重複!  url_prefix='url前綴',當存在多個藍圖url衝突時,在地址欄輸入'url前綴',就能夠訪問指定的藍圖文件
    
    
    @bp.route('/user',endpoint='user')
    def user():
        return '我是藍圖函數01'
  2. 創建關係服務器

    # 在項目的app.run文件中
    from app01 import bp  #導入藍圖
    app.register_blueprint(bp) # 註冊藍圖
  3. 訪問指定路徑

    • 在藍圖中反向解析時,須要注意書寫格式:

      url = url_for('藍圖標識.裝飾器別名')

1.10特殊裝飾器

相似於django中的中間件

  • @app.before_request
    • 在請求進入視圖函數以前,順序執行,作出處理
    • 相似dganjo中的request中間件
    • 執行規律django中的request中間件同樣
  • @app.after_request
    • 在視圖函數以後執行,倒序執行,作出處理
    • 相似django中的response中間件
    • 與django中間件不一樣的是:after_request無論什麼狀況,只要有響應都會倒序所有執行
  • @app.errorhandler(錯誤碼)
    • 錯誤監聽裝飾器
    • 錯誤碼只能是4(請求錯誤)或5(服務器錯誤)開頭的
    • 能夠重定義錯誤界面
@app.before_request
def is_login():
    """
    校驗登陸狀態
    :return:
    """
    path = request.path
    if path != '/login':
        if not session.get('is_login'):
            return redirect('/login')
    return None


@app.errorhandler(404)
def error(error_msg):  # 形參必須添加
    """
    校驗登陸狀態
    :return:
    """
    return '沒找到頁面'

1.11CBV

  • 基本格式

    from flask import view,Flask
    app = Flask(__name__)
    
    class Login(views.MethodView):    #繼承MethodView,使類變成視圖函數
        def get(self,*args,**kwargs):
            pass
        def post(self,*args,**kwargs):
            pass
    app.add.url_rule('/login',
                    endpoint='login',  # 若是endpoint不定義的話名稱就是view_func的name,必須惟一
                    view_func=Login.as_view(name='loginlogin'),  # name就是就是view_func的名稱
                    )    
    
    app.run()

2.第三方組件Flask-Session

  • setdefault() 字典的方法

    dict.setdefault(key, default=None)
    #參數
    key -- 查找的鍵值。
    default -- 鍵不存在時,設置的默認鍵值。
    #返回值
    若是 key 在 字典中,返回對應的值。若是不在字典中,則插入 key 及設置的默認值 default,並返回 default ,default 默認值爲 None。
  • 安裝Flask-session包

    • app.session_interface 就是默認的session接口,Flask利用session_interface選擇session的存放位置和存放機制.
    from flask import Flask, request, session
    from flask_session import Session  #導入Session
    from redis import Redis  # 導入redis
    
    app = Flask(__name__)
    app.secret_key = '$%^&*%$'  #  flask_session使用pickle轉化,密鑰能夠不使用
    app.config['SESSION_TYPE'] = 'redis'  # 設置session存放機制,,瀏覽器中存的就是session_id,session存在redis中
    app.config['SESSION_REDIS'] = Redis(host='192.168.12.10', port=6379, db=10)
    Session(app)  # 使普通sesson變成flask_session
    
    # app.session_interface    #Flask利用app.session_interface 選擇session存放位置和存放機制
    
    @app.route('/set')
    def sets():
        session['key'] = 'QWER'
        return 'set'
    
    @app.route('/get')
    def gets():
        return session.get('key')
    
    app.run()
相關文章
相關標籤/搜索