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