天天看点

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测试上述接口

继续阅读