【问题标题】:permissions : in django rest framework权限:在 django rest 框架中
【发布时间】:2016-03-16 12:48:19
【问题描述】:

我正在开发 django rest 框架。我在权限方面遇到问题。 我想向管理员用户授予 G​​ET 和 POST 权限,而仅向其他用户授予 POST 权限(真实)。到目前为止,我已经编写了以下代码:

pemissions.py

class UserAccessPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.method == 'GET' or request.method == 'POST':
            return request.user and request.user.is_staff
        if request.method == 'POST':
            return request.user and request.user.is_authenticated()

此代码未按预期工作。只有管​​理员用户能够 GET 和 POST。其他用户没有获得任何许可。

各位帮忙。 提前致谢。

已编辑

class UserAccessPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.method == 'POST':
            return request.user and request.user.is_authenticated()
        elif request.method == 'GET':
            return request.user and request.user.is_staff

【问题讨论】:

  • 这段代码根本没有意义。 elif 块永远不会被执行
  • 好吧,我忘了编辑

标签: python django django-rest-framework


【解决方案1】:

您的条件有误。如果是 GET 请求,第一个条件总是匹配的,这需要管理员权限。

这就是你想要的:

class UserAccessPermission(permissions.BasePermission):
    def has_permission(self, request, view):
    if request.method == 'POST':
            return request.user and request.user.is_authenticated()    
    elif request.method == 'GET': # no need to check for POST here
            return request.user and request.user.is_staff

【讨论】:

  • 管理员是否一直有发布权限?
  • 是的,如果方法是POST,如果用户通过身份验证,这总是返回True,包括员工/管理员。
  • 当我在浏览器中以普通(经过身份验证的)用户(而不是管理员)身份登录时出现问题,我无法发布,但当我使用“Postman Chrome 应用程序”时,我可以发布在那里。
  • 如果您在浏览器中打开开发工具,您可以看到发出的请求。检查来自 Postman 的请求与来自浏览器的请求之间的差异。
  • 它在 Postman 中有效,但在可浏览的 API 文档中无效,这意味着您发送请求的方式有所不同。我怀疑这是身份验证的问题。您对 API 使用哪种身份验证?
【解决方案2】:

您正在使用elif,但这部分不会被评估,因为如果方法是POST,第一个条件总是True

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2016-11-20
    • 2014-08-25
    • 2016-01-25
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2020-09-22
    相关资源
    最近更新 更多