Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用自定义抽象用户在django中获取当前登录用户_Python_Django_Django Allauth - Fatal编程技术网

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

Python 如何使用自定义抽象用户在django中获取当前登录用户,python,django,django-allauth,Python,Django,Django Allauth,我正在尝试让用户主动向我的api发出post请求。我用它来关联一个帖子和发布它的用户。然而,当我发表文章时,它总是返回匿名用户。我能够正确地进行身份验证、注册和登录。我还有别的办法吗 我正在使用django allauth通过电子邮件进行身份验证 我有以下用户模型: class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(_('email address'), unique=True) pas

我正在尝试让用户主动向我的api发出post请求。我用它来关联一个帖子和发布它的用户。然而,当我发表文章时,它总是返回匿名用户。我能够正确地进行身份验证、注册和登录。我还有别的办法吗

我正在使用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
以及清单模型的my 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, *args, *kwargs)

def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)
编辑:我正在与我的前端不同的服务器上设置django。不确定这是否会对我目前的方法产生影响。我试着研究request.user方法。据我所知,它访问默认用户模型

设置.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 
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

我认为您可以使用会话身份验证,然后通过
请求获取用户。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 
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)

我已尝试在我的views.py中使用request.user;返回匿名用户。您使用会话身份验证了吗?这会让用户一直登录到会话过期。我也尝试使用会话身份验证,它再次返回一个匿名用户。我确保在更新settings和views.py后应用迁移。如果我在某个地方犯了一个小错误,我道歉。这是我第一次使用django。我已经编辑了原始帖子以显示添加到设置中的变量。py抱歉,忘了提及我当前正在使用令牌身份验证,我也尝试使用会话身份验证和您建议的编辑,但它不起作用。谢谢你迄今为止的帮助。你解决了吗?因为你似乎接受了答案。请告诉我