django rest_framework入门五-认证和权限
1.django User实体
django自带了用户验证模块,django/contrib/auth/models.py定义了用户实体,代码如下:
class AbstractUser(AbstractBaseUser, PermissionsMixin):
username = ''
first_name = ''
last_name = ''
email = ''
password = ''
...
2.django中获取验证用户
def get(self, request):
user = request.user
3.Snippet实体和User关联
我们要知道每个Snippet实体是由哪个User创建的
首先,在Snippet实体中,定义Owner字段,关联User实体对象
编辑snippets/models.py,代码如下:
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)
owner = models.ForeignKey('auth.User', related_name='snippets')
class Meta:
ordering = ('created',)
重建数据库,在数据库中,owner对应的是owner_id字段,和User的id关联,而在model中owner关联的是User对象
4.在SnippetSerializer中,添加owner字段
将owner字段作为SnippetSerializer的一个字段,但只需要读,不需要显式的去写,其实也可以写,只是我们在view中,
perform_create的时候做了处理,将owner值添加到了SnippetSerializer,所以SnippetSerializer中只需要定义只读就可以了。
编辑snippets/serializers.py,代码如下:
class SnippetSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
class Meta:
model = Snippet
fields = ("id", "created", "title", "code", "linenos", "language", "style", "owner")
source定义了要显示的对象属性
编辑view视图,将owner值添加到了SnippetSerializer
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
5.通过http访问接口
启用rest_framework的登入登出功能
在urls.py中,新增代码如下:
urlpatterns += [
url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')),
]
这样,在页面中就可以看到Login,Logout按钮了
访问地址: http://127.0.0.1:8000/snippets,新增snippet实体,返回结果如下:

可以看到,显示了owner字段的username属性
再来看看数据中,显示的结果:

django会将owner对应为owner_id,显示forergin_key对应对象的id
6.通过api访问接口

添加Authorization值username,password
7.User关联Snippet实体
如果想找到User下面对应的Snippet列表,该如何编写?
将snippet放到UserSerializer对应的字段,代码如下:
class UserSerializer(serializers.ModelSerializer):
snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())
class Meta:
model = User
fields = ("id", "username", "snippets")
8.设置权限,只有授权用户才能新增snippet
需要在view视图中设置permission_classes字段,代码如下:
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
IsAuthenticatedOrReadOnly表示可以读,或者授权用户才能进行增删改操作
9.设置权限,只有owner才能进行增删改
我们需要自定义一个permission类,当当前用户和owner一致时,返回True,否则返回False
新增文件snippets/permissions.py,代码如下:
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
修改view视图文件
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly, )
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
django rest_framework入门五-认证和权限的更多相关文章
- django rest_framework入门
1.rest_framework的作用 1)可以对orm和非orm资源序列化 2)支持restful风格编程(POST,PUT,PATCH) 3)使用类视图编写API的view,而不是函数视图,类视图 ...
- rest_framework组件之认证,权限,访问频率
共用的models from django.db import models # Create your models here. class User(models.Model): username ...
- django rest_framework入门四-类视图APIView
上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代 ...
- django rest_framework入门三-Requests和Responses
这一节,我们介绍rest_framework的Requests和Responses对象,来替代django.http的HttpRequest和HttpResponse对象 1.Requests和Res ...
- django rest_framework入门二-序列化
在前一节中,我们已经粗略地介绍了rest_framework的作用之一序列化,下面我们将详细探究序列化的使用. 1.新建一个app snippets python manage.py startapp ...
- rest_framework框架的认证、权限
REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ] ...
- Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...
- Rest_Framework之认证、权限、频率组件源码剖析
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- Django编写RESTful API(四):认证和权限
欢迎访问我的个人网站:www.comingnext.cn 前言: 按照前面几篇文章里那样做,使用Django编写RESTful API的基本功能已经像模像样了.我们可以通过不同的URL访问到不同的资源 ...
随机推荐
- (原)CosFace/AM-Softmax及其mxnet代码
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/8525241.html 论文: CosFace: Large Margin Cosine Loss fo ...
- 设置span在div中垂直居中
转自:https://blog.csdn.net/weirenkuan/article/details/51177695 使用display:table-cell,span中内容无论多少,都可以垂直居 ...
- BOOST ASIO 学习专贴
本文已于20170903更新完毕,所有boost asio 代码均为本人手抄.编译器为vs2013,并且所有代码已经上传,本文下方可下载源码 为了学习boost asio库,我是从boost的官方bo ...
- hihocoder217周 树形DP
题目链接 一棵树,树中包含TRUE.FALSE.AND.OR四种结点,其中TRUE和FALSE是叶子结点,AND和OR结点的儿子包含多个结点,现在要求执行最少次数的以下操作: 把AND变成OR 把OR ...
- ML之监督学习算法之分类算法一 ———— k-近邻算法(最邻近算法)
一.概述 最近邻规则分类(K-Nearest Neighbor)KNN算法 由Cover 和Hart在1968年提出了最初的邻近算法, 这是一个分类(classification)算法 输入基于实例的 ...
- Android一些小技巧
1:设置选中图片的背景颜色 this.gridviewToolbar = (GridView) super.findViewById(R.id.gridviewbar); this.gridviewT ...
- 豆瓣上9分以上的IT书籍-编程语言篇
我当要学习某些技术时,第一时间就是去找相关的书籍.而豆瓣读书是我主要的参考依据,主要是它的评分基本比较靠谱,对于技术书籍,一般来说评分在8分以上就是不错的书籍了,而达到9分就可以列入"必读& ...
- 2014百度之星第一题Energy Conversion
Energy Conversion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 利用 PowerShell 分析SharePoint WebApplication 体系结构
之前一篇文章<两张图看清SharePoint 2013 Farm 逻辑体系结构>谈到Web Application,Content Database,Site Collection的关系. ...
- oracle中exists和in的比较
exists 是Oracle sql中的一个函数.表示是否存在符合某种条件的记录.如 select * from A,B where A.id=B.id and exists (SELECT * FR ...