Django:一种更干燥的方法来防止编辑/删除对象?

2024-03-30

读完Django的权限文档后,我还是一头雾水。 我想阻止用户编辑或删除他们不拥有的对象。 我是这样写的并且有效:

在views.py中:

def deleteReward(request, reward_id):
    reward = get_object_or_404(Reward, pk=reward_id)
    if reward.owner.user != request.user: # if the user linked to the reward is not the current one
        raise Exception("This reward is not yours, you can't delete it !")
    #...

但我认为这不干净、不干燥,原因有两个:

  1. 在每个 editStuff 和 deleteStuff 视图中,我必须编写相同的代码部分。

  2. 我目前正在用 Tastypie 编写一个 API,如果权限逻辑在视图中,我将无法重复使用它。最好的处理方法似乎是将API权限与Django权限进行映射(但我认为我编写的代码与权限无关)。

你能帮我找到正确的方法吗? 多谢。


这是我的工作示例。

1) 查询集

class PermissionQuerySet(models.query.QuerySet):
    def editable_by(self, user):
        return self.filter(user=user)

    def viewable_by(self, user):
        return self.filter(user=user)

2) 管理人员

class PermissionManager(models.Manager):
    def get_query_set(self):
        return PermissionQuerySet(self.model)

    def editable_by(self, user, *args):
        return self.get_query_set().editable_by(user, *args)

    def viewable_by(self, user, *args):
        return self.get_query_set().viewable_by(user, *args)

3) 型号

class MyModel(models.Model):
    ...
    objects = PermissionManager()

这种方法与基于类的视图完美配合。我看到你在使用 TastyPie。我以前从未使用过它,但它似乎也使用基于类的视图。

这是工作示例:

class MyUpdateView(UpdateView):
    def post(self, request, *args, **kwargs):
        self.request = request
        super(MyUpdateView, self).post(request, *args, **kwargs)

    def get_query_set(self):
        queryset = super(MyUpdateView, self).get_query_set()
        queryset = queryset.editable_by(self.request.user)
        if not queryset.exists():
            raise Exception("This reward is not yours, you can't delete it !")
        return queryset

我想你可以想象如何在CreateView、DeleteView中使用这种方式。我认为在 TastyPie 中实现这一点很容易。

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

