Django3.0+Python3.8+MySQL8.0 个人博客搭建十九|RESTful API接口

文章目录

  • 一、安装依赖包
    • 方法一:
    • 方法二
  • 二、注册应用
  • 三、创建序列化类
  • 四、创建调用序列化数据的视图
    • 创建视图
    • 设置权限
  • 五、配置API路由
  • 六、数据展示页面
  • 七、运行效果
  • 教程目录

RESTful API现在很流行

推荐阅读:理解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

Django3.0+Python3.8+MySQL8.0 个人博客搭建十九|RESTful API接口_第1张图片

方法二

终端:

(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.pypermissions.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

推荐阅读:更多的权限设置

五、配置API路由

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/
Django3.0+Python3.8+MySQL8.0 个人博客搭建十九|RESTful API接口_第2张图片

点击:http://127.0.0.1:8000/api/v1/articles/
Django3.0+Python3.8+MySQL8.0 个人博客搭建十九|RESTful API接口_第3张图片

教程目录

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 个人博客搭建十八|功能完善

你可能感兴趣的:(#)