DRF笔记(二):DRF框架初体验

DRF笔记(一):手工实现常见API 中记录了如何手工基于Django实现常见的API类型,这篇笔记记录一下DRF框架简单使用的体验。

笔记中提到的代码repo:https://github.com/yexia553/drf

安装和配置修改

  • 安装DRF
    安装drf之前要先安装Django
pip install djangorestframework
  • 修改Django的settings.py文件
    将’rest_framework’添加到‘INSTALLED_APPS’中,如下
INSTALLED_APPS = [
    ...
    'rest_framework',
]

编写序列化器

序列化和反序列化的意思其实就是利用Django的Model将数据库中的数据进行一定的格式修改(比如dict变成json)之后返回给api请求者和将从api请求获取到的数据写入到数据库的过程。

在’book’ app中新建serializers.py文件,文件内容如下:

from rest_framework import serializers
from .models import BookInfo


class BookInfoSerializer(serializers.ModelSerializer):
    """定义序列化器"""
    class Meta:
        model = BookInfo  # 指定作用的模型
        fields = '__all__'  # 指定序列化的字段,这里让所有字段都能被序列化

上面这一段代码的作用其实就是代替了我在手工实现API的时候反复写的利用model从数据库获取数据和将从api获取到的数据写入数据库的过程,下面列举了一个查询某一本具体的书的例子。

try:
    book = BookInfo.objects.get(id=pk)
except BookInfo.DoesNotExist:
    return HttpResponse({
    
    'mesage':'查询的数据不存在'}, status=404)

res = {
    
    
    'id': book.id,
    'title': book.title,
    'read': book.read,
    'pub_date': book.pub_date,
    'comment': book.comment,
    'image': book.image.url if book.image else ''
}

编写视图

在book 的view.py里面新增一个视图类,如下:

from rest_framework.viewsets import ModelViewSet


class BookInfoView(ModelViewSet):
    '''图书信息视图,包含增删查改所有操作'''
    queryset = BookInfo.objects.all()  # 指定可以作用的数据范围

    serializer_class = BookInfoSerializer  # 指定序列化器

上面这个视图类只有三行,但是它却实现了笔记一中BookListView和BookDetailView两个视图类所有的功能,由此可以见DRF框架还是很方便的,减少了很多重复代码的编写工作。

修改url配置

  • demo中的跟路由配置可以不作任何修改
    以books/开头的url会导向book app中的路由,如下:
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', include('book.urls') )
]
  • book中url修改
    修改book/urls.py如下:
from django.conf.urls import url
from rest_framework.routers import DefaultRouter
from . import views


router = DefaultRouter()  # DefaultRouter会帮助生成api的路由

# 第一个参数是路由,这里置空,这样配合跟路由中的配置,
#就可以实现http://127.0.0.1/books/ 指向views.BookInfoView,
router.register('', views.BookInfoView, basename='books')

# Django只会在urlpatterns中寻找路由,所以要把上面配置生成的url加到urlpatterns中
urlpatterns = [
    # url(r'^$', views.BookListView.as_view()),
    # url(r'^(?P<pk>\d+)$', views.BookDetailView.as_view()),
] + router.urls

测试

  • 通过浏览器测试
    将项目运行起来之后,在浏览器分别输入一下地址:

    1. http://127.0.0.1:8000/books/
    • 这个url就是查询所有书籍信息的API,可以在浏览器中看到当前数据中的数据;
    • 页面的最下面是一个表格,右下角有一个POST按钮,这个按钮对应的是POST API,也就是创建一本书
    1. http://127.0.0.1:8000/books/2
    • 当在浏览器中输入这个url的时候,实际上也是一个查询的API,但是是查询id为2的这一本书的信息;
    • 不过当进入之后会看到页面右上角会有一个红色的DELETE按钮,这个按钮对应的就是DELETE API;
    • 页面的下半部分是一个表格,右下角有一个蓝色的PUT按钮,这个按钮对应的就是PUT API;
  • 通过代码测试
    test路径下有一个文件drf_first_seen.py,运行这个文件,会返回每一个API测试成功或者的结果,如下:

(venv): python drf_first_seen.py 
测试查询具体书本信息API成功
测试创建书本API成功
测试查询所有书本信息API成功
测试更新API成功
测试删除API成功

同步发表于个人站点,欢迎访问:panzhixiang.cn

猜你喜欢

转载自blog.csdn.net/u013117791/article/details/123909792
DRF