Django:一种更干燥的方法来防止编辑/删除对象? 的相关文章

  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 当语料库有100亿个独特的DNA序列时,如何使用BK树实现快速模糊搜索引擎?

    我正在尝试使用BK tree https news ycombinator com item id 14022424python 中的数据结构 用于存储约 100 亿个条目的语料库 1e10 以实现快速模糊搜索引擎 一旦我添加超过 1000
  • 将文件标记为从 Python 中删除?

    在我的一个脚本中 我需要删除当时可能正在使用的文件 我知道我无法删除正在使用的文件 直到它不再使用为止 但我也知道我可以将该文件标记为由操作系统 Windows XP 删除 我将如何在 Python 中做到这一点 以及另一个不依赖于 pyw
  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • Python实时读取串口数据

    我正在使用 Python 中的脚本通过串行端口以 2Mbps 的速度从 PIC 微控制器收集数据 PIC 在 2Mbps 下完美定时工作 FTDI USB 串行端口在 2Mbps 下工作也很好 均通过示波器验证 我每秒发送消息 大小约为 1
  • python中嵌套字典值的总和

    我有一本这样的字典 data 11L a 2 b 1 a 2 b 3 22L a 3 b 2 a 2 b 5 a 4 b 2 a 1 b 5 a 1 b 0 33L a 1 b 2 a 3 b 5 a 5 b 2 a 1 b 3 a 1 b
  • 如何将嵌套的Python字典转换为简单的命名空间?

    假设我有一个深度为 N 的嵌套字典 如何将每个内部嵌套字典转换为简单的命名空间 example input key0a test key0b key1a key2a keyNx key2b test key1b test example o
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 按字符串子字符串的列过滤 Pandas 数据框

    我正在尝试使用列中的字符串值是数据框外部字符串的子字符串的条件来过滤数据框 下面的例子 df a b c hello bye hello reference str hello there output a c 一种方法可能是使用正则表达式
  • 手动安装开放多语言世界网 (NLTK)

    我正在使用一台只能访问专用网络并且无法从命令行发送指令的计算机 因此 每当我必须安装 Python 包时 我都必须手动安装 我什至不能使用 Pypi 幸运的是 NLTK 允许我手动下载语料库 从here https www nltk org
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • 保存游戏最高分?

    我使用 pygame 在 python 中制作了一个非常简单的游戏 分数取决于玩家达到的级别 我将级别作为变量称为score 我想在游戏开始或结束时显示顶级 我会更乐意显示多个分数 但我见过的所有其他线程都太复杂 我无法理解 所以请保持简单
  • 收到“/:未找到事件。”使用 PyCharm 远程调试器时

    当我使用 PyCharm 通过 ssh 进行远程调试时tcsh shell 服务器 很多时候它停止工作 并显示 未找到事件 更具体地说 我在 pycharm 调试控制台中遇到以下内容 ssh username hostserver 22 p
  • 如何连接多个字符串? [复制]

    这个问题在这里已经有答案了 如何将 stringList 中的所有字符串合并为一个而不打印它 例如 s joinStrings very hot day returns string print s Veryhotday 感觉有点倒退 但是
  • 枚举上的 random.choice

    我想用random choice on an Enum I tried class Foo Enum a 0 b 1 c 2 bar random choice Foo 但是这段代码失败了KeyError 我怎样才能随机选择一个成员Enum
  • Python 对列表中的值求和(如果它存在于另一个列表中)

    我有一个列表和一组 a list 1 2 2 1 1 1 b list 1 2 我正在寻找对应 b list 中的项目并将它们从 a list 中的值相加 以便输出为 1 3 2 1 我尝试过的 sum 0 for i in a list
  • PyMC3 和 Theano - 导入 pymc3 后,有效的 Theano 代码停止工作

    一些简单的 theano 代码可以完美运行 当我导入 pymc3 时停止工作 这里有一些片段可以重现错误 Initial Theano Code this works import theano tensor as tsr x tsr ds
  • 真实值与预测值的降维可视化

    我有一个数据框 如下所示 label predicted F1 F2 F3 F40 major minor 2 1 4 major major 1 0 10 minor patch 4 3 23 major patch 2 1 11 min

