澳门游戏平台大全 澳门十大电子游戏平台 澳门十大电子游戏平台认证和权限

澳门十大电子游戏平台认证和权限

修改snippet模型

第风度翩翩,大家想让snippets都和它们的创制客户关联起来,所以大家当然的要在Snippet模型加上二个owner字段来代表。其它,大家还增添三个highlighted字段用来落到实处代码高亮,匡正snippets/models.py的Snippet:

owner = models.ForeignKey('auth.User', related_name='snippets', on_delete=models.CASCADE)
highlighted = models.TextField()

 

想要实现代码高亮,当然不是地方少年老成行代码就解决了,它未来还只是贰个日常的字段而已。大家要做的是在保留的时候,也即是当实行save(卡塔尔国时,
大家应用pygments生成高亮后的HTML,还是在model.py,首初步入相关的库:

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

 

然后在Snippet类中加多save(卡塔尔(قطر‎方法:

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)

 

在保留数据的时候就能够推行上边那几个点子,整个艺术的成效如注释所示,在这里黄金年代篇作品中还不会实际的显得那几个效率,在接下去的稿子中会展示。

更改了模型当然要求一块一下数据库了,在这里地大家和官方文书档案形似把数据库删了在再度生成,首先把工程目录下的db.sqlite3甚至snippets下的migrations文件夹删除,然后再奉行迁移手续:

python manage.py makemigrations snippets
python manage.py migrate

 

况且,由于大家想要实现的是访问种种snippet时显得相应的开创者,所以这边必要创建多少个差别的账户稍后才足以来得。

python manage.py createsuperuser

 


至于认证和权杖的局部就先到这了。大家在上面写的代码中,highlight部分,我们说它的意义是生成能让代码段高亮的HTML代码,那风姿罗曼蒂克有个别还从来不接收到,接下去就介绍它。

API(四):认证和权杖,djangorestful
应接访问小编的私人商品房网站:www.comingnext.cn 前言:
遵照前边几篇小说里那样做,使用Django编…

前言:

遵从后边几篇小说里那么做,使用Django编写RESTful
API的基本成效已经一板一眼了。咱们能够通过差别的U奥迪Q3L访问到不相同的能源,通过不一致的HTTP乞求来落到实处对财富的不及操作。

不过现在我们的API还会有多少个很引人瞩目的老毛病,那正是还没证实和权限作用,任何财富都会其余客商被随便改动,所以大家要更上生龙活虎层楼程序,完成以下效能:


加多权限

前几天Snippet和User已经涉嫌起来何况是可浏览的。接下来大家要促成的立即权限的主题材料了。也等于大家意气风发开端说的几点中的:

首先在views.py导入贰个库:

from rest_framework import permissions

 

紧接着为SnippetList 和 SnippetDetail添加权限剖断,在此八个视图类中都投入:

permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

这里要特别注意,有一个坑,就是那个逗号一定要加上去,不然就会报错。

那行代码的效应就是剖断当前客商是还是不是为该Snippet的创制者,而其余客商独有只读属性,就是不能不查看。

 


为大家的客户模型加上端点

原理和前边的SnippetSerializer基本同样,在snippets/serializers.py中加多三个User类别化器:

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')

 

只顾到个中的:

snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())

 

因为snippets在User模型中是一个反向关系,在运用Model塞里alizer类时暗中同意情状是不会包涵那几个关系,正是说通过Snippet的owner能查询到User,而User这边询问不到四个客户创造的snippet,所以大家必要手动为客户连串增多那些字段。

弄好了User的类别化器,接着将要让其能够显得出来,所以要抬高相关的视图类,编辑view.py:

from django.contrib.auth.models import User
from snippets.serializers import UserSerializer


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


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

 

写好了视图函数,想要通过UWranglerL访谈到它们,确定是布置一下路由分发啦,编辑snippets/urls.py,增添下边的十分方式:

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

 


加上指标权限

任何时候大家要完成的是让全体的Snippet能够被全部人访谈到,可是各种Snippet独有其创造者技巧够对其进展改造、删除等操作。

之所以,我们需求设置一下自定义权限,使各类Snippet只允许其创立者编辑它。在snippets目录下新建多个permissions.py:

from rest_framework import permissions


class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    使每个Snippet只允许其创建者编辑它
    """

        def has_object_permission(self, request, view, obj):
        # 任何用户或者游客都可以访问任何Snippet,所以当请求动作在安全范围内,
        # 也就是GET,HEAD,OPTIONS请求时,都会被允许
        if request.method in permissions.SAFE_METHODS:
            return True

        # 而当请求不是上面的安全模式的话,那就需要判断一下当前的用户
        # 如果Snippet所有者和当前的用户一致,那就允许,否则返回错误信息
        return obj.owner == request.user

 

代码的逻辑已在疏解中,轻松说正是提供剖断功效,然后大家要把它使用起来,在view.py中的SnippetDetail
改正一下:

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)

 

留意要导入IsOwnerOrReadOnly类:

from snippets.permissions import IsOwnerOrReadOnly

 

以后用浏览器打开单个Snippet详细情形页,假如您日前登入的顾客是以此Snippet的创制人,那你会发觉多了DELETE和PUT七个操作,比方访谈 
澳门十大电子游戏平台 1


使用API授权

是因为前几天我们还未动用authentication
类,所以项目这几天要么使用私下认可的SessionAuthentication 和
BasicAuthentication.

在运用浏览器访问API的时候,浏览器会帮我们保留会话音信,所以当权限满意时就足以对三个Snippet进行删减只怕改变,或许是创办八个新的Snippet。

当倘诺是通过命令行来操作API,大家就必须要在历次发送央浼的时候增长授权消息,也便是客商名和密码,未有的话就能够报错,比如:

http POST http://127.0.0.1:8000/snippets/ code="print 123"

{
    "detail": "Authentication credentials were not provided."
}

 

科学的操作如下:

http -a username1:password POST http://127.0.0.1:8000/snippets/ code="print 789"

{
    "id": 1,
    "owner": "username1",
    "title": "",
    "code": "print 789",
    "linenos": false,
    "language": "python",
    "style": "friendly"
}

 

笔者们能够见到owner就是付出过来的顾客名,这正是上边代码的效果呈现:

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

 

通超过实际际应用更能精通程序,owner会在一个客商创制Snippet时收获该顾客的音信正是那般来的。


为可浏览的API添Garden录效能

刚刚增加了权力决断,若无登陆顾客,那就一定于游客啦,什么效能都不曾必须要看,所以在浏览器浏览API的时候就需求登入功用。在这里间,强盛的django-rest-framework又为大家做了累累事情,想要在添Garden录按键和页面,只须求修正一个rest_tutorial/urls.py,增多一个U智跑L相称:

urlpatterns += [
    url(r'^api-auth/', include('rest_framework.urls',
                               namespace='rest_framework')),
]

 

此地的r’^api-auth/’你能够设置成任意你爱怜的,可是命名空间一定要平等,正是namespace=’rest_framework’。

好了,未来开荒浏览器,就可以看看在我们的API页面包车型地铁右上角有三个签到的开关,点击之后就可以行使早先创立的顾客登陆了。

其一时候访谈单个客商的详细情况,就能够见见该客商创造的具备Snippet的id值(需求先创立多数少个Snippet,能够依照本类别第意气风发篇小说中在shell格局中的方法来成立)。比如访谈:

http://127.0.0.1:8000/users/2/

 

能够看看: 
澳门十大电子游戏平台 2


把Snippets和Users关联起来

到了此处,如若像从前那样制造代码段的话,我们还不能把Snippets和Users关联起来。因为在应用的时候User的数量是透过request传入的,并非以体系化的数目传递过来。

而作者辈刚刚增加了叁个owner作为外键,那时将在见到它的用途了,编辑view.py,为SnippetList视图类增多三个办法:

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

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

 

这个perform_create()能够让客户在通过POST须要成立二个新的Snippet时,在保留新的Snippet数据的时候会把request中的user赋值给Snippet的owner。等下实际应用的时候就足以轻便的敞亮了。


更新serializer

上一步已经把相互关系起来了,owner会在创制新的Snippet的时候具备User的依次属性,那么在API中要让owner呈现id依旧顾客名,为了进步可读性,答案当然是展现顾客名了,所以大家在SnippetSerializer
上边扩大一个字段:

owner = serializers.ReadOnlyField(source='owner.username')

 

这里的source参数就指定了哪个属性用于填充字段,为了在使用的时候显示owner,但是还要把它添加进Meta类里面,所以整个SnippetSerializer如下:

class SnippetSerializer(serializers.ModelSerializer):
    # 这里可以使用也 CharField(read_only=True) 来替换
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style','owner')

 


Django编写RESTful API(四):认证和权杖,djangorestful

应接访问作者的个体网址:www.comingnext.cn

标签:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图