zoukankan      html  css  js  c++  java
  • django框架实现restful风格的API开发

    RESTful风格的要求:https://www.cnblogs.com/chichung/p/9933116.html

    利用django原生的框架直接做RESTful的API开发是怎样的呢?感受一下:

    import json
    from django.http import JsonResponse, HttpResponse
    from django.views import View
    from user.models import Department
    
    
    class DepartmentListAPIView(View):
        def get(self,request):
            """查询所有部门  GET     /departments/"""
    
            query_set = Department.objects.all()
            department_list = []
            for i in query_set:
                department_list.append({"id":i.id,"name":i.name,"create_date":i.create_date})
            # JsonResponse 可以把字典、列表转换为json.但是转换列表时需要指定,safe=False
            return JsonResponse(department_list,safe=False)
    
    
        def post(self,request):
            """新增一个部门
            restful要求url地址是/departments
            要求成功返回的状态码是201(创建成功)
            要求返回新生成的资源的对象"""
            json_str = request.body.decode()  # 二进制-->json字符串
            data_dict = json.loads(json_str)  # json字符串-->字典
            # 校验参数(略)
            department = Department()
            department.name = data_dict["name"]  # 字典获取值,[]或者.get(key)
            department.save()  # 字典-->对象
            dict_data = {    # 对象-->字典
                "id":department.id,
                "name":department.name,
                "create_date":department.create_date,
                "is_delete":department.is_delete
            }
            return JsonResponse(dict_data,status=201)  # 字典-->json字符串
    
    
    class DepartmentDetailAPIView(View):
        def get(self,request,pk):
            """查询一个部门"""
            department = Department.objects.get(id=pk)  # 对象
            # 对象转化为字典
            date_dict = {
                "id":department.id,
                "name":department.name,
                "create_date":department.create_date,
                "is_delete":department.is_delete
            }
            return JsonResponse(date_dict)  # 字典-->json字符串
    
        def put(self,request,pk):
            """
            修改一个部门  PUT     /departments/<pk>/
            :param pk: 主键,部门id
            """
            json_str = request.body.decode()  # 二进制-->json字符串
            data_dict = json.loads(json_str)  # json字符串-->字典
            # 校验参数(略)
            department = Department.objects.get(id=pk)  # 获取要修改的对象
            department.name = data_dict.get("name")
            department.create_date = data_dict.get("create_date")
            department.save()
            # restful要求put方法返回修改的对象的全部属性
            data_dict = {  # 对象-->字典
                "id":department.id,
                "name":department.name,
                "create_date":department.create_date,
                "is_delete":department.is_delete
            }
            return JsonResponse(data_dict,status=200)
    
        def delete(self,request,pk):
            """删除一个部门"""
            count = Department.objects.get(id=pk).delete()
            if count == 0:
                return HttpResponse(status=404)
            return HttpResponse(status=204)  # restful要求删除成功返回204状态码

    同时,urls的设置也要restful一点:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^departments$',views.DepartmentListAPIView.as_view()),
        url(r'^departments/(?P<pk>d+)$',views.DepartmentDetailAPIView.as_view())
    ]

    结论:太麻烦了,还是得用 Django REST Framework啊。

  • 相关阅读:
    js中的this
    js中的call和apply
    自定义ListView无法响应点击事件
    Listview滑动超出显示区域时getChildAt(arg2)异常错误
    cocos2d-x在eclipse上搭建开发环境
    阿里云服务器CentOS 5.7(64位)安装配置LAMP服务器(Apache+PHP5+MySQL)
    如何在eclipse模拟器上运行下载好的apk程序
    百度RSS整理
    vtigercrm学习(二)
    Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
  • 原文地址:https://www.cnblogs.com/chichung/p/9933861.html
Copyright © 2011-2022 走看看