Django项目总结:前后端分离,REST,类视图

前后端分离的思想

-- 后端负责数据编造,而前端则负责数据渲染,

-- 前端静态页面调用指定 api 获取到有固定格式的数据,再将数据展示出来,

-- 这样呈现给用户的就是一个”动态“的过程,而关于api这部分的设计则成了一个问题。如何设计出一个便于理解,容易使用的api则成了一个问题。

-- restful就是用来规范我们的api的一种约束。

 

REST - https://www.jianshu.com/p/a35bad7dbc54

-- REST是Representational State Transfer三个单词的缩写

-- 它代表着分布式服务的架构风格

-- 每一个URI代表一种资源

-- 客户端和服务器之间,传递这种资源的某种表现层

-- 客户端通过HTTP动词,对服务端资源进行操作,实现”表现层状态转换“

  • GET(SELECT):从服务器取出资源
  • POST(CREATE or UPDATE):在服务器创建资源或更新资源
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)
  • DELETE(DELETE):从服务器删除资源

-- 如果你的api想被称为restful api,只要遵循其规定的约束即可

API - views.py

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from Api.models import Book


# 获取书的列表;创建一本书
@csrf_exempt
def books(request):

    if request.method == "GET":
        book_list = Book.objects.all()
        print(type(book_list))

        book_list_json = []

        for book in book_list:
            book_list_json.append(book.to_dict())

        data = {
            # 通常给前端看这个状态码
            'status': 200,
            'msg': 'ok',
            'data': book_list_json,
        }
        # 对传输时的状态码进行改变
        return JsonResponse(data=data, status=201)

    elif request.method == "POST":
        b_name = request.POST.get('b_name')
        b_price = request.POST.get('b_price')

        book = Book()
        book.b_name = b_name
        book.b_price = b_price
        book.save()

        print("ok")

        data = {
            'status': 201,
            'msg': 'add success',
            'data': book.to_dict()
        }

        return JsonResponse(data=data)


# 获取书,删除指定书
def book(request, bookid):

    if request.method == "GET":

        book_obj = Book.objects.get(pk=bookid)

        data = {
            'status': 200,
            'msg': 'ok',
            'data': book_obj.to_dict(),
        }

        return JsonResponse(data=data)

    elif request.method == "DELETE":

        book_obj = Book.objects.get(pk=bookid)

        book_obj.delete()

        data = {
            'status': 204,
            'msg': 'delete success',
            # 数据删除后,没有数据了,不要字段就不写'data': {},
            # 还有数据,正常返回对象,'data': {},
            # 没有数据了,保留字段,根据字段默认值填写data
            # 对象{},数组[],数字0
            'data': {},
        }

        return JsonResponse(data=data)

视图函数

-- FBV

-- function base view

-- CBV

-- class base view

 

类视图

-- CBV(以下进行了源码分析)

-- 继承自View

-- 注册的时候使用的as_view()

-- 入口

  -- 不能使用请求方法的名字作为参数的名字

  -- 只能接受已经存在的属性对应的参数

  -- 定义了一个view

    -- 创建了一个类视图对象

    -- 保留,拷贝传递进来的属性和参数

    -- 调用dispatch方法(核心)

      -- 分发

      -- 如果请求方法在我们的允许的列表中

        -- 从自己这个对象中获取请求方法名字小写对应的属性,如果没有找到,会给一个默认http_method_not_allowded

      -- 如果请求方法不在我们允许的列表中,直接就是http_method_not_allowed

      -- 之后将参数传递,调用函数

-- 默认实现了options

  -- 获取接口信息,可以获取接口都允许什么请求

-- 简化版流程

  -- as_view

  -- dispatch

  -- 调用实现请求方法对应的函数名

model.py

from django.db import models

class Book(models.Model):
    b_name = models.CharField(max_length=32)
    b_price = models.FloatField(default=1)

    def to_dict(self):
        return {'id': self.id, 'b_name': self.b_name, 'b_price': self.b_price}

urls.py

from django.urls import path

from CBV import views

app_name = 'CBV'
urlpatterns = [
    path('hello/', views.HelloCBV.as_view(msg='Hi'), name='hello'),
    path('books/', views.BookCBV.as_view(), name='books'),
]

views.py

from django.http import HttpResponse, JsonResponse
from django.views import View

from CBV.models import Book


# 基于类的视图函数 CBV
class HelloCBV(View):

    msg = None

    def get(self, request):
        return HttpResponse('Hello CBV %s' % self.msg)


# 继承自系统View
class BookCBV(View):
    def get(self, request):

        book_list = Book.objects.all()

        book_list_json = []

        for book in book_list:
            book_list_json.append(book.to_dict())

        data = {
            # 通常给前端看这个状态码
            'status': 200,
            'msg': 'ok',
            'data': book_list_json,
        }
        # 对传输时的状态码进行改变
        return JsonResponse(data=data, status=201)

    def post(self, request):

        b_name = request.POST.get('b_name')
        b_price = request.POST.get('b_price')

        book = Book()
        book.b_name = b_name
        book.b_price = b_price
        book.save()

        data = {
            'status': 201,
            'msg': 'add success',
            'data': book.to_dict()
        }

        return JsonResponse(data=data)
原文地址:https://www.cnblogs.com/dc2019/p/13423473.html