• 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)
  • 相关阅读:
    [转]开发者最容易犯的13个JavaScript错误
    http状态码表
    RDLC报表部署到服务器的相关问题
    sharepoint权限集中管理工具
    依赖注入
    HttpModule & HttpHandle
    回滚事务
    HTTPMOUDLE 和httphandler 学习
    JavaScript操作Table
    .ne工具库
  • 原文地址:https://www.cnblogs.com/dc2019/p/13423473.html
Copyright © 2020-2023  润新知