如何使用自定义抽象用户在django中获取当前登录用户
How to get current logged in user in django with a custom abstract user
我正在尝试让正在主动向我的 api 发出 post 请求的用户。我正在使用它来将 posting 与创建它的用户相关联。但是,当我创建 post 时,它总是 returns 匿名用户。我能够正确验证、注册和登录。我还有其他方法可以解决这个问题吗?
我正在使用 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)
以下是我的Listing模型:
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
还有我的 views.py Listing 模型
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, *args, *kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **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, *args, *kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
我正在尝试让正在主动向我的 api 发出 post 请求的用户。我正在使用它来将 posting 与创建它的用户相关联。但是,当我创建 post 时,它总是 returns 匿名用户。我能够正确验证、注册和登录。我还有其他方法可以解决这个问题吗?
我正在使用 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)
以下是我的Listing模型:
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
还有我的 views.py Listing 模型
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, *args, *kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **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, *args, *kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)