如何使用自定义抽象用户获取django中的当前登录用户

问题描述

我正在尝试吸引正在向我的api发出发布请求的用户。我正在使用它来将发布与创建它的用户相关联。但是,当我发布帖子时,它总是返回匿名用户。我能够进行身份验证,注册和正确登录。我还有其他方法可以解决吗?

我正在使用django allauth通过电子邮件进行身份验证

我具有以下用户模型:

class CustomUser(AbstractBaseUser,PermissionsMixin):
email = models.EmailField(_('email address'),unique=True)
password = models.CharField(max_length=78)
full_name = models.CharField(max_length=50)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(default=timezone.Now)

USERNAME_FIELD = 'email'
required_FIELDS = []

objects = CustomUserManager()

def __str__(self):
    return(self.email)

以下是我的列表模型:

class Listing(models.Model):
listingId = models.IntegerField(max_length=5)
streetAddress = models.CharField(max_length=120)
city = models.CharField(max_length=120)
state = models.CharField(max_length=120)
zipCode = models.IntegerField(max_length=5)
price = models.IntegerField(max_length=6)
deposit = models.IntegerField(max_length=6,default=0)
description = models.TextField()
rooms = models.IntegerField(max_length=2)
bathrooms = models.IntegerField(max_length=2)
rentalType = models.IntegerField(choices=RentalType.choices(),default=RentalType.HOUSE)
amenities = models.TextField()
listingUser = models.ForeignKey(settings.AUTH_USER_MODEL,related_name='listings',on_delete=models.CASCADE,null=True)
dateAvailable = models.DateTimeField(default=datetime.Now)
created = models.DateTimeField(auto_Now_add=True)
updated = models.DateTimeField(auto_Now=True)

def __str__(self):
    return self.streetAddress

还有我对Listing模型的views.py

class ListingViewSet(viewsets.ModelViewSet):
queryset = Listing.objects.all()
serializer_class = ListingSerializer

def perform_create(self,serializer):
    custom = settings.AUTH_USER_MODEL
    user = get_user_model()
    print(self.request.user)
    #serializer.save(listingUser=self.request.user)

def get(self,request,*args,**kwargs):
    return self.list(request,*kwargs)

def post(self,**kwargs):
    return self.create(request,**kwargs)

编辑:我正在与前端不同的服务器上设置django。不知道这是否会改变我目前的方法。我尝试研究request.user方法。据我了解,它访问认的用户模型。

Settings.py

AUTH_USER_MODEL = 'users.CustomUser'


INSTALLED_APPS = [
    'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','django.contrib.sites','corsheaders','listing','users','rest_framework','rest_framework.authtoken','rest_auth','allauth','allauth.account','rest_auth.registration','allauth.socialaccount',]

REST_AUTH_SERIALIZERS = {
    'USER_DETAILS_SERIALIZER': 'users.serializers.UserSerializer',}

REST_AUTH_REGISTER_SERIALIZERS = {
        'REGISTER_SERIALIZER': 'users.serializers.UserSerializer',}


AUTHENTICATION_BACKENDS = (
   "allauth.account.auth_backends.AuthenticationBackend",)

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_EMAIL_required = True
ACCOUNT_USERNAME_required = False
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_UNIQUE_EMAIL = True 

解决方法

我认为您可以使用会话身份验证,然后可以通过request.user获得用户。

在settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication','rest_framework.authentication.SessionAuthentication',]
}

views.py

from rest_framework.authentication import SessionAuthentication

class ListingViewSet(viewsets.ModelViewSet):
    queryset = Listing.objects.all()
    serializer_class = ListingSerializer
    authentication_classes = (SessionAuthentication,)
    
    def perform_create(self,serializer):
        custom = settings.AUTH_USER_MODEL
        user = get_user_model()
        print(self.request.user)
        #serializer.save(listingUser=self.request.user)

    def get(self,request,*args,**kwargs):
        return self.list(request,*kwargs)

    def post(self,**kwargs):
        return self.create(request,**kwargs)