Django REST framework框架

在此案例中,前后端均发送JSON格式数据。

views.py

class BooksAPIVIew(View):
    """
    查询所有图书、增加图书
    """

    def get(self, request):
        """
        查询所有图书
        路由:GET /books/
        """
        queryset = models.Book.objects.all()
        book_list = []
        for book in queryset:
            book_list.append({
                'id': book.id,
                'title': book.title,
                'price': book.price,
                'publish': book.publish,
                'pub_date': book.pub_date
            })
        return JsonResponse(book_list, safe=False)

    # @csrf_exempt
    def post(self, request):
        """
        新增图书
        路由:POST /books/
        """
        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        # 此处详细的校验参数省略

        book = models.Book.objects.create(
            title=book_dict.get('atitle'),
            price=book_dict.get('price'),
            publish=book_dict.get('publish'),
            pub_date=datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
        )

        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'price': book.price,
            'publish': book.publish,
            'pub_date': book.pub_date
        }, status=201)


class BookAPIView(View):
    def get(self, request, pk):
        """
        获取单个图书信息
        路由: GET  /books/<pk>/
        """
        try:
            book = models.Book.objects.get(pk=pk)
        except models.Book.DoesNotExist:
            return HttpResponse(status=404)

        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'price': book.price,
            'publish': book.publish,
            'pub_date': book.pub_date
        })

    def put(self, request, pk):
        """
        修改图书信息
        路由: PUT  /books/<pk>
        """
        # book = None
        try:
            book = models.Book.objects.get(pk=pk)
        except models.Book.DoesNotExist:
            return HttpResponse(status=404)

        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        # 此处详细的校验参数省略

        book.title = book_dict.get('atitle')
        book.pub_date = datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
        book.save()

        return JsonResponse({
            'id': book.id,
            'title': book.title,
            'price': book.price,
            'publish': book.publish,
            'pub_date': book.pub_date
        })

    def delete(self, request, pk):
        """
        删除图书
        路由: DELETE /books/<pk>/
        """
        try:
            book = models.Book.objects.get(pk=pk)
        except models.Book.DoesNotExist:
            return HttpResponse(status=404)

        book.delete()

        return HttpResponse(status=204)

urls.py

urlpatterns = [
   path(r'books/', views2.BooksAPIVIew.as_view()),
   re_path(r'books/(?P<pk>\d+)/$', views2.BookAPIView.as_view())
]

使用Postman测试上述接口

1) 获取所有图书数据

GET 方式访问 http://127.0.0.1:8000/books/, 返回状态码200,数据如下

[
   {
       "id": 1,
       "btitle": "射雕英雄传",
       "bpub_date": "1980-05-01",
       "bread": 12,
       "bcomment": 34,
       "image": ""
   },
   {
       "id": 2,
       "btitle": "天龙八部",
       "bpub_date": "1986-07-24",
       "bread": 36,
       "bcomment": 40,
       "image": ""
   },
   {
       "id": 3,
       "btitle": "笑傲江湖",
       "bpub_date": "1995-12-24",
       "bread": 20,
       "bcomment": 80,
       "image": ""
   },
   {
       "id": 4,
       "btitle": "雪山飞狐",
       "bpub_date": "1987-11-11",
       "bread": 58,
       "bcomment": 24,
       "image": ""
   },
   {
       "id": 5,
       "btitle": "西游记",
       "bpub_date": "1988-01-01",
       "bread": 10,
       "bcomment": 10,
       "image": "booktest/xiyouji.png"
   },
   {
       "id": 6,
       "btitle": "水浒传",
       "bpub_date": "1992-01-01",
       "bread": 10,
       "bcomment": 11,
       "image": ""
   },
   {
       "id": 7,
       "btitle": "红楼梦",
       "bpub_date": "1990-01-01",
       "bread": 0,
       "bcomment": 0,
       "image": ""
   }
]

2)获取单一图书数据

GET 访问 http://127.0.0.1:8000/books/5/ ,返回状态码200, 数据如下

{
    "id": 5,
    "btitle": "西游记",
    "bpub_date": "1988-01-01",
    "bread": 10,
    "bcomment": 10,
    "image": "booktest/xiyouji.png"
}

 GET 访问http://127.0.0.1:8000/books/100/,返回状态码404

3)新增图书数据

POST 访问http://127.0.0.1:8000/books/,发送JSON数据:

{
    "btitle": "三国演义",
    "bpub_date": "1990-02-03"
}
返回状态码201,数据如下

{
    "id": 8,
    "btitle": "三国演义",
    "bpub_date": "1990-02-03",
    "bread": 0,
    "bcomment": 0,
    "image": ""
}

4)修改图书数据

PUT 访问http://127.0.0.1:8000/books/8/,发送JSON数据:

{
    "btitle": "三国演义(第二版)",
    "bpub_date": "1990-02-03"
}
返回状态码200,数据如下

{
    "id": 8,
    "btitle": "三国演义(第二版)",
    "bpub_date": "1990-02-03",
    "bread": 0,
    "bcomment": 0,
    "image": ""
}

5)删除图书数据

DELETE 访问http://127.0.0.1:8000/books/8/,返回204状态码

1、REST接口开发的核心任务

在开发REST API接口时,视图中做的最主要的三件事:

将请求的数据(如JSON格式)转换为模型类对象
操作数据库
将模型类对象转换为响应的数据(如JSON格式)

2、序列化 Serialization

我们可以将序列化;理解为:

将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象转换为JSON字符串,这个转换过程我们称为序列化。

如:

queryset = BookInfo.objects.all()
book_list = []
# 序列化
for book in queryset:
    book_list.append({
        'id': book.id,
        'btitle': book.btitle,
        'bpub_date': book.bpub_date,
        'bread': book.bread,
        'bcomment': book.bcomment,
        'image': book.image.url if book.image else ''
    })
return JsonResponse(book_list, safe=False)

反之,将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。

如:

json_bytes = request.body
json_str = json_bytes.decode()
 
# 反序列化
book_dict = json.loads(json_str)
book = BookInfo.objects.create(
    btitle=book_dict.get('btitle'),
    bpub_date=datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
)

我们可以看到,在开发REST API时,视图中要频繁的进行序列化与反序列化的编写。

认识 Django REST framework 框架

    Django REST framework 框架是一个用于构建Web API 的强大而又灵活的工具。

    通常简称为DRF框架 或 REST framework。

    DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。

特点
提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;提供了丰富的类视图、Mixin扩展类,简化视图的编写;丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;多种身份认证和权限认证方式的支持;内置了限流系统;直观的 API web 界面;可扩展性,插件丰富。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值