11、Django_RESTful_了解、传统例子及其痛点

2019-11-13  本文已影响0人  猪儿打滚

REST

主要的规范

REST常用的设计规范

一、URL

1.命名

2.过滤条件

?limit = 10 # 指定返回记录的数量
?offset = 10 # 指定返回记录的开始位置
?currPage=2&pageSize=10 # 指定第几页和每页多少条数据
?sort=name # 指定返回结果按照指定的属性进行排序

3.域名

http

4.版本号

http://xxx/app/1.0/
http://xxx/app/1.1/
Accept:application/vnd.example.v1.0+json
Accept:application/vnd.example.v1.1+json;version=1.1
二、请求方式/动词
GET /projects # 获取所有项目信息
POST /projects # 创建一个新项目 
GET / projects/6 # 获取id=6的项目信息 
PUT /projects/6 # 更新id=6的项目信息(全更新)
PATCH /projects/6  # 更新id=6的项目信息(部分更新)
DELETE /projects/6 # 删除id=6的项目
''' 多层级信息的获取的设计 '''
GET /projects/6/interfaces # 获取id=6的项目信息中所有的接口信息
GET /projects/6/interfaces/1 #获取id=6的项目信息中id=1的接口信息
3、常见状态码(RESTful)
200 ok - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户创建成功或修改数据成功
204 NO CONTENT - [DELETE]:用户删除数据成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用户请求有误(请求参数有问题)
401 Unauthorized = [^] :表示用户没有权限(cookies、用户名、密码错误)
403 Forbidden - [^]:表示用户得到授权(和401错误相对),但是访问是禁止的
404 NOT FOUND - [^]:表示用户请求的路径不存在
500 INTERNAL SERVER ERROR - [^]:服务器发生错误

4、返回结果要求(RESTful)

GET /projects # 返回所有项目信息的列表(json数组)
GET / projects/6 #返回一个项目的列表 (一个json)
POST /projects # 返回新生成的项目的列表 (一个json)
PUT /projects/6 # 返回更新之后,完整的项目信息(一个json)
PATCH /projects/6  # 返回更新之后,完整的项目信息(一个json)
DELETE /projects/6 # 删除id=6的项目 # 返回空

5、错误处理

{
    "code":1001,
    "data":null,
    "msg":"用户不存在"
}

6、超链接API

传统编写CRUD

1.已有代码
from django.db import models


class User(models.Model):
    gender = (
        ('male', '男'),
        ('female', '女')
    )

    name = models.CharField(max_length=128, unique=True)  # 昵称唯一
    password = models.CharField(max_length=256)
    email = models.EmailField(unique=True)
    sex = models.CharField(max_length=32, choices=gender, default='女')
    c_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['-c_time']
        verbose_name = '用户'
        verbose_name_plural = '用户'
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('login.urls'))
]
2.创建对项目数据进行CRUD操作的接口
from login.serializer import UserModelSerializer
from rest_framework.viewsets import ModelViewSet
from django.http import JsonResponse
from login.models import User
from django.views import View
import json


class Users(View):

    def get(self, request):  # get请求中,就算用不上request,也需要设置这个参数
        """获取所有的User信息,返回类型为json"""
        # 1.数据库中获取所有的项目信息
        user_qs = User.objects.all()
        user_list = []
        # 2.遍历返回的查询集,同一个查询集的内容组装成json,并且所有的json都存放在一个列表中
        for user in user_qs:
            user_list.append(
                # 序列化:把变量从内存中变成可存储或传输的过程(比如dump/dumps、把数据转成json/把数据写入内存)
                {
                    'name': user.name,
                    'password': user.password,
                    'email': user.email,
                    'sex': user.sex,
                    'c_time': user.c_time
                }
            )
        # JsonResponse()第一个参数需要是dict,否则需要指定safe=False,不然报错
        return JsonResponse(user_list, safe=False, status=200)

    def post(self, request):
        """ 新创建User """
        # 1.获取请求中body的值,并解码
        user = request.body.decode('utf8')  # 注意body是属性,不是方法,不需要()
        # 2.还需要判断是否是json,并且必参是否填写(此处略过,痛点之一)
        # 3.把json数据反序列化成python类型的dict
        user_dict = json.loads(user, encoding='utf8')
        # 4.创建新的User到数据库中
        user = User.objects.create(**user_dict)
        # 5.新生成的user转成json(也称为序列化)
        user_new = {
            'name': user.name,
            'password': user.password,
            'email': user.email,
            'sex': user.sex,
            'c_time': user.c_time
        }

        # 6.响应返回
        return JsonResponse(user_new, status=201)


class UserDetail(View):

    def get(self, request, pk):
        """ 根据id=pk查询(pk是django默认创建的主键,和id一样) """

        # 1.此处用get对id进行查询,因为主键唯一,只会返回一个值
        # 此处应该对pk进行int判断,略过,痛点之一
        user = User.objects.get(id=pk)
        # 2.序列化,转成json
        user_dict = {
            'name': user.name,
            'password': user.password,
            'email': user.email,
            'sex': user.sex,
            'c_time': user.c_time
        }
        # 3. 响应
        return JsonResponse(user_dict, status=200)

    def put(self, request, pk):
        """ 根据id查询user,并更新改user的全部信息;请求中需有id和user更新后的全部信息 """
        # 1.此处用get对id进行查询,因为主键唯一,只会返回一个值
        # 此处应该对pk进行int判断,略过,痛点之一
        old_user = User.objects.get(id=pk)
        # 2.获取请求中修改后的user的信息,并反序列化成python的dict
        user_dict = request.body.decode('utf8')
        # 3.更新为新的user信息(因为是全部字段都更新,所以不使用update)
        # 3.1.反序列化
        user_value = json.loads(user_dict, encoding='utf8')
        # 3.2.替换值
        old_user.name = user_value['name']
        old_user.password = user_value['password']
        old_user.email = user_value['email']
        old_user.sex = user_value['sex']
        old_user.c_time = user_value['c_time']
        # 3.3.保存
        old_user.save()
        # 4.新user序列化
        user_data = {
            'name': old_user.name,
            'password': old_user.password,
            'email': old_user.email,
            'sex': old_user.sex,
            'c_time': old_user.c_time
        }
        # 5.响应
        return JsonResponse(user_data, status=201)

    def delete(self, request, pk):
        """根据id=pk进行删除操作  ORM的删除是先查询再删除"""
        # 1.查询
        # 此处应该对pk进行int判断,略过,痛点之一
        user = User.objects.get(id=pk)
        # 2.删除
        user.delete()
        # 3.响应{}
        return JsonResponse({}, safe=False, status=204)
from django.urls import path
from login import views

app_name = 'login'

urlpatterns = [
    path(r'users/', views.Users.as_view()),
    path(r'users/<int:pk>/', views.UserDetail.as_view()),
]

设计总结

1.序列化
2.增删改查的步骤

痛点

上一篇 下一篇

猜你喜欢

热点阅读