2016-06-13 3 views
1

Я создаю новое приложение Djnago. Я использую django-rest-auth (http://django-rest-auth.readthedocs.io/en/latest/index.html) для входа и регистрации. Однако есть некоторые проблемы с этим.Ошибка регистрации и регистрации Django auth

Точная проблема заключается в:

  1. Для входа в систему: Логин неудачен, когда я пытаюсь войти через API, используя как форму и сырые варианты данных. Он дает ошибку "non_field_errors": ["User account is disabled."].
  2. Для регистрации: когда я заполняю данные и регистрируюсь, это дает мне ошибку, однако данные сохраняются в базе данных.

Теперь я сделал довольно много вещей, и я не уверен, что я сделал неправильно, я сделал то, в следующем порядке

  1. Свежий остальной проект Django, созданный
  2. Created приложение называется myauth иметь заказную модель пользователя, она выглядит следующим образом:

    class UserManager(BaseUserManager): 
    
    def _create_user(self, username, email, password, is_staff, is_superuser, **extra_fields): 
    now = timezone.now() 
    if not username: 
    raise ValueError(_('The given username must be set')) 
    email = self.normalize_email(email) 
    user = self.model(username=username, email=email, 
        is_staff=is_staff, is_active=False, 
        is_superuser=is_superuser, last_login=now, 
        date_joined=now, **extra_fields) 
    user.set_password(password) 
    user.save(using=self._db) 
    return user 
    
    def create_user(self, username, email=None, password=None, **extra_fields): 
    return self._create_user(username, email, password, False, False, 
         **extra_fields) 
    
    def create_superuser(self, username, email, password, **extra_fields): 
    user=self._create_user(username, email, password, True, True, 
         **extra_fields) 
    user.is_active=True 
    user.save(using=self._db) 
    return user 
    
    
    class User(AbstractBaseUser, PermissionsMixin): 
        username = models.CharField(_('username'), max_length=30, unique=True, 
        help_text=_('Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters'), 
        validators=[ 
        validators.RegexValidator(re.compile('^[\[email protected]+-]+$'), _('Enter a valid username.'), _('invalid')) 
        ]) 
        first_name = models.CharField(_('first name'), max_length=30, blank=True, null=True) 
        last_name = models.CharField(_('last name'), max_length=30, blank=True, null=True) 
        email = models.EmailField(_('email address'), max_length=255, unique=True) 
        is_staff = models.BooleanField(_('staff status'), default=False, 
        help_text=_('Designates whether the user can log into this admin site.')) 
        is_active = models.BooleanField(_('active'), default=False, 
        help_text=_('Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')) 
        date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 
        receive_newsletter = models.BooleanField(_('receive newsletter'), default=False) 
        birth_date = models.DateField(auto_now=False, null=True) 
        address = models.TextField(max_length=500, null=True) 
        phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.") 
        phone_number = models.CharField(validators=[phone_regex], blank=True, max_length=20) # validators should be a list 
    
    
        USERNAME_FIELD = 'email' 
        REQUIRED_FIELDS = ['username',] 
    
        objects = UserManager() 
    
        class Meta: 
        verbose_name = _('user') 
        verbose_name_plural = _('users') 
    
        def get_full_name(self): 
        full_name = '%s %s' % (self.first_name, self.last_name) 
        return full_name.strip() 
    
    def get_short_name(self): 
        return self.first_name 
    
    def email_user(self, subject, message, from_email=None): 
        send_mail(subject, message, from_email, [self.email]) 
    
  3. Добавлен его в settings.py в AUTH_USER_MODEL = 'myauth.User', а также зарегистрировал его в admin.py. Миграции создали все таблицы с вышеупомянутыми столбцами.

  4. Я хотел бы изменить регистрацию, чтобы иметь возможность регистрировать имя_имя и имя_файла вместе с именем пользователя и адресом электронной почты и паролем. Также, чтобы иметь возможность входить в систему, используя электронную почту вместо имени пользователя. Таким образом, для моей модели пользователя и settings.py может быть конфликтный код. Для этого в моем serializers.py я добавил следующий код:

    from myauth.models import User 
    
    from allauth.account import app_settings as allauth_settings 
    from allauth.utils import email_address_exists 
    from allauth.account.adapter import get_adapter 
    from allauth.account.utils import setup_user_email 
    
    #Custom registration to store first and last name along with email and password 
    class RegisterSerializer(serializers.Serializer): 
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED) 
    first_name = serializers.CharField(required=True, write_only=True) 
    last_name = serializers.CharField(required=True, write_only=True) 
    password1 = serializers.CharField(required=True, write_only=True) 
    password2 = serializers.CharField(required=True, write_only=True) 
    
    def validate_email(self, email): 
        email = get_adapter().clean_email(email) 
        if allauth_settings.UNIQUE_EMAIL: 
         if email and email_address_exists(email): 
         raise serializers.ValidationError(
          _("A user is already registered with this e-mail address.")) 
    return email 
    
    def validate_password1(self, password): 
        return get_adapter().clean_password(password) 
    
    def validate(self, data): 
        if data['password1'] != data['password2']: 
        raise serializers.ValidationError(
         _("The two password fields didn't match.")) 
        return data 
    
    def get_cleaned_data(self): 
        return { 
        'first_name': self.validated_data.get('first_name', ''), 
        'last_name': self.validated_data.get('last_name', ''), 
        'password1': self.validated_data.get('password1', ''), 
        'email': self.validated_data.get('email', ''), 
        } 
    
    def save(self, request): 
        adapter = get_adapter() 
        user = adapter.new_user(request) 
        self.cleaned_data = self.get_cleaned_data() 
        adapter.save_user(request, user, self) 
        setup_user_email(request, user, []) 
        user.save() 
        return user 
    
  5. Мой settings.py выглядит следующим образом:

    INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'rest_framework', 
    'rest_framework.authtoken', 
    'rest_auth', 
    'allauth', 
    'allauth.account', 
    'rest_auth.registration', 
    'myauth', 
    'swarms_app' 
    ) 
    
    AUTH_USER_MODEL = 'myauth.User' 
    
    MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'django.middleware.security.SecurityMiddleware', 
    ) 
    
    ROOT_URLCONF = 'urls' 
    
    TEMPLATES = [ 
    { 
        'BACKEND': 'django.template.backends.django.DjangoTemplates', 
        'DIRS': [], 
        'APP_DIRS': True, 
        'OPTIONS': { 
         'context_processors': [ 
          'django.template.context_processors.debug', 
          'django.template.context_processors.request', 
          'django.contrib.auth.context_processors.auth', 
          'django.contrib.messages.context_processors.messages', 
         ], 
         }, 
        }, 
        ] 
    
        WSGI_APPLICATION = 'config.wsgi.application' 
    
    DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'new_swarms', 
        'USER': 'root', 
        'PASSWORD': 'root', 
        'HOST': 'localhost', # Or an IP Address that your DB is hosted on 
        'PORT': '3306', 
    } 
    } 
    
    
    STATIC_URL = '/static/' 
    
    ############################################################## 
    ## All the customization as taken from original swarms code ## 
    ############################################################## 
    
    
    #This is added to use custon registration serializer which stores first and last name along with email and password 
    REST_AUTH_REGISTER_SERIALIZERS = { 
        'REGISTER_SERIALIZER': 'myauth.serializers.RegisterSerializer', 
    } 
    
    REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication', 
        'rest_framework.authentication.SessionAuthentication', 
        'rest_framework.authentication.TokenAuthentication', 
    ) 
    } 
    
    #Following is added to enable registration with email instead of username 
    AUTHENTICATION_BACKENDS = (
    # Needed to login by username in Django admin, regardless of `allauth` 
    "django.contrib.auth.backends.ModelBackend", 
    
    # `allauth` specific authentication methods, such as login by e-mail 
    "allauth.account.auth_backends.AuthenticationBackend", 
    ) 
    
    #This is required otherwise it asks for email server 
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
    
    ACCOUNT_AUTHENTICATION_METHOD = 'email' 
    ACCOUNT_EMAIL_REQUIRED = True 
    ACCOUNT_USERNAME_REQUIRED = False 
    

