欢迎关注个人微信公众号,大大大碗面,不定期分享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