【问题标题】:Can I Override Global Authentication for a Single Request Type in an ApiView using DRF?我可以使用 DRF 覆盖 ApiView 中单个请求类型的全局身份验证吗?
【发布时间】:2020-02-03 16:09:55
【问题描述】:

我在一个大型项目中使用 django_rest_frameork (DRF)。一般来说,我希望我的所有视图都受到保护,因此我将令牌身份验证设置为我的全局身份验证方案。但是有一些视图我希望关闭它,例如,创建一个新用户,然后登录。

例如我的/User ApiView 有一个getpost 方法。 get 返回用户配置文件,post 创建一个新用户。如何仅在 /User post 上覆盖全局身份验证方案?我在获取用户信息时仍然需要打开它。

我要求更多的是增加我对 DRF 的理解。我知道我可以将 /User/ 调用分离到不同的 ApiViews 中,其中一个经过身份验证,一个没有经过身份验证。我也知道我可以完全放弃全局方案并在预览的基础上进行身份验证。

是否有一种特别“pythonic”或 django 典型的方式来做到这一点?有什么建议吗?

【问题讨论】:

    标签: python django authentication django-rest-framework


    【解决方案1】:

    您可以编写自定义permission class 并在某些视图中使用它。例如:

    from rest_framework.permissions import BasePermission
    
    class AllowPostAny(BasePermission):
        def has_permission(self, request, view):
            if request.method == "POST":
                return True
            return bool(request.user and request.user.is_authenticated)  
    

    您现在可以在视图中使用此权限:

    class ExampleView(APIView):
        permission_classes = [AllowPostAny]
    

    【讨论】:

    • 谢谢,看起来很完美。如果我启用了全局身份验证方案,然后将其添加到某个特定视图中,特定视图的身份验证类是否会覆盖全局身份验证,或者请求必须由两个身份验证类进行身份验证?
    • @Brian 权限实际上不是身份验证。这有点不同,不会改变身份验证过程。您可以将其视为一个附加层,可帮助您自定义对特定视图或对象的访问。请注意,默认权限类是 DRF。当您在视图级别定义 permission_classes 时,您会覆盖它。但同样它不会覆盖身份验证类。请检查文档的身份验证模式:django-rest-framework.org/api-guide/authentication 希望它使身份验证和权限类之间的区别更加清晰。
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2015-12-18
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多