Django:密码存储在django auth_user表中的方式

时间:2012-08-23 07:08:54

标签: python django

我正在自定义django用户模块并添加一些额外的字段

我的模型看起来像

class Drinker(models.Model):
    user = models.OneToOneField(User)
    birthday = models.DateField()
    name     = models.CharField(max_length = 100)

    def __unicode__(self):
        return self.name

这是我的注册视图

def DrinkerRegistration(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/profile/')
    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create(username = form.cleaned_data['username'],email = form.cleaned_data['email'],password = form.cleaned_data['password'])
            user.save()
            drinker = Drinker(name = form.cleaned_data['name'],birthday = form.cleaned_data['birthday'],user=user)
            drinker.save()
            return HttpResponseRedirect('/profile/')
    else:
        form = RegistrationForm()
        context = {'form':form}
        return render_to_response('register.html',context,context_instance = RequestContext(request))

现在我的问题是当用户在我的auth_user表中注册时,密码存储在计划文本中,即导致

Unknown password hashing algorithm '123'. Did you specify it in the PASSWORD_HASHERS setting?
登录时

错误

但对于超级用户,auth_user表中的密码是SHA1格式(我不确定),他们可以登录

请建议我如何在这里哈希密码字段?

3 个答案:

答案 0 :(得分:4)

请勿使用User.objects.create(),请使用User.objects.create_user() - 它会使用正确的算法对提供的密码进行哈希处理。

答案 1 :(得分:0)

您应该让User.set_password散列密码并以适当的格式存储,或者使用其他答案中提到的相应管理器功能。

基本上你从未要求Django对密码进行散列并试图将纯文本放入数据库中。这样做,Django预期的格式(哈希盐hashed_pa​​ss)没有得到满足,因此错误。

更好的是,您的应用程序的这些部分最好使用可重用的应用程序,如Django注册。

然后,您可以在用户注册(创建)后使用信号创建Drinker配置文件。

答案 2 :(得分:0)

您需要使用create_user()帮助程序功能,它将正确设置密码。