首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django Rest框架和字段级权限

Django Rest框架和字段级权限
EN

Stack Overflow用户
提问于 2015-09-10 04:56:48
回答 5查看 2.8K关注 0票数 5

我想要构建一个具有字段级权限的API。我从数据库表中获得了这些权限,但是在REST框架中,检查用户是否可以对对象的字段执行CRUD操作的地方在哪里呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
database --- model ---- ModelSerializer ---- ModelViewSet --- browser

在ModelSerializer?在这里,我可以在字段到达视图集之前删除它们,但是默认情况下我没有访问request.user的权限,所以我必须实现它,这是可以实现的,但是不能很好地与我拥有的其他第三方库(django-rest-swagger)一起工作。

还是在ModelViewset?在其中,我可以覆盖列表、创建、更新和销毁方法,以删除用户无法访问的字段。但是,这与我的元数据实现不太好,因为它直接从序列化程序获取元数据。

或者两者都有?当模型被序列化程序获取时,删除不允许在序列化程序中的读,然后在它们被传回序列化程序之前在视图集中删除不允许的写?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-10 09:30:10

DRF文档中有一个很好的关于权限这里的部分。一个处理(并检查它们)的好地方是在视图集中。要从文档中复制一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

如果希望具有自定义权限检查器,可以定义自己的权限检查器,并使用自己的类指定替换IsAuthenticated

票数 1
EN

Stack Overflow用户

发布于 2015-09-10 09:35:50

可以根据特定请求所需的字段创建不同的序列化程序。然后,您需要在视图中重写get_serializer_class()函数,并根据您的逻辑决定序列化程序。

根据get_serializer_class()上的DRF文档

可以重写以提供动态行为,例如使用不同的序列化程序进行读和写操作,或向不同类型的用户提供不同的序列化程序。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyView(..):

    def get_serializer_class(self):
        if self.request.user.is_staff: # check if staff user
            return FullAccountSerializer 
        return BasicAccountSerializer
    ... 
票数 8
EN

Stack Overflow用户

发布于 2015-09-10 10:15:33

如果要实现自定义权限,请在DRF中很好地使用modelviewset。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from rest_framework import status, viewsets

