Настройка Django-регистрации без пароля - PullRequest
2 голосов
/ 30 апреля 2011

Я пытаюсь создать веб-сайт, на котором люди только размещают свои адреса электронной почты, и они вошли с помощью файлов 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
        )

, и я опубликую любой другой отсканированный необходимый с радостью

Ответы [ 3 ]

5 голосов
/ 30 апреля 2011

Вы получаете ошибку 'RegistrationProfile' object has no attribute '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)

Затем, чтобы войти в систему, просто вызовите функцию _login_user с запросом и модель User. (В вашем случае, вероятно, это будет profile.user) Делайте это вместо вызова auth.login. Я не уверен, как вы собираетесь определить, является ли это действительным пользователем или нет, без пароля или имени пользователя, но я оставлю это вам. Если у вас все еще есть проблемы, дайте мне знать.

Краткое объяснение:

Здесь в основном происходит то, что Django требует аутентификации пользователя для входа в систему с помощью функции login. Эта аутентификация обычно выполняется функцией authenticate, которая требует имя пользователя и пароль, и проверяет, соответствует ли предоставленный пароль хешированной версии в базе данных. Если это так, он добавляет сервер аутентификации в модель User.

Итак, поскольку у вас нет пароля и имени пользователя, вам просто нужно написать собственный метод для добавления бэкэнда аутентификации в модель User. И это то, что делает моя функция _login_user) - если пользователь уже аутентифицирован, он просто вызывает login, в противном случае он сначала добавляет бэкэнд по умолчанию к модели User, не проверяя правильное имя пользователя и пароль (например, authenticate делает).

0 голосов
/ 11 октября 2013

Вы можете создать известный пароль (поместить его в settings.py) и использовать его так, как если бы он вводился пользователем.Создайте пользователя с этим и аутентифицируйте пользователя с этим.

0 голосов
/ 25 сентября 2011

Для других, читающих эту ветку, я получил похожее сообщение об ошибке, когда я использовал User.objects.create () вместо User.objects.create_user ().По сути, первым методом была установка чистого пароля, тогда как create_user шифрует пароль.Очистить пароли не удастся аутентифицировать.Проверьте вашу базу данных, если у вас установлены пароли в открытом виде, то, скорее всего, вам нужно использовать create_user ().

Запрос автора можно исправить, просто установив пользователя по умолчанию и пароль, используя вместо этого create_user ()только user.save ().

...