初期学习Flask时,可能会用到下面的内容来实现某种功能,这里简单记录下,后期可再来回顾。
一、密码机制
1、密码加密:
from werkzeug.security import generate_password_hash, check_password_hash
user.password = generate_password_hash(password)
2、密码检查:
check_password_hash(user.password, password)
二、会话机制 cookie & session:
1、保存cookie,通过response对象保存
response = redirect(xx)
response = render_template(xx)
response = Response()
response = make_response()
response = jsonify(xx)
response.set_cookie(key, value, max_age= xxx)
2、获取cookie,通过request对象获取
request.args.get()
request.form.get()
request.cookie.get(key)
3、删除cookie,通过response对象删除
response = redirect(xx)
response = render_template(xx)
response = Response()
response = make_response()
response = jsonify(xx)
response.delete_cookie(key)
session: 1、保存session
from flask import session
user= User.query.get('uid')
session['uid'] = user.id
2、获取session
uid = session.get('uid', None)
3、删除session
del session['uid']
cookie是存放在客户端,session是存放在服务器
三、*钩子函数*
先说下钩子函数的使用例子:比如一个登录权限的验证,只要访问用户中心,就需要判断用户是否是登录状态,如果用户登录了,可以正常显示页面,如果没有,则自动跳转到登录页面进行登录,登录之后才可以进行查看,所以我们可以每次执行视图之前先执行钩子函数(before_request),由它做判断当前用户是否登录
1、直接应用在app上
from flask import Flask, request
app = Flask(__name__)
@app.before_first_request
def my_before_first_request():
print('开始只运行一次,before_app_first_request')
@app.before_request
def my_before_request():
print('每次都会运行,before_app_request ,request对象请求的路径:%s' % request.path)
@app.after_request
def my_after_request():
print('after_app_request, 在视图函数执行之后,再执行这个')
@app.teardown_request
def my_teardown_request():
print('teardown_app_request, 在after_app_request执行之后,再执行这个')
@app.route('/')
def my():
print('我是视图函数')
2、应用于蓝图上(多了个app)
from flask import Flask, request, user_bp
app = Flask(__name__)
app.register_blueprint(user_bp)
user_bp = Blueprint('user', __name__)
@user_bp.before_first_request
def my_before_first_request():
print('开始只运行一次,before_app_first_request')
before_app_request(第二步执行)
after_app_request (第三步执行,但是需要先执行视图函数,才能执行这个)
teardown_app_request(第四步执行)
针对上面的登录权限这里做个例子:
@user_bp.before_app_request
def my_before_request():
route_list = ['/user/center', ......]
if request.path in route_list:
uid = session.get('uid')
if not uid:
return '需要跳转到登录页'
else:
return '当前是登录状态'
else:
pass
四、paginate:分页函数
pagination = Article.query.order_by(-Article.create_at).paginate(page=1, per_page=3)
print(pagination.items)
获取当前的页码数
print(pagination.page)
获取当前页的前一页的页码数
print(pagination.prev_num)
获取当前页的后一页的页码数
print(pagination.next_num)
判断是否有上一页或者下一页
print(pagination.has_next)
print(pagination.has_prev)
总共几页
print(pagination.pages)
总的记录条数
print(pagination.total)
五、获取上传文件内容
html文件内容
<input type="file" name="photo">
视图函数中获取
photo = request.files.get('photo') ---->> photo: FileStorage
photo.filename
photo.save(path)
photo.read() ---->>:将上传的内容转为二进制方式
五、Redis应用(缓存键值对及视图函数):
使用背景: 例如有时我们访问网站某个页面时因为图片内容过多,或者文件内容过大等各种原因,导致每次加载时都过慢,这时我们可以把内容缓存起来,下次直接使用缓存,在有效时间内可以快速访问,无需再次加载
使用前下载:
pip install redis
pip install flask-caching
1、在项目中应用的位置:
from flask-caching import Cache
cache = Cache()
from extra import cache
from flask import Flask
config={
'CACHE_TYPE': 'redis',
'CACHE_REDIS_HOST': '127.0.0.1',
'CACHE_REDIS_PORT': 6379
}
def create_app():
app = Flask(__name__)
......
cache.init_app(app=app, config=config)
return app
2、使用: 1、缓存键值对
cache.set(key, value, timeout=second)
cache.set_many([(key,value),(key1, value1),......])
cache.get(key)
cache.get_many(key,key1,key2,......)
cache.delete(key)
cache.delete_many(key,key1,key2,......)
cache.clear()
2、视图函数的缓存
from extra import cache
user = Blueprint('user', __name__)
@user.route('/xx')
@cache.cached(timeout=50)
def home():
......
pass
|