1. 程式人生 > >Flask 快速使用 進階—— (2)

Flask 快速使用 進階—— (2)

category index函數 多個 動態 info rom ren self. 短信

案例:可配置發送信息的系統

假如我們有這樣的一個系統,可以發送短息,郵件和微信,後期可能還會增加一些平臺,怎麽才可以做到快速切換的去使用某種功能呢,在這裏我會通過在配置文件中簡單的配置就可以實現

在項目的根目錄下創建 utils/message/base.py 創建繼承的基類,強制其子類實現send() 方法

該系統可適用於 各種緩存系統

class Base(object):

    def send(self,msg):
        raise NotImplementedError(...)

在項目的根目錄下創建 utils/message/email.py 實現發送郵件的類

from .base import Base

class Email(Base):
    """
    發送郵件提醒相關
    """
    def __init__(self):
        """
        郵箱相關數據初始化
        """
        self.username = asdf
        self.pwd = asdf

    def send(self,msg):
        print(email)

在項目的根目錄下創建 utils/message/msg.py 實現發送短息的類

from .base import
Base class Msg(Base): """ 發送短信提醒相關 """ def __init__(self): """ 短信相關數據初始化 """ self.username = asdf self.pwd = asdf def send(self, msg): print(msg)

在項目的根目錄下創建 utils/message/wechat.py 實現發送微信的類

from .base import Base


class
WeChat(Base): def send(self,msg): print(weixin)

在項目的根目錄下創建 utils/message/__init__.py 通過讀取配置文件配置信息,動態的導入和執行send()方法

import settings
import importlib

def send_msgs(msg):

    for path in settings.MSG_LIST:
        m,c = path.rsplit(.,maxsplit=1) # 從右邊開始分割  utils.message.wechat WeChat
        md = importlib.import_module(m)
        obj = getattr(md,c)()
        obj.send(msg)

在項目的根目錄下創建 settings.py 配置文件信息

MSG_LIST = [
    "utils.message.email.Email",
    "utils.message.msg.Msg",
    "utils.message.wechat.WeChat",
]

在項目文件下創建主程序app.py

from flask import Flask,request

from utils.message import send_msgs

app = Flask(__name__)

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

    return Hello World!


if __name__ == __main__:
    app.run()

訪問

http://127.0.0.1:5000、  

後臺打印數據如下

技術分享圖片

閃現

在服務端可以對數據進行臨時的存儲,本質是基於session做的,取的時候清除

from flask import Flask,flash,get_flashed_messages

app = Flask(__name__)
app.secret_key = asdfasdf
@app.route(/get)
def get():
    # 從某個地方獲取設置過的所有值,並清除。
    data = get_flashed_messages()
    print(data)
    return Hello World!


@app.route(/set)
def set():
    # 向某個地方設置一個值
    flash(阿斯蒂芬)

    return Hello World!


if __name__ == __main__:
    app.run()

簡單的小應用

from flask import Flask,flash,get_flashed_messages,request,redirect

app = Flask(__name__)
app.secret_key = asdfasdf


@app.route(/index)
def index():
    # 從某個地方獲取設置過的所有值,並清除。
    val = request.args.get(v)
    if val == oldboy:
        return Hello World!
    flash(超時錯誤,category="x1")
    return "ssdsdsdfsd"

@app.route(/error)
def error():
    """
    展示錯誤信息
    :return:
    """
    data = get_flashed_messages(category_filter=[x1])
    if data:
        msg = data[0]
    else:
        msg = "..."
    return "錯誤信息:%s" %(msg,)

if __name__ == __main__:
    app.run()

請求擴展

1 before_request 在每次請求前執行 2 after_request在每次請求後執行,必須有返回值

可以定義多個,before_request 按代碼的順序一次執行,after_request按代碼的順序逆序執行

註意請求假如沒通過,被攔截,所有的response還會被執行

from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = siuljskdjfs

@app.before_request
def process_request1(*args,**kwargs):
    print(process_request1 進來了)

@app.before_request
def process_request2(*args,**kwargs):
    print(process_request2 進來了)
    
@app.after_request
def process_response1(response):
    print(process_response1 走了)
    return response

@app.after_request
def process_response2(response):
    print(process_response2 走了)
    return response

@app.errorhandler(404)
def error_404(arg):
    return "404錯誤了"

@app.before_first_request
def first(*args,**kwargs):
    pass

@app.route(/index,methods=[GET])
def index():
    print(index函數)
    return "Index"

if __name__ == __main__:
    app.run()

訪問

http://127.0.0.1:5000/index

  

後臺打印如下

技術分享圖片

基於請求做的登陸的認證

from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.secret_key = siuljskdjfs

@app.before_request
def process_request(*args,**kwargs):
    if request.path == /login:
        return None
    user = session.get(user_info)
    if user:
        return None
    return redirect(/login)

@app.route(/detail/)
def detail():
    return 詳情

@app.route(/index)
def index():
    return 主頁

@app.route(/login,methods=[GET,POST])
def login():
    session[user_info] = zhang
    return 登陸成功

if __name__ == __main__:
    app.run()

中間鍵

flask 每次請求進來都會執行app.__call__方法中的 wsgi_app方法,我們可以對其中的 wsgi_app 進行封裝

from flask import Flask

app = Flask(__name__)

@app.route(/)
def index():
    return Hello World!

class Md(object):
    def __init__(self,old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self,  environ, start_response):
        print(開始之前)
        ret = self.old_wsgi_app(environ, start_response)
        print(結束之後)
        return ret

if __name__ == __main__:
    app.wsgi_app = Md(app.wsgi_app)
    app.run()

訪問

http://127.0.0.1:5000/ 

測試結果如下

技術分享圖片

簡單的定制錯誤信息

@app.errorhandler(404)
def error_404(arg):
    return "404錯誤了"

模板中的定制方法

from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.secret_key = siuljskdjfs

@app.template_global()
def sb(a1, a2):
    return a1 + a2

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

@app.route(/login)
def login():
    return render_template(login.html)
if __name__ == __main__:
    app.run()

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>{{ 1|db(2,3)}}</h1>
    <h1>{{sb(1,2)}}</h1>
</body>
</html>

輸入以下地址

http://127.0.0.1:5000/login

 

測試結果如下

技術分享圖片

Flask 快速使用 進階—— (2)