Flask下的session认证和cache header设置
星期六, 九月 17th, 2011
Flask是个非常优秀的python microframework,基于Werkzeug、Jinja 2,使用非常方便,性能也非常不错,最近公司创业新项目一直在用。
这里和大家分享2个简单的decorator,分别用于session认证和响应头cache设置
# -*- coding: utf-8 -*-
"""
lib/decorator.py
~~~~~~~~~~~~~~
some decorator defined
:author: linnchord@gmail.com
: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下切来切去,某个小说网站每次切了就得重新登录,让我很蛋疼……
nginx下配置dabr
星期三, 一月 27th, 2010
主要是修改rewrite规则——我曾试图修改php程序,费老大劲,效果差不多。
下面配置代码中,HOME为你站点的根目录,DIR为你需要部署的子目录
location /DIR {
root /HOME;
index index.html index.htm index.php;
if (-f $request_filename) {
break;
}
if (-d $request_filename) {
break;
}
rewrite ^/DIR/(.+)$ /DIR/index.php?q=$1 last;
}
SyntaxHighlighter
星期二, 十二月 1st, 2009
作为程序员,blog难免要贴不少代码,简单的pre标记显得比较平板,不象ide里面的代码排版颜色那么漂亮。
在网上搜了一把,SyntaxHighlighter应该是目前最美观最全面的代码着色器了,唯一的缺点就是需要引入的文件太多……不过要做到这么全的代码类型覆盖,这也是不可避免的。
thinking of java web develop learning
星期四, 七月 9th, 2009
看了几天java web开发的东东,简单梳理一下。
- 容器
这是java web开发过程中非常强调的一个概念。顾名思义,在它的内部存放着某些东西,各种java对象,包括所谓的bean等等。java的容器也可以称其为一个应用服务,或一个框架,用户通过配置指定代码或者说对象、构件存放的路径,以及对象之间的关系、对象和容器直接的关系。这通常有一套标准,例如javaEE本身的servlet/jsp的规范,或容器本身特定的某些标准,你的配置和代码必须符合这种标准,才能被容器调用使用。标准有很多形式,xml的配置、java接口的实现、对象的继承、java的标注等等,他们决定了对象如何被容器调用、对象之间的关系、以及对象在容器中的运行状态。
目前作为java web开发最常用的servlet/jsp容器是tomcat,企业应用服务器是jboss。spring框架虽然没有服务器的概念,但是从其包含、组织、调用java组件的特征来看,也可以说是容器了。
回忆.net,虽然没有特别强调容器的概念,但是从程序的流程和组织架构来说,iis就是.net web程序运行的容器了。
- web生命周期
在任何技术平台的web开发中,web的生命周期都是一个核心概念。由于web应用都是基于http协议和b/s模式,所以不论采用何种技术,其生命周期都是类似的。