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

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

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

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

該系統可適用於 各類緩存系統flask

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 實現發送微信的類 session

from .base import Base


class WeChat(Base):

    def send(self,msg):
        print('weixin')

 

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

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

 

 訪問url

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

 

測試結果以下

相關文章
相關標籤/搜索