Flask是个非常优秀的python microframework,基于Werkzeug、Jinja 2,使用非常方便,性能也非常不错,最近公司创业新项目一直在用。
这里和大家分享2个简单的decorator,分别用于session认证和响应头cache设置
# -*- coding: utf-8 -*-
"""
lib/decorator.py
~~~~~~~~~~~~~~
some decorator defined
:author: [email protected]
:date:2011-8-4
"""
from functools import wraps
from flask import session, redirect, url_for, flash, request, make_response
from models.user import User
from util import helper
def login_required(f):
@wraps(f)
def do(*args, **kwargs):
if 'userId' not in session:
#cookie自动登录机制
token=request.cookies.get('auto_login')
if token:
userId, token = token.split('_')
user = User.get_user_by_id(userId)
from matrix import app
if user and helper.md5(str(user.id) + user.password + app.config['SECURIY_KEY'])==token:
session['userId']=user.id
session['phone']=user.phone
session['nickName']=user.nickName
else:
return redirect('/logout')
else:
return redirect('/')
return f(*args, **kwargs)
return do
def no_cache_header(f):
@wraps(f)
def do(*args, **kwargs):
response = make_response(f(*args, **kwargs))
response.headers['pragma'] = 'no-cache'
response.headers['Cache-Control'] = 'no-cache, must-revalidate'
return response
return do
使用很简单方便
@app.route('/user/follow/', methods=['GET'])
@login_required
@no_cache_header
def follow_user(userId,appId):
pass
需要注意的是@no_cache_header修饰应该放在最后,否则逻辑无法正确完成。这个修饰经常用于ajax响应,因为……坑爹的IE总是要缓存第一次请求结果。
这个session auto login机制有个问题,他的auto login cookie始终是不变的,长期使用会有一定安全隐患。更安全的方法是用户每次登录生成一个security key来进行hash,不过这样对于经常换浏览器甚至操作系统的人会造成一定障碍。例如我……经常使用chrome/firefox/ie,还在mac/win下切来切去,某个小说网站每次切了就得重新登录,让我很蛋疼……