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)