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

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

  • 設置session

    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,

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

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

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

  • defaluts 默認參數

  • 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()
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM