推荐阅读:理解RESTful架构
RESTful API设计指南
官方文档
使用 Django 常规方法可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework
。它是Python 第三方包,通过在 Django 里面配置就可以把 app 的models
中的各个表实现 RESTful API
。
这里为什么要实现 API 接口呢?因为我打算接下来把我的博客网站升级为 Django Rest Framework + vue.js
前后端分离,这里就尝试一下前后端分离之数据序列化。
PyCharm -> Perferences ->项目 ->Project Interpreter ->'+'号-> djangorestframework -> Install package
终端:
(fswy)blog xiatian$ pip3 install djangorestframework
blog -> blog -> settings.py
INSTALLED_APPS = (
...
'rest_framework',
)
创建API管理文件,在 apps 文件下创建一个名为 api的Python Package 文件。
创建序列化Serializer
类, 提供序列化和反序列化的途径,使之可以转化为某种表现形式如 JSON
。
我们可以借助 serializer
来实现类似于 Django 表单(form
)的运作方式。在 api
目录下,创建文件 serializers.py
blog -> apps -> api -> serializers.py
from apps.user.models import Ouser
from rest_framework import serializers
from apps.fswy.models import Article, Tag, Category
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Ouser
fileds = ('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小结
在 api
目录下,创建文件 views.py
和permissions.py
blog -> apps -> api -> views.py
from apps.user.models import Ouser
from apps.fswy.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,)
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
推荐阅读:更多的权限设置
在 settings.py
文件内设置了一个 启动API接口的字段
API_FLAG = True
blog -> blog -> urls.py
from django.conf import settings
from rest_framework.routers import DefaultRouter
from apps.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(path(r'api/v1/', include((router.urls, 'router'), namespace='api'))) # restframework
blog -> templates
创建rest_framework
文件
blog -> rest_framework -> base.html
这里代码太多,可以下载源码拷贝参考:项目的完整代码:Github
访问:http://127.0.0.1:8000/api/v1/
点击:http://127.0.0.1:8000/api/v1/articles/
Django3.0+Python3.8+MySQL8.0 个人博客搭建一|前言
Django3.0+Python3.8+MySQL8.0 个人博客搭建二|创建虚拟环境
Django3.0+Python3.8+MySQL8.0 个人博客搭建三|创建博客项目
Django3.0+Python3.8+MySQL8.0 个人博客搭建四|创建第一个APP
Django3.0+Python3.8+MySQL8.0 个人博客搭建五|makemigrations连接MySQL数据库的坑
Django3.0+Python3.8+MySQL8.0 个人博客搭建六|数据库结构设计
Django3.0+Python3.8+MySQL8.0 个人博客搭建七|makemigrations创建数据库的坑(第二弹)
Django3.0+Python3.8+MySQL8.0 个人博客搭建八|通过admin管理后台
Django3.0+Python3.8+MySQL8.0 个人博客搭建九|博客首页开发(一)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十|整理项目结构
Django3.0+Python3.8+MySQL8.0 个人博客搭建十一|博客首页开发(二)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十二|博客首页开发(三)
Django3.0+Python3.8+MySQL8.0 个人博客搭建十三|博客详情页面
Django3.0+Python3.8+MySQL8.0 个人博客搭建十四|注册登录
Django3.0+Python3.8+MySQL8.0 个人博客搭建十五|评论区
Django3.0+Python3.8+MySQL8.0 个人博客搭建十六|网站地图
Django3.0+Python3.8+MySQL8.0 个人博客搭建十七|Haystack 全文搜索
Django3.0+Python3.8+MySQL8.0 个人博客搭建十八|功能完善