(一)drf基础

全称:django-rest framework

接口:什么是接口、restful接口规范(协议)

CBV(基于FBV的基础上形成)、CBV生命周期源码----基于restful规范下的CBV接口

请求生命周期:请求组件、解析组件、响应组件

序列化组件(序列化、反序列化简单来说就是对象转为字符串、字符串转为对象,目的是为传输数据(传给别的语言或者存储))

三大认证(重中之重):认证(用户是否合法)、权限(管理员、普通用户)、频率(次数过多限制)

其他组件(过滤、筛选、排序、分页、路由)

1.接口

概念:联系两个物质的媒介,完成信息的交互。在web程序中,联系前台页面与后台数据库的媒介。

web接口组成:

url:长得像返回数据的url链接。如api.baidu.map/search

(www.baidu.com不叫接口,叫url链接,访问只能拿到主页。api.baidu.map/search是接口,返回的是json数据)

请求参数:前台按照指定的key提供数据给后台。(必须是给定的,这样后台才能以此提取数据再到数据库查询返回)

响应数据:后台与数据库交互后,将数据反馈给前台。

因此,接口就是带着请求参数访问能够得到响应数据的url链接。

接口 = url + 请求参数 + 响应数据

2.restful接口规范

接口规范:不同后台语言,使用同样的接口返回同样的数据。

如何写接口:要写url和响应数据。如果将请求参数也加上,就是在写接口文档。

两大部分:

(1)url

1)用api关键字标识接口url。方式1:api.baidu.com;方式2:www.baudu.com/api

2)接口数据安全性决定优先选用https协议。

3)如果一个接口有多版本存在,需要在url中标识体现。如下的v1和v2

api.baidu.com/v1/....  api.baidu.com/v2/....

4)操作中的数据称为资源,在url中资源一般采用复数形式,一个接口可以概括对该资源的多种操作方式。(一个url对应一个类,类里面可以有多个请求方法)

可以对操作隐藏,并且复用性更强(写动作了,只能适用这一个动作,不写其他动作都可以用)如api.baidu.com/books    api.baidu.com/books/(pk)

5)请求方式有多种,用一个url处理如何让保证不混乱------通过不同的请求方式标识不同操作资源的方式

/books      get     获取所有

/books post   增加一个(多个)

/books/(pk) delete 删除一个

/books/(pk)  put 整体更新一个  #改一个用户

/books/(pk)  patch 局部更新一个 #改一个用户的密码

6)资源往往涉及数据的各种操作方式:筛选、排序、限制

api.baidu.com/books/?search=宝马&ordering=-price&limit=3

(2)响应数据

1)http请求的响应会有响应状态码,接口用来返回操作的资源数据,也有自己操作数据结果的资源状态码(status 0代表操作资源成功,1代表操作失败,2代表操作成功,但没匹配结果)

注:资源状态码和http状态码不一样,为前后台的约定

2)资源状态码的文字提示。

status ok “账号有误或者密码有误”

3)资源本身

results

注:删除资源成功不做任何数据返回(只返回空字符串,连状态码、状态信息都不返回)

4)不能直接返回的资源(子资源、图片、视频等资源),返回该资源的url链接。

https://api.baidu.com/v1/books?limit=3
get|post|delete|put|patch
{
  “status” : 0,
  “msg” : “ok”,
  “results”: [
{
  “title”: “三国”,
  “price”: 78,
  “img”: “https://.....”
    }
  ]
}

3.django流程

(1)项目准备:

1.分发路由

在项目文件夹的urls复制一份到应用文件夹中。然后在项目文件夹的urls分发路由给app:导入include,然后url(r'^api/', include('api.urls'))。再在app文件夹的urls.py中分发路由给CBV

2.视图

在应用中分发路由前,先写类视图

from django.http import JsonResponse
from django.views import View class Book(View): def get(self, request, *args, **kwargs):
return JsonResponse('get ok', safe=False) def post(self, request, *args, **kwargs):
return JsonResponse('get ok', safe=False) #safe默认为true,要返回字典。不是字典否则抛异常。

3.在应用urls下分发路由

from django.conf.urls import url
from . import views #注意在应用中导入视图都是. 从当前应用中导入 urlpatterns = [
url(r'^books/', views.Book.as_view()),
]

4.定义模型类

(1)models.py中定义类

from django.db import models

class Book(models.Model):

    title = models.CharField(max_length=64)
price = models.DecimalField(max_digits=5, decimal_places=2) #整数、小数位 class Meta: #嵌套类(给上级类添加功能或指定标准) db_table = 'book' #自定义数据库表名
verbose_name = "book" #给模型起个可读的名字,默认是复数
verbose_name_plural = verbose_name #取消上面的复数 def __str__(self): #显示的内容
return '<<%s>>' % self.title

(2)数据库迁移

进入django的shell环境中:Tools----> run manage.py task

在shell环境中生成迁移文件:makemigrations。然后迁移:migrate

5.生成admin

(1)在amin.py中注册并且导入模型

from django.contrib import admin
port models admin.site.register(models.Book)

(2)创建用户

在shell环境中:createsuper创建超级用户,然后输入用户密码(邮箱不用)

(2)CBV的请求生命周期

请求如何到CBV下的get和post

a.请求过来,项目文件中路由分发给应用api的路由

b.应用分发路由走as_view函数。

views.Book.as_view()  保存一系列数据(request、args、**kwargs等)给Book对象,然后都给dispatch进行路由分发。

dispatch干的事:判断请求方式是否支持,然后返回(通过getattr)支持的这些请求方法(get、post等,在视图中自定义get、post的返回值)的结果。

