django-rest-framework - 如何检查当前用户是否登录 django rest 框架?如何通知其他 django 应用程序当前用户已登录?
问题描述
我ListCreateAPIView
用于POST and GET requests
. 我想检查当前用户是否登录了 GET 请求。如何在 GET 方法中获取当前用户(如果他已登录)?为了使它工作,我必须使用令牌发送,这不是我想要的,因为如果用户注销,用户将无法访问 listView。我以为 django 发出信号,或者重写授权。
我以为是django信号,还是重写Permissions或Authorization。
class PropertyList(generics.ListCreateAPIView):
"""To create a property"""
permission_classes = [permissions.IsAuthenticatedOrReadOnly, ]
queryset = Property.objects.filter(published=True)
serializer_class = PropertySerializer
filterset_class = PropertyFilter
pagination_class = LimitOffsetPagination
#
# def perform_create(self, serializer):
# serializer.save(created_by=self.request.user)
# for _ in range(100):
# logger.info("Your log message is here")
def get_serializer_context(self):
context = super().get_serializer_context()
context['is_create'] = True
print(self.request.user)
if self.request.user.is_authenticated:
print(self.request.user)
current_user = self.request.user
context['user_favs'] = (Bookmark.objects.filter(
bookUser = current_user
).values(
))
else:
context['user_favs'] = False
return context
在 get_serializer_context(self) 中,我想获取当前用户,因为我返回用户已添加书签的属性。我需要在我的 Get 请求中添加令牌以拥有当前用户,但这意味着,我们必须登录才能查看属性,这不是我想要的
设置
REST_FRAMEWORK = {
"DATE_INPUT_FORMATS": ["%d-%m-%Y"],
# 'DATETIME_FORMAT': "%d-%m-%Y %H:%M:%S",
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
# 'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
'EXCEPTION_HANDLER': 'dooba.utils.custom_exception_handler',
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
# 'DEFAULT_PARSER_CLASSES': (
# 'rest_framework.parsers.JSONParser',
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser',
# )
}
解决方案
self.request.user
如果没有登录用户,您可以在 APIView 方法中访问用户对象,它应该是AnonymousUser
,否则您应该获取登录用户。
编辑:进一步的研究表明,当您使用 JSONWebTokenAuthentication 和 IsAuthenticatedOrReadOnly 时,即使您发出 GET 请求,也会返回带有过期令牌的 401。我建议您在向视图发出 GET 请求时不要PropertyList
放置 Authenticate 标头,这将解决您的问题。
推荐阅读
- android - Anroid:意图获得相同的额外键但不同的值类型
- javascript - 如何将元素推送到未全局初始化为空数组的空数组中?
- ios - 运行时错误消息:loadView 实例化了带有来自故事板 Main 的标识符 ViewController 的视图控制器,但没有获得 TableView
- parsing - 如何从pdf中提取文本?
- android - 如何在 Espresso 测试中发送 shell 命令
- python-3.x - Firebase:未找到 event.notification.data.url
- python - 运行客户端\服务器python时套接字断开连接
- excel - 跨工作簿使用公共函数
- asp.net - 如何在 IIS 中将应用程序添加到共享点网站
- sql - 如果我从表中删除一条记录,它会在许多其他地方被删除