django-rest-framework学习之Authentication & Permissions--2017年4月14日

Authentication & Permissions

参考:http://www.cnblogs.com/hillfree/archive/2013/03/26/django-rest-framework-tutorial-04.html

认证和权限

目前我们的API对于谁可以编辑和删除MyLesson没有任何限制,我们希望添加一些高级的行为使程序具有如下功能:

MyLesson有相应的创建者

只有经过认证的user可以创建MyLesson

只有MyLesson的创建者可以修改和删除MyLesson

没有认证的求情只有可读属性

【1】为model增加信息

改变一些MyLesson的model类,首先添加一对Fields,其中一个用来表示MyLesson的创建者,另外一个存储代码的高亮HTML的表现形式

owner = models.ForeignKey(‘auth.User‘,related_name=‘myLesson‘,on_delete=models.CASCADE)
highlighted = models.TextField()

# 对于django.db.models,参考官方文档:https://docs.djangoproject.com/en/1.9/ref/models/fields/#model-field-types

# 文档的右下角可以选择django的版本

# 本程序使用

# DateTimeField(auto_now_add=True),

# CharField(max_length=100, blank=True,default=‘‘)

# TextField()

# BooleanField(default=False)

# CharField(choices=LANGUAGE_CHOICES,default=‘python‘,max_length=100)

# ForeignKey(‘auth.User‘,related_name=‘myLesson‘,on_delete=models.CASCADE)

我们需要确定的是,当model被保存时,我们植入了highlighted field

使用pygments代码高亮库来完成

from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight

def save(self,*args,**kwargs):
    """
    Use the ‘pygments‘ library to created a highlighted HTML
    representation of code myLesson
    """
    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,**kwargs)
    self.highlighted = highlight(self.code,lexer,fomatter)
    super(MyLesson,self).save(*args,**kwargs)

然后更新数据库表单,通常我们会迁移数据库,但是在这里,我们直接删掉重新开始

rm -f db.sqlite3

rm -r myLesson/migrations

python manage.py makemigrations myLesson

python manage.py migrate

然后创建几个用户做测试

python manage.py createsuperuser

【2】为User model增加endpoints

给API添加User的展示页面

在serializer.py中:

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    myLesson = serializers.PrimaryKeyRelatedField(many=True,queryset=MyLesson.objects.all())
    class Meta:
        model = User
        fields = (‘id‘,‘username‘,‘myLesson‘)

因为MyLesson和User是是反向关联(reverse relationship,即多对一),所以不会默认添加在ModelSerializer类中,我们需要添加一个明确的field

在views.py中我们需要一个只读的view对User做展示,所以我们添加ListAPIView和RetrieveAPIView

from django.contrib.auth.models import User
from myLesson.serializers import MyLessonSerializer,UserSerializer

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
 

最后添加这些views到API中,修改urls.py:

url(r‘^users/$‘,views.UserList.as_view()),
url(r‘^users/(?P<pk>[0-9]+)/$‘,views.UserDetail.as_view()),

【3】连接MyLesson和User

目前,User没有被作为序列化展示的一部分,相反,成了request中的一个属性。

我们在MyLesson views中重写一个perform_create()方法,允许我们修改 实例如何保存,处理隐藏在request中的信息

在MyLessonList类中添加:

def perform_create(self,serializer):
    serializer.save(owner=self.request.user)

在create方法中传递owner field,还有我们要创建的数据

【4】升级serializer

在MyLesson中添加owner属性

class MyLessonSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source=‘owner.username‘)
    class Meta:
        model = MyLesson
        fields = (‘id‘,‘title‘,‘code‘,‘linenos‘,‘language‘,‘style‘,‘owner‘)

ReadOnlyField非常有趣,source参数用来植入一个field,可以用任何Serializer类中的属性,ReadOnlyField可以用CharField(read_only=True)代替

【5】为view添加必要的权限

我们希望认证用户可以更新,删除,和创建MyLesson

Rest framework提供了permission类,使我们可以限制谁可以键入一个给定的视图,使用IsAuthenticatedOrReadOnly,来确使认证用户可以读写,其他用户只能只读

在MyLessonList和MyLessonDetail view类中添加如下属性

from rest_framework import permissions
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

【6】为API添加登陆

在项目级别的urls.py中添加以下pattern,允许登入登出

from django.conf.urls import include
url(r‘^api-auth/‘, include(‘rest_framework.urls‘,namespace=‘rest_framework‘)),

【7】对象级别的权限

只有对象的创建者可以删除和修改:

在MyLesson app中添加permissions.py

