本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier |
RESTful API现在很流行
推荐阅读:理解RESTful架构 RESTful API设计指南 官方文档
使用 Django 常规方法可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework.它是Python 第三方包,通过在 Django 里面配置就可以把 app 的 models 中的各个表实现 RESTful API
这里为什么要实现 API 接口呢?因为我打算接下来把我的博客网站升级为 Django Rest Framework + vue.js 前后端分离,这里就尝试一下前后端分离之数据序列化
1、安装依赖包
启动虚拟环境 stormsha
$ workon stormsha $ pip install djangorestframework
2、注册应用
blog -> blog -> settings.py
INSTALLED_APPS = ( ... 'rest_framework', )
3、创建序列化类
创建API管理文件,在 apps 文件下创建一个 api Python Package 文件
创建序列化 Serializer 类, 提供序列化和反序列化的途径,使之可以转化为某种表现形式如 JSON.我们可以借助 serializer 来实现类似于 Django 表单(form)的运作方式。在 api 目录下,创建文件 serializers.py
blog -> apps -> api -> serializers.py
from user.models import Ouser from rest_framework import serializers from storm.models import Article, Tag, Category class UserSerializer(serializers.ModelSerializer): class Meta: model = Ouser fields = ('id', 'username', 'first_name', 'link', 'avatar') class TagSerializer(serializers.ModelSerializer): class Meta: model = Tag fields = '__all__' class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = '__all__' class ArticleSerializer(serializers.ModelSerializer): author = serializers.ReadOnlyField(source='author.username') category = CategorySerializer(read_only=True) tags = TagSerializer( many=True, read_only=True, ) keywords = serializers.SlugRelatedField( many=True, read_only=True, slug_field='name' ) class Meta: model = Article exclude = ('body',)
推荐阅读:django rest framework serializers小结
4、创建调用序列化数据的视图
blog -> apps -> api -> views.py
from user.models import Ouser from storm.models import Article, Tag, Category from .serializers import (UserSerializer, ArticleSerializer, TagSerializer, CategorySerializer) from rest_framework import viewsets, permissions from rest_framework.permissions import DjangoModelPermissionsOrAnonReadOnly # RESEful API VIEWS class UserListSet(viewsets.ModelViewSet): queryset = Ouser.objects.all() serializer_class = UserSerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,) class ArticleListSet(viewsets.ModelViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,) def perform_create(self,serializer): serializer.save(author=self.request.user) class TagListSet(viewsets.ModelViewSet): queryset = Tag.objects.all() serializer_class = TagSerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,) class CategoryListSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,) class TimelineListSet(viewsets.ModelViewSet): queryset = Timeline.objects.all() serializer_class = TimelineSerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,) class ToolLinkListSet(viewsets.ModelViewSet): queryset = ToolLink.objects.all() serializer_class = ToolLinkSerializer permission_classes = (DjangoModelPermissionsOrAnonReadOnly,)
blog -> apps -> api -> permissions.py
设置权限
from rest_framework import permissions class IsAdminUserOrReadOnly(permissions.BasePermission): def has_permission(self, request, view): if request.method in permissions.SAFE_METHODS: return True return request.user and request.user.is_staff
推荐阅读:更多的权限设置
5、配置API路由
在 settings.py 文件内设置了一个 启动API接口的字段
from rest_framework.routers import DefaultRouter from api import views as api_views if settings.API_FLAG: router = DefaultRouter() router.register(r'users', api_views.UserListSet) router.register(r'articles', api_views.ArticleListSet) router.register(r'tags', api_views.TagListSet) router.register(r'categorys', api_views.CategoryListSet) if settings.API_FLAG: urlpatterns.append(url(r'^api/v1/', include(router.urls, namespace='api')))
6、数据展示页面
blog -> templates 创建 rest_framework 文件
blog -> rest_framework -> base.html
这里代码太多,可以下载源码拷贝参考:项目的完整代码:Github
7、运行效果
访问:http://127.0.0.1:8080/api/v1/
点击:http://127.0.0.1:8080/api/v1/articles/
【友情提示】——如果发现有表达错误,或者知识点错误,或者搞不懂的地方,请及时留言,可以在评论区互相帮助,让后来者少走弯路是我的初衷。我也是一步步摸着石头走过来的,深知网络上只言片语的图文教程,给初学者带来的深深困扰。
【建议】——在对项目结构不太熟悉时,参照完整源码少走弯路
转载请注明: StormSha » Django个人博客开发十八 | RESTful API接口