2016-06-13 6 views
1

새로운 Djnago 애플리케이션을 구축 중입니다. 로그인과 등록을 위해 django-rest-auth (http://django-rest-auth.readthedocs.io/en/latest/index.html)를 사용하고 있습니다. 그러나 거기에 몇 가지 문제가 있습니다.장고 안정 로그인 및 등록 실패

정확한 문제는 다음과 같습니다

로그인에 대한
  1. : 나는 양식 및 원시 데이터 옵션을 모두 사용하여 API를 통해 로그인 할 때 로그인이 실패합니다. 그것은 "non_field_errors": ["User account is disabled."] 오류를 제공합니다.
  2. 등록 할 때 : 데이터를 채우고 등록하면 오류가 발생하지만 데이터는 데이터베이스에 저장됩니다.

는 지금은 꽤 많은 일들을했고, 내가 잘못 한 일을 나는 확실하지 않다, 내가 만든 신선한 장고 나머지 프로젝트는

  • 을 만든 다음 순서

    1. 에서 일을했다
      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]) 
      
    2. AUTH_USER_MODEL = 'myauth.User'와 같은 settings.py에 추가 : 다음과 같이 사용자 정의 사용자 모델을 가지고 myauth라는 응용 프로그램은, 그것은 본다 그것을 admin.py에 등록했습니다. 마이그레이션은 위에서 언급 한 열이있는 모든 테이블을 만들었습니다.

    3. username과 email 및 password와 함께 first_name과 last_name을 등록 할 수 있도록 등록을 수정하고 싶습니다. 또한 사용자 이름 대신 이메일을 사용하여 로그인 할 수 있습니다. 그래서 내 사용자 모델과 settings.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 
      
    4. 내 settings.py 보이는 : 내 serializers.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) 기본적으로 '거짓'을 설정했습니다. 나는 그것을 등록하는 동안 사용자를 비활성화하는 것 같아요. 그 이유는 로그인하는 동안 응답이 '비활성화 됨'입니다.

    새 계정을 등록하거나 만들 때 is_active = true로 설정하십시오.

    +0

    대신 이메일을 사용하여 로그인 할 수있는 변경 사항이 있음을 언급하기 위해 약간의 질문이 업데이트되었습니다. 등록이 여전히 작동하지 않습니다. API에서 HTML 양식을 사용할 때 RAW를 사용하는 동안 완전히 실패했습니다. 데이터를 입력하면 오류가 "세부 정보"로 표시됩니다. "메서드 \"가져 오기가 허용되지 않습니다. " 그러나 사용자는 데이터베이스에 추가됩니다. 로그인은 RAW 데이터로 작업했지만 사용자 정의 사용자 모델과 등록 시리얼 라이저 사이에 약간의 충돌이 있다고 생각합니다. (나는 first_name과 last_name 대신에 완전한 이름과 짧은 이름이 있음을 알았습니다.) http://blog.mathandpencil.com/을 추천했습니다. 내 사용자 정의 사용자 모델에 대한 대체 - django-custom-user-models-in-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