Django开发REST API接口的基本介绍

  • 下面是在Django框架中使用的图书案例来写一套支持数据增删改查的REST API接口,来理解REST API的开发
  • 我们这个案例中,以前后端均发送JSON格式数据为基础。
    • 先定义一个views.py的视图文件
    • #因为有时间字段,所以需要先导入datetime扩展包
      from datetimme import datetime
      #实际到视图所以需要导入Django自带的View扩展包
      from django.view import View
      #导入django中的响应扩展
      from django.http import JsonResponse
      
      #定义图书视图类
      class BookAPIView(View):
          '''
          业务逻辑:查询所有图书、增加图书
          '''
          def get(self,request):
              '''
              查询所有图书
              路由:GET    /books/
              '''
              #查询数据库得到查询集:这里的BookInfo是我们之前定义好的模板类
              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需要判断是存在,存放在,返回路径,不存在返回 None
                      'image':book.image.url if book.image else ''   
          
                  })
              return JsonResponse(book_list,safe=False)    
              #对safe的说明,我们传过去的book_list是一个list格式,在前端json支持{}也支持[]格式
              #但是django中认为[]的json格式是不安全的会进行校验,所以把safe=False,不进行校验
          def post(self,request):
              '''
              新增图书
              路由:POST    /books/
              '''
              #查询到的数据是二进制
              json_bytes = request.body
              #需要进行解码,转成字符串
              json_str = json_bytes.decode()
              #在把字符串转换成json字典
              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()
              )        
              
              return JsonResponse({
                  '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 ''
             },status=201)

      获取单个图书信息、修改图书信息和删除图书信息都需要指定id所以这三项单独定一个类视图

    • 代码如下:

      class BookAPIView(View):
          
          def get(self,request,pk):
          '''
          获取单个图书信息 
          路由:GET     /books/<pk>/
          '''
          
          #获取单个数据可能或回去不到,会报错,所以需要tyr
          try:
              book = BookInfo.Objects.get(pk=pk)
          except BookInfo.DoesNotExist:
              return HttpResponse(status=404)
      
          return JsonResponse({
              '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 ''
              })
      
          def put(self,request,pk):
              '''
              修改图书信息
              路由:  PUT    /books/<pk>/
              '''
              try:
                  book = BookInfo.objects.get(pk=pk)
              except BookInfo.DoesNotExist:
                  return HttpResponse(status=404)
      
              json_bytes = request.body
              json_str = json_bytes.decode()
              book_dict = json.loads(json_str)
      
              #此处详细的校验参数省略
      
              book.btitle = book_dict.get('btitle')
              book.bpub_date = datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date()
              book.save()
      
              return JsonResponse({
                  '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 ''
              })
              
          def delete(self, request, pk):
                  """
                  删除图书
                  路由: DELETE /books/<pk>/
                  """
                  try:
                      book = BookInfo.objects.get(pk=pk)
                  except BookInfo.DoesNotExist:
                      return HttpResponse(status=404)
          
                  book.delete()
                  #
                  return HttpResponse(status=204)
    • 最后我们需要配置一下路由,定义一个urls.py文件

      #需要导入路由扩展
      from django.conf.urls import url
      
      #导入视图
      from . import views
      
      #配置路由
      urlpatterns = [
          url(r'^books/$', views.BooksAPIVIew.as_view()),
          url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view())
      ]
      #类视图不能直接作为路由,所以需要加入 as_view(),把它当做一个视图函数去使用

      当然我还还需要在总路由下面设置路由绑定到子路由

    • 测试:我们可以使用Postman测试上述接口

    •  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值