为什么 DRF 可浏览 API 对每个实际请求的多个请求类型运行权限检查?

2024-02-14

我有一个简单的 DRF 列表视图,想要编写一些与以下内容相关的权限POST要求。这导致了错误GET发出了请求。这让我意识到我的权限类在未提交的请求上被多次调用。这是我的文件。

权限.py:

class IsDummy(permissions.BasePermission):
    def has_permission(self, request, view):
        print("\n{}\n".format(request.method)) 
        if request.method in permissions.SAFE_METHODS:
            return True
        return False

视图.py:

class UserListView(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [IsDummy]

仅当我从浏览器向可浏览 api 提交请求时,才会出现此问题。当我在列表 url 提交 GET 请求时,我会从以下内容中的 print 语句打印到终端:IsDummy权限类别:

GET

POST

POST

OPTIONS

当我提交一个GET or OPTIONS通过邮递员请求我看到了我实际使用的单一、适当的请求方法。

似乎列出的第一个方法始终是我实际使用的方法,我不知道额外的方法在哪里POSTs 和OPTION都来自.更奇怪的是,在完成所有这些之后,页面将正常加载,即使POST请求显然应该导致IsDummy.has_permission返回一个False.

Chrome 开发工具仅显示一个GET正在提交请求,因为它似乎只发生在可浏览的 api 中,我确信它与此有关,但我不知道我搞砸了什么才能发生这种情况。


浏览器API是一个可以添加\更新\删除实例的单页。当你询问这个页面时,DRF会检查所有需要的权限,看看相应的模块是否允许显示。

在DRF源代码深处,你可以看到这一点renderers.py:

class BrowsableAPIRenderer(BaseRenderer):
    """
    HTML renderer used to self-document the API.
    """
    media_type = 'text/html'
    format = 'api'
    template = 'rest_framework/api.html'
    filter_template = 'rest_framework/filters/base.html'
    code_style = 'emacs'
    charset = 'utf-8'
    form_renderer_class = HTMLFormRenderer

    ...

    def get_context(self, data, accepted_media_type, renderer_context):
         ....
         context = {
             ....
            'put_form': self.get_rendered_html_form(data, view, 'PUT', request),
            'post_form': self.get_rendered_html_form(data, view, 'POST', request),
            'delete_form': self.get_rendered_html_form(data, view, 'DELETE', request),
            'options_form': self.get_rendered_html_form(data, view, 'OPTIONS', request),
         }
         return context

    def get_rendered_html_form(self, data, view, method, request):
        ....
        if not self.show_form_for_method(view, method, request, instance):
            ....

    def show_form_for_method(self, view, method, request, obj):
        """
        Returns True if a form should be shown for this method.
        """
        if method not in view.allowed_methods:
            return  # Not a valid method

        try:
            view.check_permissions(request)
            if obj is not None:
                view.check_object_permissions(request, obj)
        except exceptions.APIException:
            return False  # Doesn't have permissions
        return True

view.check_permissions(request) in show_form_for_method这就是 DRF 可浏览 API 对每个实际请求的多个请求类型运行权限检查的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 DRF 可浏览 API 对每个实际请求的多个请求类型运行权限检查? 的相关文章

随机推荐

  • 如何在没有表情混合的情况下制作WPF动画

    有没有一种方法或工具可以让我在不使用 Expression Blend 的情况下制作 WPF 动画和控件 也许只使用 Visual Studio 2008 或其他东西 您可以使用 Visual Studio ALSO 可视化网络开发人员 X
  • 将 clang_complete 与 OS X 框架结合使用

    如果我将以下内容保存到 tmp test cpp include
  • 在 R 中向多直方图添加关键图例

    如何在下面的图中添加关键图例 我希望在右上角的某个地方有一个关键图例 其中有两个短水平颜色条 红色的应该说 整形手术出了问题 蓝色的应该说 德国 我使用以下代码来生成该图 bar2 lt read table div ana mut bar
  • Android 上的 Volley + OkHttp 在状态 200 响应上给出错误

    当我仅使用 Volley 发出请求时 一切都很顺利 我的 StringRequest 会转到 onResponse 但是当我切换到 Volley Okhttp 组合时 我的请求通过 我收到与以前相同的响应 但随后收到以下错误消息 E Vol
  • 从 Cpanel git 克隆项目,显示此错误“ssh 远程主机标识已更改”

    我知道类似的问题已经被问过很多次了 但这里有一个区别 尝试从 cpanel 共享托管服务器克隆项目 如果尝试使用此命令sudo git clone ssh email protected cdn cgi l email protection
  • C 代码的输出,例如通过引用调用 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 给定这个
  • 如何在 Android 中呈现泰米尔语 unicode

    Okay 所以我的问题是我有一个 XML 泰米尔语 unicode feed 我想获取它并将其显示在 Android 应用程序中 当我尝试执行此操作时 由于 Android 没有对泰米尔语的本机支持 因此必须使用自定义字体 但随后问题就出现
  • SQL Server 2005 T-SQL 中的 Base64 编码

    我想编写一个 T SQL 查询 将字符串编码为 Base64 字符串 令人惊讶的是 我找不到任何用于执行 Base64 编码的本机 T SQL 函数 是否存在本机函数 如果没有 在 T SQL 中进行 Base64 编码的最佳方法是什么 我
  • UIImage调整大小(缩放比例)[重复]

    这个问题在这里已经有答案了 可能的重复 调整 UIImage 的纵横比 https stackoverflow com questions 1703100 resize uiimage with aspect ratio 下面的代码完美地调
  • Git 因 100% cpu 使用而挂起(这是磁盘问题)

    有一些操作挂在我的存储库之一上 git gc 在 计数对象 7409 处以 100 使用率挂起 当我启动 gitk 时 它会启动此命令 该命令也会因 100 CPU 使用率而挂起 git log no color z pretty raw
  • EPPlus“System.OutOfMemoryException”

    我正在尝试使用打开 38MB Excel 文件EPPlus v4 0 我可以将它传递给Excel包变量 但是当我尝试从该变量获取工作簿时 它会导致我出现 系统内存不足异常 这是我的代码 Dim temppath Path GetTempPa
  • 如何使工具栏后退按钮居中?

    我在尝试将后退按钮置于支持工具栏中央时遇到问题 我在 ActionBarActivity 中使用它
  • 在 CentOS 中使用 /etc/resolv.conf 解析 AD 域

    我已使用 Realm 配置 SSSD 以使用 AD 凭据登录 centOS VM 请参考设置here https stackoverflow com questions 63705156 sssd integration with micr
  • 如何用Java编写UTF-8文件?

    我有一些当前代码 问题是它创建了一个 1252 代码页文件 我想强制它创建一个 UTF 8 文件 任何人都可以帮助我使用这段代码 正如我所说 它目前有效 但我需要强制保存在 utf 上 我可以传递参数或其他东西吗 这就是我所拥有的 非常感谢
  • 在 Windows 中使用 Python 获取日期格式

    在给我的作业示例代码中 出现了这一行 date format locale nl langinfo locale D FMT 但在 Windows 中 该行返回以下错误 File C Users Shadark Dropbox IHM P3
  • 解释 OpenGL ES 背景图像的工作原理

    有人可以解释一下如何在 OpenGL ES 视图上渲染背景图像吗 从设置 OpenGL 环境的基础知识开始 我是 OpenGL 的新手 I m seeing https stackoverflow com questions 3387132
  • 如何使用 Firefox 插件从硬盘读取/写入文件?

    是否可以开发一个可以从硬盘读取 写入文件的 Firefox 插件 我应该使用什么代码 它只是链接 Hypnos 和 ephemient 中提供的代码的复制 和组合 const Cc Ci require chrome create prop
  • 模拟标准输入 - python 3中的多行

    我是 python 新手 一直在使用 python 3 进行学习 我正在使用 python 的单元测试框架来测试我的代码 问题 我需要进行单元测试的函数以以下方式接受输入 def compare a b c input strip spli
  • PHP 中比较的可变位置

    下面两种情况哪个更优化 if var value and if value var 抱歉 如果这与另一个问题重复 但我无法用谷歌搜索出答案 Thanks UPDATE 这称为尤达条件 更多信息here http wiert me 2010
  • 为什么 DRF 可浏览 API 对每个实际请求的多个请求类型运行权限检查?

    我有一个简单的 DRF 列表视图 想要编写一些与以下内容相关的权限POST要求 这导致了错误GET发出了请求 这让我意识到我的权限类在未提交的请求上被多次调用 这是我的文件 权限 py class IsDummy permissions B