Django3.0+Python3.8+MySQL8.0 個人博客搭建十九|RESTful 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

在這裏插入圖片描述

方法二

終端:

(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/
在這裏插入圖片描述

點擊: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 個人博客搭建十八|功能完善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章