Python Tech

从Discuz中整合用户数据到Django

国内很多论坛使用的都是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
avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