【问题标题】:How to create a user in Django?如何在 Django 中创建用户?
【发布时间】:2012-05-09 12:21:21
【问题描述】:

我正在尝试通过以下代码在 Django 项目中创建新用户,但突出显示的行会引发异常。

def createUser(request):
    userName = request.REQUEST.get('username', None)
    userPass = request.REQUEST.get('password', None)
    userMail = request.REQUEST.get('email', None)

    # TODO: check if already existed

    **user = User.objects.create_user(userName, userMail, userPass)**
    user.save()

    return render_to_response('home.html', context_instance=RequestContext(request))

有什么帮助吗?

【问题讨论】:

标签: python django


【解决方案1】:

在 Django 中创建用户的正确方法是使用 create_user 函数。这将处理密码的散列等。

from django.contrib.auth.models import User
user = User.objects.create_user(username='john',
                                 email='jlennon@beatles.com',
                                 password='glass onion')

【讨论】:

  • 这会散列密码吗?
  • @mp3por - 是的。如需完整文档,请访问此处docs.djangoproject.com/en/1.9/ref/contrib/auth/…
  • 如何/在哪里运行它?如果我只运行该代码,我会得到django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. 编辑:这有效DJANGO_SETTINGS_MODULE=app.settings.dev python manage.py shell < register-user.py
  • 作为更现代 Django 的更新,请使用 from django.contrib.auth import get_user_modeluser = get_user_model().objects.create_user(...
  • @keithhackbarth 我应该在 django 文件结构中的哪个文件中插入此代码?
【解决方案2】:

您是否确认您传递的是实际值而不是None

from django.shortcuts import render

def createUser(request):
    userName = request.REQUEST.get('username', None)
    userPass = request.REQUEST.get('password', None)
    userMail = request.REQUEST.get('email', None)

    # TODO: check if already existed
    if userName and userPass and userMail:
       u,created = User.objects.get_or_create(userName, userMail)
       if created:
          # user was created
          # set the password here
       else:
          # user was retrieved
    else:
       # request was empty

    return render(request,'home.html')

【讨论】:

  • 如果它们是 None 不会 .is_valid() 方法失败?
【解决方案3】:

使用set_password批量创建用户

如果你创建了几个测试用户,bulk_create 会快很多,但我们不能使用create_user

set_password 是另一种生成哈希密码的方法:

def users_iterator():
    for i in range(nusers):
        is_superuser = (i == 0)
        user = User(
            first_name='First' + str(i),
            is_staff=is_superuser,
            is_superuser=is_superuser,
            last_name='Last' + str(i),
            username='user' + str(i),
        )
        user.set_password('asdfqwer')
        yield user

class Command(BaseCommand):
    def handle(self, **options):
        User.objects.bulk_create(iter(users_iterator()))

关于密码哈希的具体问题:How to use Bcrypt to encrypt passwords in Django

在 Django 1.9 中测试。

【讨论】:

  • 比接受的要好得多;如果您正在考虑以编程方式添加用户,您可能会自动执行某些操作以供更多用途。
【解决方案4】:

如果你正常创建用户,你将无法登录,因为密码创建方法可能不同 您可以为此使用默认注册表单

from django.contrib.auth.forms import UserCreationForm

你也可以扩展它

from django.contrib.auth.forms import UserCreationForm

class UserForm(UserCreationForm):
    mobile = forms.CharField(max_length=15, min_length=10)
    email = forms.EmailField(required=True)
    class Meta:
        model = User
        fields = ['username', 'password', 'first_name', 'last_name', 'email', 'mobile' ]

然后在视图中使用这个类

class UserCreate(CreateView):
    form_class = UserForm
    template_name = 'registration/signup.html'
    success_url = reverse_lazy('list')

    def form_valid(self, form):
        user = form.save()

【讨论】:

  • 我认为通过扩展forms.ModelForm创建UserForm时有错误。我认为它应该扩展 UserCreationForm
  • 另外,UserCreate类视图的form_class不应该是UserForm吗?
【解决方案5】:

如果您只是使用object.save() 创建用户,原始密码将直接在数据库中可见。 首先,不安全。 其次,密码的加密没有完成,导致解密器会使用你数据库中的原始密码来解密一个错误的密码,导致无法登录。 我猜每次你使用来自django.contrib.auth 的验证功能时,你实际上是在使用它的解密器。 是的,我想每次您登录时,您的密码都需要再次解密。

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 2016-10-03
    • 2019-04-01
    • 1970-01-01
    • 2022-12-24
    • 2013-09-01
    • 2021-02-04
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多