本渣渣不专注技术,只专注使用技术,不是一个资深的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接口