接口

# 接口: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': '',
'msg': 'ak不存在'
}, json_dumps_params={'ensure_ascii': False})
ak = request.GET.get('ak')
if ak != '123abc':
return JsonResponse({
'status': '',
'msg': 'ak非法'
}, json_dumps_params={'ensure_ascii': False})
return JsonResponse({
'status': '',
'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': '',
'msg': '参数不合法',
}, json_dumps_params={'ensure_ascii': False}) id = len(book_list) + 1
book = {'id': id, 'name': name}
book_list.append(book)
return JsonResponse({
'status': '',
'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安装

#  pip3 install djangorestframework

drf的安装步骤

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

drf具体的使用


from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Response
# 路由层
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()),
]

序列化

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

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

接口与DRF的安装的更多相关文章

  1. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  2. drf框架安装配置及其功能概述

    0902自我总结 drf框架安装配置及其功能概述 一.安装 pip3 install djangorestframework 二.配置 # 注册drf app NSTALLED_APPS = [ # ...

  3. 使用YApi搭建API接口管理工具(docker安装)

    使用YApi搭建API接口管理工具(docker安装) 工具描述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布 ...

  4. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  5. Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化

    一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...

  6. drf的安装和配置

    一.安装 1.安装 pip install djangorestframework 2.配置 注:以上两部就OK了 二.最简单的drf版本 1.创建应用 在项目中新建一个应用: python mana ...

  7. 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项

    1.在此之前,记录一下之前的错误,在参考博客[caffe-Windows]caffe+VS2013+Windows+GPU配置+cifar使用进行caffe的安装时,其中的一些步骤可以不做,具体见下图 ...

  8. RAP接口文档的安装

    本机环境 系统:CentOS 6.7 64 位 MySQL 5.6 JDK 1.8 Tomcat 8 Redis 3.0.7 Rap 0.14.1 Rap 说明 官网:https://github.c ...

  9. vue 前后端分离 接口及result规范 及drf安装使用方法

    接口 # 接口:url链接,通过向链接发送不同的类型请求与参数得到相应的响应数据​# 1.在视图层书写处理请求的 视图函数# 2.在路由层为视图函数配置 url链接 => 产生接口# 3.前台通 ...

随机推荐

  1. 开源项目 03 DocX

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. [bzoj1001]狼抓兔子 最小割

    题意概述:给出一张无向图,每条边有一个权值,割掉这条边代价为它的权值,求使起点不能到达终点的最小代价. 显然能看出这是个最小割嘛,然后最小割=最大流,建图的时候特殊处理一下再跑个最大流就好了. #in ...

  3. CSS3之碰撞反弹动画无限运动

    示例代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. Django自带后台admin的使用配置

    Django自带后台使用配置参考官网地址:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ ,本文章值是介绍简单配置,如果需要详细内容 ...

  5. mysql regexp 表达式

    mysql> select * from test; +----+----------+-------+-----------+ | id | name | score | subject | ...

  6. mysql 生成随机数rand()

    mysql> select rand(); +--------------------+ | rand() | +--------------------+ | 0.99134733527092 ...

  7. 【AtCoder】 ARC 103

    link C-//// 直接算会出现奇偶两组选了同一个数,注意处理一下就行 #include<bits/stdc++.h> #define ll long long #define dbg ...

  8. Linux下查看目录文件数和文件大小

    一.查看当前目录下文件个数 在linux下查看目录下有多少文件可以用:ls -l  命令查看,ls -lR 递归查看所有目录, 如果文件很多,则用wc命令 和 grep 命令进行过滤. wc命令显示输 ...

  9. C# 获取文件扩展信息-应用名称/作者等

    方案一:使用微乳封装的Shell包 添加nuget包:Microsoft.WindowsAPICodePack.Shell using Microsoft.WindowsAPICodePack.She ...

  10. pycharm项目添加.gitignore忽略.idea文件夹

    本地项目结构: .gitignore文件中添加: at_alsv_pro/.idea/SearchImage.iml at_alsv_pro/.idea/misc.xml at_alsv_pro/.i ...