随机推荐

  • CLion 行注释的自动缩进不一致

    CLion 中出现一些奇怪的自动缩进 我不明白为什么 这是一个例子 int i1 5 some comments then I hit Enter auto indentation goes here I hit Enter again I
  • 如何从文本文件中读取数据

    如何从文本文件中读取输入 输入文件有几行长 每行的格式为city city distance有两个城市以及它们之间的距离 我尝试了几种方法来读取输入 但不幸的是这些都不起作用 我需要 解析每行上的各个值 每行由 2 个城市名称和它们之间的距
  • 我是否应该在数据流的最开始处期待 JPEG SOI 标记?

    或者我应该深入数据流寻找0xFF 0xD8顺序 From this Q https stackoverflow com questions 5413022 is the 2nd and 3rd byte of a jpeg image al
  • 从 CSV 文件中删除空格而不创建新文件

    我的 csv 工作表中有空格 我想将其删除 经过几个小时的搜索后 我意识到这是它的代码 input open file txt wb output open new file txt wb writer csv writer output
  • tpl 数据流:固定缓冲区大小而不丢弃项目

    在玩弄数据流之后 我遇到了一个新问题 我想限制所有块的输入队列 我的生产块 ActionBlock 正在快速创建 5000 个元素并将它们发布到广播块 因此 如果我将广播块的 BoundedCapacity 设置为 100 他会丢弃大量数据
  • 如何将整数数组从 matlab 传递到 mex?

    我想将一个整数数组从 matlab 传递到 mex 该数组例如是a 1 2 3 4 我写了以下代码 include
  • 从 vba 打开网站时,谷歌翻译无法在 IE 中进行翻译

    谷歌翻译不翻译文本 日语到英语 当打开网站并使用以下代码输入文本时 该函数始终返回 Function OutlookGetTransItem IE As Object URL As String trans text As String A
  • 是否有两个元素在其容器悬停时出现,然后在另一个元素悬停时消失?

    我有两个导航元素 它们设置为图像两侧的列 您可以在以下位置查看它们 我的网站 在这里 http www element17 com 单击任何图像 加载后将鼠标悬停在其上 我想要完成的任务如下 当光标位于图像外部时 两个导航按钮都设置为 0
  • chrome 中奇怪的颜色过渡行为

    我目前正在开发一个多主题应用程序以及 css 的过渡color 属性未按预期工作 在 Chrome 中 它不是立即将过渡应用于每个元素 而是根据元素的深度以某种方式延迟 我已经测试过该脚本 84 0 4124 1 官方版本 canary 6
  • Go 中有 uint64 文字吗?

    我正在看数字类型 https golang org ref spec Numeric types在围棋中 我想使用 uint64 文字 这在 Go 中可能吗 这是我想如何使用 uint64 文字的示例 for i 2 i lt k i 1
  • 仅替换整个单词,而不替换单词

    我试图仅替换整个单词 但我的脚本替换了该单词的所有区分大小写的实例 这是我的代码
  • 循环遍历 NSDictionary 以创建单独的 NSArray

    我有一个大NSDictionary我需要循环并创建单独的NSArrays 以下是内容 id text sub text text thumb url text title text 2010 2011 type
  • 如何为 iPad 创建表单弹出窗口 (iOS 8.1)

    我想使用 Swift 8 1 和演示文稿类型 Form Sheet 制作非常基本的弹出窗口 它应该是一个漂浮在屏幕中间的窗口 没有故事 我创建了两个视图控制器 一个按钮 并使用参数 Present As Popover 将按钮从一个控制器连
  • 从没有分支的分离提交中获取代码

    我有一个不在分支中的提交 它包含我所有的最新工作 我需要将其添加到主分支 我怎样才能做到这一点 git status显示这个 detached from b225b49 master saved work 如果我会失去它吗git check
  • 实现从 .net winforms 应用程序将文件拖到桌面吗?

    我有一个文件列表 其名称位于列表框中 其内容存储在 SQL 表中 并希望我的应用程序的用户能够选择列表框中的一个或多个文件名并将它们拖到桌面 从而生成桌面上的实际文件 我找不到任何有关如何执行此操作的文档 任何人都可以解释或指出解释吗 稍后
  • Scala 何时需要匿名函数和扩展函数的参数类型?

    Scala编译器什么时候真正需要匿名函数参数的类型信息 例如 给定这个函数 def callOn T R target T f T gt R f target 那么我不能像这样使用它 callOn 4 toString gt error m
  • 如何安装和使用 Apache Velocity?

    我已经安装了Apache服务器2 4和Ant 1 8 3 我已经下载了Velocity 1 7和Velocity工具2 0 我已经阅读了 Apache Velocity 的安装文档大约十遍 并且 Google 了两天 我仍然不知道如何处理这
  • ngOnInit 在 APP_INITIALIZER 完成之前启动

    APP INITIALIZER 运行一系列嵌套的承诺 我尝试过订阅 结果没有任何差异 APP INITIALIZER 在从 API 服务器检索数据之前需要进行身份验证 它还需要从 API 服务器拉取两个表 按顺序 在 api service
  • 手电筒打开时 AVCaptureSession 冻结

    我们的 iOS 应用程序具有条形码扫描功能 客户可以根据需要打开和关闭手电筒 在 iPhone X 上 且仅在 iPhone X 上 当 AvCaptureSession 运行且手电筒启用时 屏幕上的视频捕获会冻结 一旦手电筒再次关闭 视频
  • Django:一种更干燥的方法来防止编辑/删除对象?

    读完Django的权限文档后 我还是一头雾水 我想阻止用户编辑或删除他们不拥有的对象 我是这样写的并且有效 在views py中 def deleteReward request reward id reward get object or