1、认证和权限

0、文档

https://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/

https://q1mi.github.io/Django-REST-framework-documentation/tutorial/4-authentication-and-permissions_zh/

1、外键:models

model中,关联django自带的 auth.User

owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
# 设置related_name参数来覆盖原名称owner_id(ORM查询时),实质,DB中还是owner_id
highlighted = models.TextField() class Meta:
ordering = ['created'] # def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
def save(self, *args, **kwargs):
"""
使用pygments库,创建一个高亮显示的HTML,表示代码段
"""
lexer = get_lexer_by_name(self.language)
linenos = self.linenos and 'table' or False
options = self.title and {'title': self.title} or {}
formatter = HtmlFormatter(style=self.style, linenos=linenos, full=True, **options)
self.highlighted = highlight(self.code, lexer, formatter)
super(Snippet, self).save(*args, **kwargs) # 继承父类Model的save
 

2、外键,序列化 GET方法:source

from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all()) # 添加一个显式字段 外键 class Meta:
model = User
fields = ['id', 'username', 'snippets']
class SnippetSerializer(serializers.ModelSerializer):
# # Tutorial 4: Authentication & Permissions
# owner = serializers.ReadOnlyField(source='owner.username') # source参数控制哪个属性用于填充字段
owner = serializers.CharField(read_only=True, source='owner.username') # 外键source,序列化的时候,GET方法 class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style', 'owner']

3、外键:视图,POST方法:perform_create()

class SnippetList(generics.ListCreateAPIView):      # list create
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
# IsAuthenticatedOrReadOnly 只有经过身份验证的用户才能创建,更新和删除代码片段
# IsOwnerOrReadOnly 创建代码片段的用户才能更新或删除它 def perform_create(self, serializer): # 关联user, save的同时也保存owner, 外键 POST方法!!!!
serializer.save(owner=self.request.user) # perform_create() 实质调用的是 serializer.save()

4、权限组件:认证用户才可以增删改查

from rest_framework import permissions      # 权限认证组件
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):     # 检索,更新,删除
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

5、自定义权限:谁创建的谁才可以操作

1、自定义

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
"""
自定义权限,只允许,对象的所有者编辑它
""" def has_object_permission(self, request, view, obj):
# 读取权限,允许任何请求
# 所以我们总是允许GET,HEAD或OPTIONS请求。
if request.method in permissions.SAFE_METHODS: # 请求方法ok
return True # 只有该snippet的所有者才允许写权限。
return obj.owner == request.user # user=owner

2、使用

from snippets.permissions import IsOwnerOrReadOnly
class SnippetList(generics.ListCreateAPIView):      # list create
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]

6、效果

最新文章

  1. php多进程
  2. Python内存数据库/引擎
  3. Search and Replace搜寻与替换工具
  4. BZOJ3557: [Ctsc2014]随机数
  5. SQLServer 维护脚本分享(09)相关文件读取
  6. TYVJ P1073 加分二叉树 Label:区间dp
  7. asp.net MVC4 lognet4 日志
  8. [转载] 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),编写函数 strcpy(C++版)
  9. titan
  10. 实现一个在autolayout下有宽度约束后,自动确定高度的view
  11. 一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)
  12. Web安全概述
  13. CSS box-sizing属性
  14. iOS网络请求-AFNetworking源码解析
  15. 性能调优3:硬盘IO性能
  16. 学习 Spring (五) Aware 接口
  17. Docker(五)如何构建Dockerfile
  18. VirtualBox下安装CentOS7系统
  19. Python Tornado集成JSON Web Token方式登录
  20. Java设计模式--缺省适配器模式

热门文章

  1. [转帖]iis最大并发连接数、队列长度、最大并发线程数、最大工作进程数
  2. java当中JDBC当中Scrollable和Updatable ResultSet的用法和Helloworld例子
  3. 【坑】前后端分离开发中 跨域问题以及前台不带cookie的问题
  4. C++ 生成随机数总结 & C++ rand 函数使用方法
  5. oracle如何保证数据一致性和避免脏读
  6. WUSTOJ 1341: Lake and Island(Java)
  7. 嵌入式Linux学习笔记之第二阶段---文件I/O
  8. Codeforces Round #222 (Div. 1) (ABCDE)
  9. hdu 1501 贪心问题
  10. FaceBook CVPR2014: DeepFace解读