基于 Django 类的视图中的身份验证用户

Posted

技术标签:

【中文标题】基于 Django 类的视图中的身份验证用户【英文标题】:Authentication User in Django Class Based Views 【发布时间】:2015-08-03 03:43:24 【问题描述】:

我正在尝试重构我的 django 项目。 因此我想重构:

    @api_view([GET, POST])
    @permission_classes((IsAuthenticated, VehiclePermissions, ))
    def inactive_vehicle_view(request):

        if request.method == "GET":
            con = CBaseUtil.get_prod_instance()
            vehicle_bo = VehicleBO()
            dongle_dao = OBDDongleDAO(con)

            since_days = int(request.GET.get("since", 28))

            vehicles = vehicle_bo.find_vehicles_by_user_context(request.user.details)

            return Response(vehicles, status=status_code, headers=get_headers(request))

到这样的基于类的视图:

class InactiveVehicleView(View):

    @authentication_classes((BasicAuthentication, WebsiteAuthentication))
    @permission_classes((IsAuthenticated, VehiclePermissions, ))
    def dispatch(self, *args, **kwargs):
        return super(InactiveVehicleView, self).dispatch(*args, **kwargs)

    def get(self, request):
        con = CBaseUtil.get_prod_instance()
        vehicle_bo = VehicleBO()
        dongle_dao = OBDDongleDAO(con)

        since_days = int(request.GET.get("since", 28))

        vehicles = vehicle_bo.find_vehicles_by_user_context(request.user.details)

        return Response(vehicles, status=status_code, headers=get_headers(request))

我面临的问题是我无法像在旧版本中那样通过 request.user.details 获取用户详细信息,因为 WSGI-Request 不包含属性用户。我想我对装饰器做错了,但我想不通。

仅供参考,视图被映射到这样的网址中:

url(r'^vehicles/inactive/?$', InactiveVehicleView.as_view())

有人知道我在身份验证和/或装饰器方面做错了什么吗?

【问题讨论】:

对,我也试过把 api_view 装饰器放在两个,但这无济于事。 也许这就是你需要的docs.djangoproject.com/en/1.8/topics/class-based-views/intro/… @danielcorreia 我已经尝试按照基于类的视图文档来实现。但是没有提示如何使用 authentication_classes 和 permission_classes 装饰器以及如何获取认证用户的数据。 【参考方案1】:

根据Django Rest Framework Authentication Docs,您的视图应该继承APIView,并将authentication_classespermission_classes设置为属性,而不是使用装饰器。

from rest_framework.views import APIView

class InactiveVehicleView(APIView):

    authentication_classes = (BasicAuthentication, WebsiteAuthentication)
    permission_classes = (IsAuthenticated, VehiclePermissions)

    def get(self, request):
        ...

【讨论】:

谢谢,这解决了我的问题。除了基于类的教程之外,还应该检查停靠点。

以上是关于基于 Django 类的视图中的身份验证用户的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架中的基于会话的与令牌身份验证

基于类的视图django中的JWT验证

如何在django2.0.6中的通用删除视图中添加用户身份验证

Django 1.4 - ManyToMany 字段看起来像用户身份验证中的用户权限字段

没有用户模型的 Django 基于令牌的身份验证

视图之间的Django身份验证