- 下面是在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测试上述接口
-
Django开发REST API接口的基本介绍
最新推荐文章于 2024-05-14 15:45:21 发布