Django RESTful API (4) 认证和权限

欢迎关注个人微信公众号,大大大碗面,不定期分享AI论文解读和开发技术,互联网小白,轻喷~

在这里插入图片描述

前言

按照前面几篇文章的介绍,使用Django编写RESTful API的基本功能已经像模像样了。我们可以通过不同的URL访问到不同的资源,通过不同的HTTP请求来实现对资源的不同操作。

但是现在我们的API还有一个明显的缺陷,那就是没有认证和权限功能,任何资源都会被任何用户随意更改,所以我们要改进程序,实现一下的功能:

  • sinppet与其他创建者相互关联;
  • 只有经过身份验证(登录)的用户才可以创建snippets;
  • 只有创建该snippet的用户才可以对其进行更改或者删除;
  • 未经验证的用户具有访问(只读)的功能。

修改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

为我们的用户模型添加端点

原理和之前的SnippetSerializer基本一样,在snippets/serializers.py中添加一个User序列化器:

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):
    snippets = serializers
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值