登录        注册
本站基于Django开发,源码 Github 欢迎 Fork、Star。由于站点升级导致评论区留言信息丢失,欢迎前来发表新的评论

Django个人博客开发十八 | RESTful API接口

Django stormsha 10800浏览 369喜欢 0评论
本渣渣不专注技术,只专注使用技术,不是一个资深的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/

20411

点击:http://127.0.0.1:8080/api/v1/articles/

20412

【友情提示】——如果发现有表达错误,或者知识点错误,或者搞不懂的地方,请及时留言,可以在评论区互相帮助,让后来者少走弯路是我的初衷。我也是一步步摸着石头走过来的,深知网络上只言片语的图文教程,给初学者带来的深深困扰。

【建议】——在对项目结构不太熟悉时,参照完整源码少走弯路

转载请注明: StormSha » Django个人博客开发十八 | RESTful API接口

发表我的评论

表情
(0)个小伙伴在吐槽|0条评论
暂时没有评论,欢迎来尬聊!