国内很多论坛使用的都是Discuz,Discuz为了满足各种需求,已经变得非常臃肿,很多新技术如果要在Discuz上应用成本很高。于是用Django重写了一个,只保留基本的发帖功能。
老论坛中有近10w的用户数据,有些是注册机注册的,也有一些已经不活跃的用户,因此不考虑直接导入用户数据。大致的思路是:当某个用户登录时,查询旧的Discuz数据库,如果用户名和密码都正确,则把这个用户写入新系统Django的用户表中。这部分逻辑我是写在forms里,登录仍然用Django自带的auth_view来处理。
#在url中引用auth_view.login时,使用自己的from
from django.contrib.auth import views as auth_views
from django.conf.urls.defaults import patterns, url
from accounts.forms import LoginForm
urlpatterns = patterns('accounts.views',
url(r'^login/$', auth_views.login, {'template_name': 'accounts/login.html', 'authentication_form':LoginForm }, name = 'login'),
)
在forms.py中创建LoginForm,继承自AuthenticationForm,用户登录时查询uc-center数据库。
from sqlalchemy import *
import hashlib
class LoginForm(AuthenticationForm):
username = forms.CharField(error_messages = {'required': u'用户名或邮箱不能为空'}, max_length = 30)
password = forms.CharField(widget=forms.PasswordInput, error_messages = {'required': u'密码不能为空'})
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username and password:
self.user_cache = authenticate(username = username, password = password)
if self.user_cache is None:
# 连接老数据库确认用户是否已经注册
mysql_engine = create_engine('mysql+mysqldb://mysql用户名:密码@000.000.000.000/uc?charset=utf8')
table = Table('uc_members', MetaData(mysql_engine), autoload=True)
result = table.select(table.c.username == username).execute().first()
if result:
#discuz x2 的密码加密方式
password_salt = hashlib.md5(hashlib.md5(password).hexdigest()+result['salt']).hexdigest()
user_is_existed = User.objects.filter(username=result['username']).count()
if password_salt == result['password']:
user = User.objects.create_user(email=result['email'], username=result['username'], password=password) if not user_is_existed else ''
else:
raise forms.ValidationError("请输入正确的用户名、密码")
else:
raise forms.ValidationError("请输入正确的用户名、密码")
self.user_cache = authenticate(username = username, password=password)
self.check_for_test_cookie()
return self.cleaned_data