一脉顿、Flask-Bootstrap插件
- 安裝
pip install flask-bootstrap
- 初始化
# 在ext.py文件中
from flask_bootstrap import Bootstrap
Bootstrap(app)
- 使用
# 模板繼承
{% extends 'bootstrap/base.html' %}
# 拷貝自己需要的效览,在進(jìn)行微調(diào)
<div class="jumbotron">
<h1>歡迎來到德萊聯(lián)盟!</h1>
<p>一人帶四坑残拐,一打九愧杯,就這么瀟灑...</p>
<p>
<a class="btn btn-primary btn-lg" href="#" role="button">查看詳情</a>
</p>
</div>
更多是使用到里面封裝的組件以及樣式晾咪。
二收擦、Flask-Debugtoolbar插件
- 安裝
pip install flask-debugtoolbar
- 初始化
from flask_debugtoolbar import DebugToolbarExtension
app.debug = True
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)
- 使用
初始化完之后,頁面中就會顯示
看到插件類似toolbar = DebugToolbarExtension(app)谍倦,基本都是有xxx.init_app的方法塞赂。
三、Flask-Cache插件 (Flask-Caching替換)
- 基本使用
- 安裝
pip install flask-caching
- 初始化
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'simple'})
cache.init_app(app)
- 使用(裝飾器)
@blue.route('/')
@cache.cached(timeout=30)
def index():
# 為了檢查
print('首頁 --- 加載數(shù)據(jù)!')
return render_template('index.html')
注: timeout設(shè)置超時時間
注: 通過打印可以看到是否緩存昼蛀,也可以通過Flask-Debugtoolbar插件查看是否進(jìn)行數(shù)據(jù)庫操作或模板的渲染操作
- 備注
有很多人是`pip install flask-cache`但這會有個關(guān)于flask導(dǎo)包問題
flask舊版本導(dǎo)包: flask.ext.xxx
falsk新版本導(dǎo)包: flask_xxx
而在flask-cache中有使用到老版本的宴猾,會引起一系列問題
為此這里使用flask-cache的一個分支flask-caching
(使用都是一致的,就是導(dǎo)包時不同)
- 其他
基本數(shù)據(jù)的set叼旋、get也都是允許的仇哆。
get(*args, **kwargs)
set(*args, **kwargs)
在應(yīng)用中添加緩存,緩存的目的是提高服務(wù)器的性能夫植,提高網(wǎng)絡(luò)訪問的速度讹剔。緩存減少原生數(shù)據(jù)庫的操作,或說是減少磁盤的IO详民。
- 配置
Flask-Cache支持多個類型作為緩存后端延欠,不同的緩存后端,配置項(xiàng)也不盡相同阐斜。
CACHE_TYPE: null衫冻、simple、filesystem谒出、memcached隅俘、redis、saslmemcached
- null: 無緩存
配置 說明
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- simple: 使用本地python字典進(jìn)行存儲笤喳,這不是線程安全的
配置 說明
CACHE_DEFAULT_TIMEOUT 默認(rèn)過期/超時時間为居,單位為秒
CACHE_THRESHOLD 緩存的最大條目數(shù)
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- filesystem:使用文件系統(tǒng)來存儲緩存的值
配置 說明
CACHE_DEFAULT_TIMEOUT 默認(rèn)過期/超時時間,單位為秒
CACHE_DIR 存儲緩存的目錄
CACHE_THRESHOLD 緩存的最大條目數(shù)
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- memcached:使用memcached服務(wù)器作為緩存后端杀狡,支持pylibmc或memcache或Google應(yīng)用程序引擎memcache庫
配置 說明
CACHE_DEFAULT_TIMEOUT 默認(rèn)過期/超時時間蒙畴,單位為秒
CACHE_KEY_PREFIX 設(shè)置cache_key的前綴
CAHCE_MEMCACHED_SERVERS 服務(wù)器地址的列表或元組
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- redis:使用Redis作為緩存后端
配置 說明
CACHE_DEFAULT_TIMEOUT 默認(rèn)過期/超時時間,單位為秒
CACHE_KEY_PREFIX 設(shè)置cache_key的前綴
CACHE_REDIS_HOST redis地址
CACHE_REDIS_PORT redis端口
CACHE_REDIS_PASSWORD redis密碼
CACHE_REDIS_DB 使用哪個庫
CACHE_REDIS_URL 連接到Redis服務(wù)器的URL。示例redis://user:password@localhost:6379/2
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- saslmemcached:使用memcached服務(wù)器作為緩存后端
配置 說明
CACHE_DEFAULT_TIMEOUT 默認(rèn)過期/超時時間膳凝,單位為秒
CACHE_KEY_PREFIX 設(shè)置cache_key的前綴
CAHCE_MEMCACHED_SERVERS 服務(wù)器地址的列表或元組
CACHE_MEMCACHED_USERNAME 使用memcached進(jìn)行SASL認(rèn)證的用戶名
CACHE_MEMCACHED_PASSWORD 使用memcached進(jìn)行SASL認(rèn)證的密碼
CACHE_ARGS 在緩存類實(shí)例化過程中解包和傳遞的可選列表
CACHE_OPTIONS 可選字典在緩存類實(shí)例化期間傳遞
- redis方式緩存測試
# 配置緩存方式為redis
cache = Cache(config={
'CACHE_TYPE': 'redis',
'CACHE_KEY_PREFIX': 'python(Flask)'
})
# 進(jìn)入redis命令行
redis-cli
# 查看緩存頁面的key
keys *
'python(Flask)view//'
# 查看對應(yīng)key下的值 (具體key查看列表)
get 'python(Flask)view//'
注: 可以看到緩存的頁面內(nèi)容(超時后碑隆,該值為空)
# 查看時間
ttl xxx(key)
- 存儲其他
# 存值 key-value
cache.set(token, id, timeout=60)
# 取值 key-value
cache.get(token)
四、AOP反爬策略
- 基礎(chǔ)的反爬策略
不是瀏覽器發(fā)出的請求蹬音,就直接攔截
頻繁訪問的上煤,直接攔截
- 反爬機(jī)制示例
# 10秒內(nèi),只能訪問一次
@blue.before_request
def before():
# key
key = 'before:' + request.remote_addr
# 1著淆、從緩存中獲取
value = cache.get(key)
# 2劫狠、存在(直接結(jié)束)
if value:
# 如果想要客戶端顯示錯誤
# abort(500)
# 客戶端顯示有內(nèi)容
return '小伙子,爬的舒服不永部?沒事独泞,繼續(xù)爬,啦啦啦....'
# 3苔埋、不存在懦砂,添加到緩存中 [10s內(nèi)重復(fù)操作的]
cache.set(key, '小蟲處理', timeout=10)
五、Flask內(nèi)置對象
- 請求鉤子
before_first_request:注冊一個函數(shù)讲坎,在處理第一個請求之前運(yùn)行;
before_request:注冊一個函數(shù)孕惜,在每次請求之前運(yùn)行;
after_request:注冊一個函數(shù)愧薛,如果沒有未處理的異常拋出晨炕,在每次請求之后運(yùn)行;
teardown_request:注冊一個函數(shù)毫炉,即使有未處理的異常拋出瓮栗,也在每次請求之后運(yùn)行
在請求鉤子函數(shù)和視圖函數(shù)之間共享數(shù)據(jù)一般使用上下文全局變量g。
- g (global全局的)
- 突破變量存儲位置限制
- 給數(shù)據(jù)傳遞添加新的方式
- 在做 flask 程序的時候瞄勾,需要用到一些全局變量费奸,比如用戶的登錄信息等
# 例如在不同路由中進(jìn)行數(shù)據(jù)傳遞
@blue.before_request
def before():
# 客戶端IP,保存到全局變量中
g.ipadress = request.remote_addr
@blue.route('/about/')
def about():
# 通過全局變量方式獲取IP
ipadress = g.ipadress or '127.0.0.1'
return render_template('about.html',ipadress=ipadress)
g作為flask程序全局的一個臨時變量,充當(dāng)者中間媒介的作用,我們可以通過它傳遞一些數(shù)據(jù),每次請求會重設(shè)這個變量.
- request
- 請求對象
- 請求的所有信息
- session
- 回話技術(shù)
- 服務(wù)端回話技術(shù)接口
- config 當(dāng)前激活程序的程序?qū)嵗?/li>
- app對象 current_app
獲取當(dāng)前的app
- app的配置信息
current_app.config
作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡書
簡書著作權(quán)歸作者所有进陡,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處愿阐。