c.通过dispatch就执行了CBV下请求方式的结果,返回结果

4.django原生的接口、序列化

六大基础接口:获取一个、获取所有、增加一个、删除一个、整体更新一个、局部更新一个

十大接口:6大基础、群增、群删、整体群改、局部群改

1.在应用的urls.py下分发路由

url(r'^books/$', views.Book.as_view()),   #必须要加$,否则后面匹配不到

url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),有名分组

在视图函数中通过kwargs.get(pk)取到匹配的值

2.在views.py里写逻辑

class Book(View):

def get(self, request, *args, **kwargs):

pk = kwargs.get('pk')  #获取参数

if not pk:  #群查接口

#操作数据库

book_obj_list = models.Book.objects.all()

#序列化过程

book_list = []

for obj in book_obj_list:   #将查到的对象序列化

dic = {}

dic['title'] = obj.title

dic['price'] = obj.price

book_list.append(dic)

return JsonResponse({

'status' : 0,

"msg" : "ok",

"results": book_list,

}, json_dumps_params={'ensure_ascii':False})

else:    #单查接口

book_dic = models.Book.objects.filter(pk=pk).values(

'title', 'price').first()

if book_dic:

return JsonResponse({

'status': 0,

"msg": "ok",

"results": book_dic,

}, json_dumps_params={'ensure_ascii': False})

return JsonResponse({

'status': 2,

"msg": "no results",

}, json_dumps_params={'ensure_ascii': False})

def post(self, request, *args, **kwargs):

#前台通过urlencoded方式提交数据

try:

book_obj = models.Book.objects.create(**request.POST.dict()) #create创建对象。将request.POST中存放的提交的关键词参数转化为字典以**方式传进去。没传参数,这边会报错。

if book_obj:

return JsonResponse({

'status': 0,

"msg": "ok",

“results”: {‘title’:book_obj.title, “price”:book_obj.price}

}, json_dumps_params={'ensure_ascii': False})

except:    #健壮性

return JsonResponse({

'status': 1,

"msg": "wrong params",

}, json_dumps_params={'ensure_ascii': False})

return JsonResponse({    #可能操作数据库失败了

'status': 2,

"msg": "created failed",

}, json_dumps_params={'ensure_ascii': False})

JsonResponse返回时,中文会变成unicode,要加json_dumps_params={'ensure_ascii':False}选项。但在linux环境下的火狐浏览器,加了是乱码。

filter返回queryset对象,对象里是个列表(表名:对象信息(有自定义str就是自定义的信息))。first取里第一个对象(相当于print(第一个对象))values展示对应的对象里的值

<QuerySet [<Book: <<三国演义>>>]>                   #直接.filter

<<三国演义>>                                    #.first()

<QuerySet [{'title': '三国演义', 'price': Decimal('56.00')}]>  #.values('title','price')

{'title': '三国演义', 'price': Decimal('56.00')}             #.values.first()  是个字典

上面序列化的工作很麻烦。drf就是为了方便序列化的。

postman可以完成不同方式的请求:get、post、put等

postman发送数据包有三种方式:form-data、urlencoded、json. 原生django对urlencoded数据提交兼容。

drf之框架基础的更多相关文章

  1. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  2. Hibernatel框架基础使用

    Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...

  3. Struts2框架基础

    Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...

  4. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  5. 框架基础之Hibernate简介

    框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...

  6. ThinkPHP框架基础

    ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...

  7. Python云端系统开发入门——框架基础

    Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...

  8. 如何基于Winform开发框架或混合框架基础上进行项目的快速开发

    在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...

  9. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

随机推荐

  1. 正确去除隐藏在WordPress系统各处的版本号

    使用WordPress的博主都有一个普遍的意识,就是为了安全而移除WordPress的版本号,以免不良用心的人利用旧版本的漏洞对网站进行攻击. WordPress会在前端代码head中加入以下代码(3 ...

  2. 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...

  3. 2020由浅入深最强Java面试题

    1.String,StringBuffer和StringBuilder有什么区别?     String是字符串常量,不可变对象,每次对String修改都等同于生成了一个新的String象,然后将指针 ...

  4. DevOps生命周期,你想知道的全都在这里了!

    在大多数情况下,软件应用程序开发由于其规范性和复杂性而变得很耗时. 为了在短时间内交付高质量应用程序,软件开发人员正在遵循一套通用的实践,称为DevOps生命周期. 那么,DevOps在软件应用程序开 ...

  5. akka-typed(2) - typed-actor交流方式和交流协议

    akka系统是一个分布式的消息驱动系统.akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业.所以,通俗点描述:akka应用就是一群actor相 ...

  6. 关于如何提高SRAM存储器的新方法

    SRAM是当今处理器上最普遍的内存.当芯片制造商宣布他们已经成功地将更多的电路封装到芯片上时,通常是较小的晶体管引起了人们的注意.但是连接晶体管形成电路的互连也必须收缩.IMEC的研究人员提出了一个方 ...

  7. elasticsearch中保存时间格式

    利用logstash从文档中导入数据到es中,若未事先设定数据格式,有可能存储时间并未保存为date格式而是text格式. 时间若保存为text,则在会以字符串数组格式存储在es中,是乱序,不好查询. ...

  8. Java实现 洛谷 导弹拦截

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  9. Java实现 LeetCode 598 范围求和 II(最小值相乘)

    598. 范围求和 II 给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作. 操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义 ...

  10. Java实现蓝桥杯日志统计

    标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...