from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """
    def has_object_permission(self,request,view,obj):
        #Read permissions are allowed to any request,
        #so we`ll always allow GET,HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        #Write permissions are only allowed to the owner of the snippet
        return obj.owner == request.user

在views.py中MyLessonDetail中加入

from myLesson.permissions import IsOwnerOrReadOnly
permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,)
时间: 2024-08-23 03:28:33

django-rest-framework学习之Authentication & Permissions--2017年4月14日的相关文章

2017年3月14日下午日志

2017年3月14日下午复习了高等数学,观看了张宇高等数学第八讲教学视频线性代数部分的运算方法的方法,积累了更多学习技巧,对线性代数部分的行列式和矩阵的概念和性质有了了解,并做书上例题1.1-1.5,晚上背英语单词100个.

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

【谜院群】2017年4月14日天穷主擂谜会题

[谜院群]2017年4月14日天穷主擂谜会题 1.挥金邀朋游青天(月份口诀表三句/不连)一月大 二月平 十月大2.自从减肥反弹后,泪水常常挂面腮(网球术语二,5+2)打重复落点 长盘3.画中古人独赏月(嵌目)胡奋4.镐京兵败已是事实(拼音输入错误)西安输成现5.“杏花吹满头”(知名红学家)曲沐6.嬴荡故去,乃八子所期(离合字)王亡月望7.“飞梅弄晚”(明人)王木8.暮年洪武帝真厉害(5字人物比较语,含带姓俗称,粉底)老朱重八磅(棒)9.“离肠未语先断”(3字网络小说主角连相貌评价)杨明 丑10.

【世外谜城群】2017年4月14日绿黛兰溪主擂谜会题

[世外谜城群]2017年4月14日绿黛兰溪主擂谜会题 01.夙夜一别去南方(少笔字)亢02.鸟雀飞去东院中(6笔字)邬03.舍前曲径鸟飞鸣(6笔字)吸04.不辞千辛去回疆(6笔字)吕05.西风吹起流云动(7笔字)呖06.无心念书失头名(7笔字)吟07.三月伤情心中哀(7笔字)忡08.初临异地难聚首(7笔字)坚09.亭中丫头正伤心(7笔字)豆10.雨花点点落舍前(8笔字)枣11.上头下旨去华北(8笔字)卓12.工厂改造忙在先(8笔字)性13.年前出差来湘中(8笔字)枚14.费尽心血终解难(8笔字)

【谜乐苑群】2017年4月14日惠惠主擂谜会题

[谜乐苑群]2017年4月14日惠惠主擂谜会题 1.潭水西流寄相思(字)草2.旭日升空照露珠(字)丸3.幕后先生一直忙(字)师4.阳光之下白云散(字)瑰5.英雄必纵横天下(字)杜.杆.杠6.浦东西侧过边关(字)傅7.每天上工心中苦(字)生8.酒干客散去水泊(字)自.百9.一日相聚于亭下(字)盯.朾10.林中残影现鸟迹(字)彩11.一江清水育草根(字)弄12.黄昏之前暗消音(字少笔)日13.火光点点印残花(字)仑14.几处风流失晚节(字)艾15.灯前泪珠落残卷(字)仓16.笔管头前缺半块(字)快1

【天一家园群】2017年4月14日群猜谜会谜题

[天一家园群]2017年4月14日群猜谜会谜题 1.披上珠衣晕富态(千字文一句)盖此身发/张其有2.季布周游闭闲门(花卉)稠李/汤政良3."夜尽梦初惊”(11笔字)惏/何若雪 注:古同“婪” 4.“眼见四朝全盛时”(镜花缘人物)张昌期/谢礼让5.“从此萧郎是路人”(物理名词二)势能.绝缘/王永珊6.“天下无能第一”(电影名)超人二/郑百川7.“马蹄催趁月明归”(三字娱乐圈用语)走光照/谢亚芦8.风中乱雨洒孤舟(8笔字)忞/王天来9.东南院角酒香飘(文学体裁)元曲/朱锦华10.“伴君到三更”(称谓

#蓝懿iOSi学习的日子#2015年10月14日

#蓝懿iOSi学习的日子#已经进入了第五天的学习,当天已开始上课,一上来老师就给我们讲了NSString的使用,紧紧跟着l讲了字符串的拼接,一共讲了三种方法,紧接着做了前天的计算机的拓展,先是拉一个 label做了好多个button,label做了一个全局变量,button都做相应的tag,主要是button分为五个部分:数字.运算符.等号.AC.点,都做了相应的连线.第一,数字按钮,点击要显现文字:第二,点击运算符记录数字,声明按钮,点击数字按钮,可以得到什么:第三,做等号部分,生成第二个数字

IPv6 终于在2017年7月14日正式完成标准化—— RFC8200

IPv6不是从 1998 年RFC2460 就已经标准化了吗? 其实很多人不了解,RFC2460 称为草案标准 (Draft Standard),过去时间还有多次更新RFC :RFC 5095, RFC 5722, RFC 5871, RFC 6437, RFC 6564, RFC 6935, RFC 6946, RFC 7045, RFC 7112 RFC8200称为全标准Full Internet Standard,全标准编号是STD86.汇总了所有IPv6相关的RFC http://www

2017年9月14日

今天休息, 看了一下表单 <input> 文本:placeholder="提示语"  maxlength="最大可输入长度" 密码:password 单选:<label></label>   默认选择器:checked="checked" 多选:默认选择器:checked="checked" 文件上传:file 隐藏:hidden 提交:submit 重置:reset 按钮:rideo 图片

JDBC(连接数据库 2017年7月14日)

1.windows 下连接oracle数据库 Class.ForName("oracle.jdbc.driver.OracleDriver"); //会出现checked异常 Connection con =DriverManager.getConnection("jdbc:oracle:thin:@具体数据库ip:1521:orcl","账号","密码"): //声明连接对象 localhost 本地数据库 orcl是数据库