Пользовательские модель, которую я создал, кажется, работает, как на пролете создала таблицу со всеми указанными полями. Я даже вижу это в моем интерфейсе администратора.

Что здесь общего не работает?

+0

Перейти к таблице учетных записей пользователей и проверить активный статус? – Anurag

+0

Я активировал статус, чтобы быть правдой. Пожалуйста, обратитесь к следующему разговору. Я также обновил вопрос немного, чтобы упомянуть, что у меня также были изменения, позволяющие входить в систему, используя электронную почту вместо имени пользователя. – Nitish

ответ

1
user = self.model(username=username, email=email, 
    is_staff=is_staff, is_active=False, 
    is_superuser=is_superuser, last_login=now, 
    date_joined=now, **extra_fields) 

Вы создали (is_active) по умолчанию 'ложь'. Я думаю, что при регистрации он отключает пользователя. По этой причине, при входе в систему вы получаете ответ «отключен».

При регистрации или создании новой учетной записи make is_active = true.

+0

Я изменил, и регистрация все еще не работает: в API, когда я использую HTML-форму, она полностью не увенчалась успехом при использовании RAW данных, он показывает ошибку как «деталь»: «Метод \« GET \ »не разрешен». но пользователь добавляется в базу данных. Вход работал с RAW-данными, но я думаю, что между моей пользовательской моделью и регистрационным сериализатором существует некоторое столкновение (я замечаю, что есть полное имя и короткое имя вместо first_name и last_name). Я ссылался на http://blog.mathandpencil.com/ replace-django-custom-user-models-in-an-existing-application/для моей пользовательской модели – Nitish

+0

Нет ссылки, которую я назвал для моей пользовательской модели: https://www.lasolution.be/blog/creating- custom-user-model-django-16-part-1.html – Nitish

1

Я обновил версию Django и переустановил django-rest-auth и django-allauth, когда регистрация и вход в систему начали работать, но не совсем корректно.

через API можно только при использовании необработанных данных, а не при использовании формы HTML, см скриншот:

enter image description here

Выход еще сломана.

enter image description here

Любые дальнейшие ответы на оба эти вопросы? Выход и включение через HTML?

+1

Это также было решено путем обновления Django-rest-framework до последних – Nitish

Смежные вопросы