单用户系统理论上是不需要username的,非常人性化的思考,既然id只有一个,那么为什么还需要输入呢!
django的auth模块似乎不是为此准备的。它是一个很规范的用户管理系统,有用户名,有密码,有last_login⋯⋯其实我很不喜欢,所谓杀鸡用牛刀~~~
写一个,simple_auth,却引出了session问题
WEB本无状态,后来有了动态技术,才有了session。喜欢PHP的人很少用session,能用cookie就用,不能用就另外想办法。但是django希望彻底解决问题,在你的cookie中放一个GUID,其余的session信息就放到数据库中了
但是对于一个简单的系统来说,使用数据库又是一个‘牛刀’的问题了,虽然sqlite和使用文件已经没有什么区别了,但是我依然想坚持风格,干脆把django的session系统也黑了,彻底脱离数据库依赖
我们许要一套代替auth的模块,于是我建立了simple_auth模块,user.py目录中的两个类可以让密码不存储在数据库中,而是直接存储在文本文件中。
class SingleUserManager:
def authenticate(self, username=None, password=None):
'''authenticate'''
user = SingleUser()
if user.check_password(password):
return user
else:
return None
def get_user(self, user_id = None):
'''get_user'''
return SingleUser()
class SingleUser:
def __init__(self):
self.id = None
self.backend = "%s.%s" % (SingleUserManager.__module__,
'SingleUserManager')
self.password_changed = False
def check_password(self,raw_password):
'''check password'''
import md5
f = open('passwd','r')
self.password = f.read()
f.close()
if self.password == md5.new(raw_password).hexdigest():
self.id = 0
self.username = 'no need'
return True
return False
def is_anonymous(self):
return False
def save(self):
pass
虽然没有完美的模拟User对象,但是这里足够用了
按照django本来推荐的使用方法,验证一个用户是
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
现在替换成
users = SingleUserManager()
if users.authenticate(None,request.POST['password']):
auth.login(request, users.get_user())
接下来要做的是精简MiddleWare,让settings.py的INSTALLED_APPS参数只保留一个session,这样可以在manage.py syncdb建立数据库的时候,只许要建立session的数据表。因为auth的依赖的数据库表已经被我们干掉了,所以现在只有session还在使用数据库。
另外,MIDDLEWARE_CLASSES也修改成下面的样子
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
#'django.middleware.doc.XViewMiddleware',
)
这样,网站基本上还能跑起来,auth模块是不能访问了
现在,在只有session的表使用数据库了。接下来我们会写一个session替代的MiddleWare,彻底摒弃数据库⋯⋯
post on 2007-05-30 18:11