Django-注册设置无需密码

标签 django authentication registration django-registration

我正在尝试创建一个网站,人们只在其中输入他们的电子邮件地址,然后使用 cookie 等登录。稍后,我会要求他们提供密码和姓名,但不会使用用户名。我正在尝试使用 django-registraition 来执行此操作,但出现错误并且遇到一些问题。

首先要禁用用户名作为登录功能,我用 str(time()) 代替用户名 - 我正在寻找每次都会改变的东西。

但是,当我跳过身份验证(我目前不需要)时,我收到错误:

'RegistrationProfile' object has no attribute 'backend'

或者,我可以保留身份验证,但我不知道如何仅使用电子邮件而不使用密码进行身份验证。另外,我不知道如何使下一行工作:

auth.login(request, ProfileUser)

如果有人能带我离开这里,那就太棒了。这是一些代码:

我的表格类别:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p

我的观点:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )

我会很乐意发布任何其他需要的片段

最佳答案

您收到'RegistrationProfile'对象没有属性'backend'错误,因为用户尚未经过身份验证。要让某人登录,您必须首先调用authenticate方法,该方法需要密码。所以,你可以做的是:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)

然后,要让某人登录,只需使用请求和 User 模型调用 _login_user 函数即可。 (在您的情况下,这可能是 profile.user)执行此操作而不是调用 auth.login。我不确定在没有密码或用户名的情况下您将如何确定这是否是有效用户,但我将其留给您。如果您仍然遇到问题,请告诉我。

简短说明:

这里基本上发生的是 Django 要求用户进行身份验证才能通过 login 函数登录。该身份验证通常由“authenticate”函数完成,该函数需要用户名和密码,并检查提供的密码是否与数据库中的哈希版本匹配。如果是,它会向 User 模型添加一个身份验证后端。

因此,由于您没有密码和用户名,因此您只需编写自己的方法来将身份验证后端添加到 User 模型中。这就是我的 _login_user) 函数的作用 - 如果用户已经通过身份验证,它只会调用 login,否则,它首先将默认后端添加到 User 模型,无需检查正确的用户名和密码(如 authenticate 所做的那样)。

关于Django-注册设置无需密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5843319/

相关文章:

security - 不需要 UserProvider 的自定义身份验证

node.js - 为每个公司管理员创建路由登录

php - 在 Laravel 中向注册表单添加字段不起作用

python - 使用 lxml 解析 RSS-Feed 的方法不那么痛苦?

python - 添加@csrf_exempt的位置是否错误?

css - Django:在模板页面上隐藏必要的表格

cakephp-1.3 - cakePHP Auth - 允许/拒绝, isAuthorized 实际需要什么?

python - 使用变量作为模型查找

php - 查询mySQL以检查用户是否已存在于两个表中

php - 存在多个表时最有效的登录方式