class MyModelViewsets(viewsets.ModelViewSet):
    queryset = # queryset
    serializer_class = # serializer class
    permission_classes = (# custom permission class her)

如果希望对所有端点应用自定义权限,请在settings.py中指定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REST_FRAMEWORK = {

    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        # add custom permission here
    ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32502554

复制
相关文章
go 中 struct 是否可以比较?
今天来水一篇,最近比较忙,一直没有时间写 go 相关的,今天从一个小问题入手,来说说 struct 的比较问题。
LinkinStar
2022/09/01
8400
让点击链接上的元素不触发链接的跳转
最近有个做招聘网站的客户提出了个修改要求,要求报名列表上的某个元素可点击,点击后可以录取这个人。 这不是日了个狗了嘛,现在的列表项的每项是用a标签包着的,并且是多处调用这里,所以不能将a标签改成其它。 不过也得满足不是。 经过一番查找,找到一个方法:阻止冒泡事件
jwj
2022/05/18
1.1K0
onbeforeunload事件被a链接触发的问题
onbeforeunload本身并非W3C DOM-Event标准事件,只不过在很多时候国内的流氓做法就是离开页面,直接弹出收藏本网页的提示(虽然我很讨厌这种做法,但事实上很多公司一直都在这样默默地强奸用户…)
meteoric
2018/11/16
1.9K0
PHP 判断是否 URL 链接
正则 <?php function is_url($url){ $r = "/http[s]?:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is"; i
你的明明呐丶
2022/06/27
3.5K0
从Django的Turotial中可以学到什么?
我自己在实现代码的过程中发现这个新手指导基本上就算是Django项目开发的一个缩影了。你完全可以做完它之后继续跟着它的思路走。从这个Tutorials中我们可以学到哪些东西呢?我自己总结了一下。
the5fire
2019/02/28
8530
C#校验Email(电子邮件)地址是否合法
这个C#函数用于校验给定的Email地址是否合法,只针对用于提供的Email地址的格式,不对其是否真实存在进行校验。
用户7108768
2021/11/02
8310
Angular 文档中的修改链接是从哪里改的
aio\tools\transforms\templates\lib\githubLinks.html
HoneyMoose
2019/05/15
1.2K0
Angular 文档中的修改链接是从哪里改的
判断数组中任意数据累加是否可以得到aim
给你一个数组arr,和一个整数aim。 如果可以任意选择arr中的数字,能不能累加得到aim,返回true或者false
名字是乱打的
2022/05/13
3700
Java中是否直接可以使用enum进行传输
我们在进行传输的时候 会有一些状态值,如Status为1代表删除,为0代表失败或者怎么样的。只传输一个)0或者1过去给第三方(此处不包括给前端),如果没有契约第三方会不认识你这个是什么意思,那我们在平时写业务逻辑的时候使用枚举很轻易就知道了什么状态什么值。所以我们在构建DTO对象的时候里面放一个枚举来表示。
袁新栋-jeff.yuan
2020/08/26
3.9K0
Angular 文档中的修改链接是从哪里改的 原
aio\tools\transforms\templates\lib\githubLinks.html
HoneyMoose
2019/05/17
1.2K0
Angular 文档中的修改链接是从哪里改的
                                                                            原
mybatis的mapper文件中的一个标签是否可以写多条SQL语句?是否存在事物?
这样默认是不能实现mybatis的mapper文件中的一个标签可以写多条SQL语句的,会报异常:
趣学程序-shaofeer
2020/05/10
2.8K0
Linux中的链接文件_软链接和硬链接
一、链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块领域将数据取出来。而硬链接是直接再建立一个inode链接到文件放置的块领域,即进行硬连接时该文件内容没有任何变化,只是增加了一个指向这个文件的inode,并不会额外占用磁盘空间。硬链接有两个限制: 不能跨文件系统,因为不同的文件系统有不同的inode
Zoctopus
2018/06/04
6.6K0
从补丁追溯漏洞触发路径
查看github中的补丁信息Fixed chunk size parsing. · nginx/nginx@818807d (github.com)如下:
FB客服
2021/11/08
6970
从补丁追溯漏洞触发路径
Linux中的链接文件_软链接和硬链接
一、链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link)。两种链接的本质区别在于inode。以下是详细介绍: 硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块领域将数据取出来。而硬链接是直接再建立一个inode链接到文件放置的块领域,即进行硬连接时该文件内容没有任何变化,只是增加了一个指向这个文件的inode,并不会额外占用磁盘空间。硬链接有两个限制: 不能跨文件系统,因为不同的文件系统有不同的inode
Zoctopus
2018/06/20
6.9K0
Linux中的硬链接与软链接?
硬链接:在一个文件里面,对于目录来说,记录着文件的名字和inode号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号,是文件的唯一标识),我们也可以在多个目录里记录相同的inode号,它们的名字不一定相同,但只要inode号一样就行,它们最终都链接到一个文件里,这就是硬链接。也就是说,当文件的硬链接数被目录记录了一次,文件的硬链接数就增加了一次。所以,文件只要在目录里存在,它就至少有一个硬链接。
用户4877748
2020/07/21
4.3K0
Redis是否可以存图片、视频?
前几天看到某大型家电工厂的工业互联网系统架构图,发现用MongoDB存储图片及视频。那Redis同样也是Json类型的远程数据字典服务器,也可以用于存储图片、视频。实际Redis可以用512MB的空间存储用于存储字符串型的数据。
希望的田野
2019/09/24
9.7K0
Redis是否可以存图片、视频?
PKS中的RS触发器和SR触发器
上大学时,学习《数字电子技术》这门课,第一次接触到RS触发器的概念,当时学了个囫囵吞枣,只知道有个置位端,还有个复位端,当置位端为ON时,RS触发器的输出为ON,当复位端为ON时,RS触发器的输出为OFF,至于置位端和复位端都为ON,或者都为OFF,触发器的输出会怎样,什么情况下需要使用RS触发器,当时根本就没有考虑,看来教学和应用还是有点脱节的。
剑指工控
2022/11/14
1.4K0
PKS中的RS触发器和SR触发器
Docker容器是否可以改变世界?
2016年了,很多大牛开始预测技术趋势,其中一个普遍的观点我也很认同: Docker会更加流行,会改变程序世界 2015年的上半年我接触了Docker,熟悉之后,真有一点震惊的感觉,太方便了,可以解决很多问题 Container 通常翻译为容器,但还有另一个意思,就是“集装箱” 集装箱是21世纪最伟大的发明之一,它改变了世界货物运输体系,造就了一个高度自动化、标准化、低成本的物流体系,促进了经济的全球化发展 程序界也出现了同样的一个箱子,就是 Docker容器 Docker的核心特点 Docker是一个开源
dys
2018/04/03
6490
Docker容器是否可以改变世界?
点击加载更多

相似问题

从AMPscript获取电子邮件ID或名称

13

是否可以从电子邮件中的链接更新sharepoint列表项?

10

AMPScript中的IF语句

33

DataView in AMPScript

11

Exacttarget ampscript显示/隐藏移动电子邮件内容

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文