#
coding:utf-8
try:
from functools import wraps
except ImportError:
from django.utils.functional import wraps # Python 2.4 fallback.
import random
from django.conf import settings
from django.utils.decorators import available_attrs
from django.utils.hashcompat import md5_constructor
if hasattr(random, 'SystemRandom'):
randrange = random.SystemRandom().randrange
else:
randrange = random.randrange
_MAX_CSRF_KEY = 18446744073709551616L # 2 << 63
def _get_new_submit_key():
return md5_constructor("%s%s" % (randrange(0, _MAX_CSRF_KEY), settings.SECRET_KEY)).hexdigest()
def anti_resubmit(page_key=''):
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
if request.method == 'GET':
request.session['%s_submit' % page_key] = _get_new_submit_key()
print 'session:' + request.session.get('%s_submit' % page_key)
elif request.method == 'POST':
old_key = request.session.get('%s_submit' % page_key, '')
if old_key == '':
from django.http import HttpResponseRedirect
return HttpResponseRedirect('/page_expir')
request.session['%s_submit' % page_key] = ''
return view_func(request, *args, **kwargs)
return _wrapped_view
return decorator
使用示例:
@anti_resubmit(page_key='your_view')
def your_view(request):
'''若是表单填写页和POST的view不是同一个,則需在两个view上都使用anti_resubmit装饰器'''
pass #您可别跟着pass噢
2010-12-25 01:14 by 码农.KEN from http://www.cnblogs.com/ken-zhang/archive/2010/12/25/1916437.html
分享到:
2013-01-12 17:53
浏览 1677
评论