为四川人民祈祷! www.onefoundation.cn

替换掉django的auth

单用户系统理论上是不需要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,彻底摒弃数据库⋯⋯
tags: django   
by kernel1983
Comments »
  1. 2007-06-1 01:11
    听起来像是SVN

    编译原理我不懂,但是总觉得你说的方法不够KISS。本来是实时的动作,硬要转换成批处理,还要处理脏数据。

    感觉不如把文件锁住来的方便
  2. 2007-05-31 17:57
    我专门研究过用文本文件代替数据库这个问题(也算是和编译有关的方面啦);我有一种思路可以打破文本文件非并发、单用户的局限性:用共享内存或者高速缓存(对于*nix直接用硬盘也可以)来为每条数据记录(或数据对象)作副本,仅对于副本做修改。只要细分以确保单条数据是非并发访问的,系统(对于CGI来说是操作系统,普通服务器端是服务器的脚本解释环境)的多线程模型这时就会起作用,可以高枕无忧了!最后使出“垃圾收集”方面的一大堆算法打扫堆。
Leave a Comment:
code:656