接口

# 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据

# 1.在视图层书写处理请求的 视图函数
# 2.在路由层为视图函数配置 url链接 => 产生接口
# 3.前台通过ajax,爬虫,工具等对接口发送请求,提交相应的参数获得对应的响应数据


# https://api.map.baidu.com/place/v2/search
'''
ak: 6E823f587c95f0148c19993539b99295
region: 上海
query: 肯德基
output: json
'''

RESTful规范

# 定义接口的规范
# REST: 表征性状态转移(Representational State Transfer)
# RESTful规范:web数据请求接口设计规范

# 学习的目的:
# 1.如何设计url链接地址
# 2.如何设计响应的数据格式

'''
1)通常使用https请求
2)域名:有api关键字出现
-- https://api.baidu.com (可能涉及跨越问题)
-- https://baidu.com/api
3)版本:不同版本需要标注
-- https://example.com/api/v1 | -- https://example.com/api/1
-- https://example.com/api/v2 | -- https://example.com/api/2
4)资源:请求的目标数据称之为资源,资源一般都用名词复数表示
-- https://example.com/api/v1/books (之前不规范的案例: /get_books/)
5)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式
-- get:https://example.com/api/v1/books 获取所有
-- post:https://example.com/api/v1/books 新增一本
-- put:https://example.com/api/v1/book/1 更新id=1的一本
-- patch:https://example.com/api/v1/book/1 更新id=1的一本
-- delete:https://example.com/api/v1/book/1 删除id=1的一本
6)资源过滤:通过接口传递参数来过滤资源
-- https://example.com/api/v1/books?limit=10 限制10条 7)状态码:返回数据要标准状态码,通过在数据中 {"status": 0}
-- SUCCESS("0", "查询成功")
-- NODATA("1xx", "非正确,无数据,显示基本信息")
-- FEAILED("2xx", "查询失败")
8)错误信息:请求失败需要标注错误信息 {"msg": "请求参数不合法"}
9)操作结果:请求操作成功的返回结果 {"results": []}
-- get:返回资源列表 | 返回单一资源
-- post:返回单一新增资源
-- put:返回更新的资源
-- patch:返回更新的资源
-- delete:返回空文档
10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
'''

restful规范面试总结

''' 
1.url链接设计:采用https方式,有api关键字,有版本需要明确版本,请求链接用名词来表示资源,具体的操作方式采用请求方式来确定
2.url响应数据设计:需要明确 状态码、错误信息、成功结果,子资源一般用子资源的接口来标注
'''

原生简易书写TESTful规范接口

# 路由层
from app import views
urlpatterns = [
   url(r'^books/', views.books),
]

# 视图层
from django.http import JsonResponse
book_list = [{'id': 1, 'name': '红楼梦'}, {'id': 2, 'name': '水浒传'}]
def books(request):
   if request.method == "GET":
       if 'ak' not in request.GET:
           return JsonResponse({
               'status': '101',
               'msg': 'ak不存在'
          }, json_dumps_params={'ensure_ascii': False})
       ak = request.GET.get('ak')
       if ak != '123abc':
           return JsonResponse({
               'status': '200',
               'msg': 'ak非法'
          }, json_dumps_params={'ensure_ascii': False})
       return JsonResponse({
               'status': '0',
               'msg': 'ok',
               'results': book_list
          }, json_dumps_params={'ensure_ascii': False})
   
   if request.method == 'POST':
       name = request.POST.get('name')
       if not name:
           return JsonResponse({
               'status': '101',
               'msg': '参数不合法',
          }, json_dumps_params={'ensure_ascii': False})
       
       id = len(book_list) + 1
       book = {'id': id, 'name': name}
       book_list.append(book)
       return JsonResponse({
           'status': '0',
           'msg': 'ok',
           'results': book
      }, json_dumps_params={'ensure_ascii': False})

cbv流程

"""
1) as_view()
-- Users.as_view()本质拿到view(request, *args, **kwargs)函数对象
2)view(request, *args, **kwargs)
-- return self.dispatch(request, *args, **kwargs)来完成请求的反射
3)dispatch(request, *args, **kwargs)
-- 完成具体的请求响应的分发
# 注:重写dispatch是可以在分发响应时,加入其它逻辑限制
"""
# 路由层
from app import views
urlpatterns = [
   url(r'^users/', views.Users.as_view()),
]

# 视图层
from django.views import View
class Users(View):
   # 请求响应的分发
   def dispatch(self, request, *args, **kwargs):
       pass  # 可以对请求加以限制
       result = super(Users, self).dispatch(request, *args, **kwargs)
       pass # 可以对请求再进一步处理
       return result


   def get(self, request, *args, **kwargs):
       return JsonResponse({
           "msg": 'get msg'
      })

   def post(self, request, *args, **kwargs):
       name = request.POST.get('name')
       print(name)
       return JsonResponse({
           "msg": 'post msg'
      })

drf安装

# drf: djangorestframework => pip3 install djangorestframework


from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Response

drf的安装步骤

# 1)安装drf:pip3 install djangorestframework
# 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
# 3)基于cbv完成满足RSSTful规范的接口

drf具体的使用

# 路由层
from app import views
urlpatterns = [
   url(r'^teachers/', views.Teachers.as_view()),
]

# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
class Teachers(APIView):
   def get(self, request, *args, **kwargs):
       salary = request.GET.get('salary')
       print(salary)
       return Response({
           'status': 2,
           'msg': 'get请求成功',
      })

   # 前台发送数据的方式:formdate | urlencoded | json
   # drf的request都对其二次封装解析到request.data中
   def post(self, request, *args, **kwargs):
       salary = request.data.get('salary')
       print(salary)
       return Response({
           'status': 2,
           'msg': 'post请求成功',
      })

