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
方法二
終端:
(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
推薦閱讀:更多的權限設置
五、配置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/
點擊: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 個人博客搭建十八|功能完善