2017-11-05 12 views
0

これは5日間のstruglingです。最初はうまくいましたが、突然、私に理解できないエロスを与え始めました。 MyCustomUserモデルとカスタム認証バックエンドが、この問題を解決することはできません。request.user.is_authenticatedいつもpython/djangoで匿名を返します

サインアップできますが、サインアップした後にユーザーにログインしますが、djangoシェルを開いてuser.is_authenticatedがtrueを返し、user.is_anonymousがfalseを返すかどうかをテストします。

問題の原因を特定するのを助けてください。仲間の開発者を仲間にしてください。

def sign_up(request): 

    if request.method == 'POST': 
     form = SignUpForm(request.POST) 

     if form.is_valid(): 

      new_user = form.save(commit=False) 

      #create string of first_name an last_name 
      full_name = '{0} {1}' .format(new_user.first_name, new_user.last_name) 

      #Slugify full name 
      new_user.slug = slugify(full_name) 

      new_user.save() 

      email = request.POST.get('email') 
      raw_password = request.POST.get('password1') 

      #Authenticate the user 
      user = authenticate(email=email, password=raw_password) 

      if user is not None : 

       login(request, user) 
       if request.user.is_authenticated: 

        #Redirect to success url after user has successfully is logged in. 
         return HttpResponseRedirect(reverse_lazy('jogos:question-list')) 


    else: 
     form = SignUpForm() 
    return render(request, 'jogos/sign_up.html', {'form':form}) 




from jogos.models import MyCustomUser 
from django.contrib.auth import get_user_model 

、私はまた私の設定で接続している私のCustomBackend:

怒鳴るは私のsign_up図です。

class MyCustomBackend(object): 

    def authenticate(self, request, email=None, password=None, **kwargs): 

     if email is None: 
      email = kwargs.get('email') 


     try: 
      user = MyCustomUser.objects.get(email=email) 


      if user.check_password(password): 
       return user 
      else: 
       return None 

     except MyCustomUser.DoesNotExist: 
       return None 




     def get_user(self, user_id): 
      try: 
       user = MyCustomUser.objects.get(pk=user_id) 
       if user.is_active: 
        return user 

     except MyCustomUser.DoesNotExist: 
      return None 

マイCustomUserモデル:

class MyCustomUser(AbstractBaseUser): 
    email = models.EmailField(max_length=50, verbose_name='email', unique=True) 
    first_name = models.CharField(max_length=15,blank=False) 
    last_name  = models.CharField(max_length=15,blank=True) 
    slug   = models.SlugField(null=True, unique=True) 
    is_staff  = models.BooleanField(default=False) 
    is_active  = models.BooleanField(default=True) 
    is_admin  = models.BooleanField(default=False) 
    is_superuser = models.BooleanField(default=False) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 


    def get_full_name(self): 
     full_name = '{0} {1}'.format(self.first_name, self.last_name) 
     return full_name.strip() 

    def get_short_name(self): 
     return self.first_name 


    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, app_label): 
     return True 


    @property 
    def is_superuser(self): 
     return self.is_superuser 

    @property 
    def is_staff(self): 
     return self.is_staff 


    def __str__(self): 
     return self.first_name 

そして私のUserManager alse:

from django.contrib.auth.base_user import BaseUserManager 


class UserManager(BaseUserManager): 
    use_in_migrations = True 

    def create_user(self, email, password=None): 

     if not email: 
      raise ValueError("Users must have an email address") 

     email = UserManager.normalize_email(email) 
     user = self.model(email=email) 

     user.set_password(password) 

     user.is_active = True 
     user.save(using=self._db) 
     return user 



    def create_superuser(self, email, password): 

     user = self.create_user(email, password=password) 

     user.is_active = True 
     user.is_superuser = True  
     user.is_admin = True 
     user.save(using=self._db) 

     return user 

を私がここに間違っているかを把握することはできませんし、すべてこのコードはスムーズ を働いていたし、私のコードベースを増やし続けるうちに、それだけで問題が発生し始めました。

答えて

2

ロジックは間違った方法でラウンドします。ユーザーをログインするまで、request.userは定義上、認証されていないユーザーです。したがってrequest.user.is_authenticatedは常にFalseになります。

このプロパティを確認する必要はありません。ユーザーが存在していることを知ったので、作成したばかりなので、ユーザーがNoneでないことを確認する必要はありません。ユーザーを直接ログインさせるだけです。

(カスタム認証バックエンドを作成した理由を私は理解していない、注意してください。これは、標準的なものとは異なる何もしていません。あなたがそれを必要としない。)

+0

は非常に感謝し、私は削除されましたその行は現在匿名としてログインしています。つまり、認証に失敗しました。 – Silas

+0

どうやって確認していますか? –

+0

質問フォームをレンダリングするテンプレートでチェックし、ユーザーが質問をする前にユーザーが認証されているか匿名かを確認してください。匿名を返します – Silas

関連する問題