Django前后端分离开发,实现REST接口

453 阅读2分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

什么是前后端分离?为什么要前后端分离?

  • 后端仅返回数据:前后端分离时,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。
  • 优点:不同前端(WEB/APP/……)可以从统一的后端获取一样的数据,进行不同处理和展示。有利于前后端分工开发,也有利于后续拓展前端方式。
  • 后端API接口实现(请求方式、路径、返回等)可能风格迥异,遵循RESTful设计风格有利于统一风格(推荐而非强制要求)

RESTful API要求

(简略,非全部)

  • 使用GET/POST/PUT/DELETE 请求分别对应 SELECT/CREATE/UPDATE/DELETE(查/增/改/删)的数据库操作
  • 返回json数据

实现步骤

  1. 设置视图:为不同请求(get/post/put/delete)设置对应的同名方法
    1. 根据从地址取出的参数查询对应对象
    2. 根据不同请求及请求体中的信息进行对应操作
    3. 返回json数据
  2. 添加路由:添加对应地址,且设置需要取出的参数

1. 设置视图(views.py)

# 以实现一本书的查(get)、改(put)、删(delete)的REST接口,反馈json数据
class BookAPIView(View):
    # 查询
    def get(self, request, pk):
        """
        获取单个图书信息
        路由: GET  /books/<pk>/
        """
        # 根据传入的PK值,取对应书籍的对象
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)
        # 返回json数据
        return JsonResponse({
            'id': book.id,
            'btitle': book.btitle,
        })
    
    # 修改
    def put(self, request, pk):
        """
        修改图书信息
        路由: PUT  /books/<pk>
        """
        # 根据传入的PK值,取对应书籍的对象
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)
        
        # 将请求中的json格式转换为字典格式
        json_bytes = request.body
        json_str = json_bytes.decode()
        book_dict = json.loads(json_str)

        # 校验参数(省略)
        # 更新对象并保存
        book.btitle = book_dict.get('btitle')
        book.save()

        # 返回json数据
        return JsonResponse({
            'id': book.id,
            'btitle': book.btitle,
        })

    # 删除
    def delete(self, request, pk):
        """
        删除图书
        路由: DELETE /books/<pk>/
        """
        # 根据传入的PK值,取对应书籍的对象
        try:
            book = BookInfo.objects.get(pk=pk)
        except BookInfo.DoesNotExist:
            return HttpResponse(status=404)
        # 删除对象
        book.delete()

        # 返回操作成功(204)
        return HttpResponse(status=204)

2.添加路由(urls.py)

urlpatterns = [
    url(r'^books/(?P<pk>\d+)/$', views.BookAPIView.as_view())
]