drf 的 请求源码分析

# as_view()
# 核心走了父类as_view
view = super(APIView, cls).as_view(**initkwargs)
   # 返回的是局部禁用csrf认证的view视图函数
   return csrf_exempt(view)
   
# dispatch(self, request, *args, **kwargs)
# 二次封装request对象
request = self.initialize_request(request, *args, **kwargs)
   # 自定义request规则
   self.initial(request, *args, **kwargs)
   
# initialize_request(self, request, *args, **kwargs)
# 原生request封装在request._request
   
# initial(self, request, *args, **kwargs)
# 认证
self.perform_authentication(request)
   # 权限
   self.check_permissions(request)
   # 频率
   self.check_throttles(request)
   
# 在drf的request.py的模块中,对django的request进行二次封装
def __getattr__(self, attr):
  try:
           return getattr(self._request, attr)
       except AttributeError:
           return self.__getattribute__(attr)
   # 完成对django的request完全兼容

drf序列化

# models.py
class Students(models.Model):
   name = models.CharField(max_length=32)
   age = models.IntegerField()
   gender = models.CharField(max_length=8)
   def __str__(self):
       return 'Student: %s' % self.name
   

# 自定义序列化类:为具体的类提供序列化
# my_serializer.py
from rest_framework import serializers
class StudentSerializer(serializers.Serializer):
   # 1.如果没有source引入models的字段名,序列化字段名必须同models的字段名
   # 2.如果有source引入models的字段名,序列化字段名必须不同于models的字段名,目的是对外隐藏数据库的字段名
   id = serializers.IntegerField()
   stu_name = serializers.CharField(source='name')
   age = serializers.IntegerField()
   gender = serializers.CharField()
   

# views.py
from app import models
from app.my_serializer import StudentSerializer
class Students(APIView):
   def get(self, request, *args, **kwargs):
       stus = models.Students.objects.all()
       # 需要序列化多个对象,需要明确many=True
       stu_ser = StudentSerializer(stus, many=True)
       print(stus)
       return Response({
           'status': 0,
           'msg': 'ok',
           'results': stu_ser.data
      })
   
   
# urls.py
from app import views
urlpatterns = [
   url(r'^students/', views.Students.as_view()),
]

序列化

# 数据的传输与文件存储均是采用字符串格式

# 序列化:将对象转换成字符串的过程,进而用来传输或存储
# 反序列化:将字符串转换为对象的过程,在程序中使用

vue 前后端分离 接口及result规范 及drf安装使用方法的更多相关文章

  1. FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb

    apiAutoTestWeb使用说明 apiAutoTestWeb是为apiAutoTest的可视化版本,其采用前后端分离(FastAPI + Vue2)方式实现 具体使用: Python3 + Fa ...

  2. Flask + vue 前后端分离的 二手书App

    一个Flask + vue 前后端分离的 二手书App 效果展示: https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 ...

  3. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  4. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  5. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  6. 解决Django+Vue前后端分离的跨域问题及关闭csrf验证

      前后端分离难免要接触到跨域问题,跨域的相关知识请参:跨域问题,解决之道   在Django和Vue前后端分离的时候也会遇到跨域的问题,因为刚刚接触Django还不太了解,今天花了好长的时间,查阅了 ...

  7. beego-vue URL重定向(beego和vue前后端分离开发,beego承载vue前端分离页面部署)

    具体过程就不说,是搞这个的自然会动,只把关键代码贴出来. beego和vue前后端分离开发,beego承载vue前端分离页面部署 // landv.cnblogs.com //没有授权转载我的内容,再 ...

  8. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题

    原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...

  9. 一个实际的案例介绍Spring Boot + Vue 前后端分离

    介绍 最近在工作中做个新项目,后端选用Spring Boot,前端选用Vue技术.众所周知现在开发都是前后端分离,本文就将介绍一种前后端分离方式. 常规的开发方式 采用Spring Boot 开发项目 ...

随机推荐

  1. 每天一个linux命令:less(14)

    less less命令的作用与more十分相似,都可以用来浏览文字档案的内容,less 在查看之前不会加载整个文件 .用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页. ...

  2. Java Web学习总结(1)Tomcat使用教程

    一,简介 Tomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.因 ...

  3. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法

    SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备 ...

  4. CSS基础知识复习

    1. CSS优先级 标签内部属性 style定义的CSS > 文档内定义的css > 引用外部CSS文件 2. CSS选择器类型 . 标签选择器 . 类选择器(使用.做标识) . ID选择 ...

  5. [CSP-S模拟测试]:Revive(点分治)

    题目背景 $Sparkling\ ashes\ drift\ along\ your\ flames \\ And\ softly\ merge\ into\ the\ sky$ 题目传送门(内部题1 ...

  6. AST7D08 心率计

    接线: 1.GND 2.+3.3V 3.RST 4. 5.CS 6.READY 7.DI 8.DO 9.CLK

  7. Java学习之包

    一.包:就是类的命名空间(在文件系统中的表现形式就是文件夹) 二.代码编写规则 1.写在程序文件的第一行 2.格式:package 包名[.包名1.包名2......] 类的全名称 包名.类名 例如: ...

  8. Linux系统CPU占用率较高问题排查思路

    作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失. 很多运维的同学遇到这 ...

  9. g++ 之 -m64选项

    今天编译之前的项目,竟然报了下面的错误 usr/bin/ld: i386 architecture of input file `./proxycpp/soapRemoteDiscoveryBindi ...

  10. USACO 6.5 章节 世界上本没有龙 屠龙的人多了也便有了

    All Latin Squares 题目大意 n x n矩阵(n=2->7) 第一行1 2 3 4 5 ..N 每行每列,1-N各出现一次,求总方案数 题解 n最大为7 显然打表 写了个先数值后 ...