drf之框架基础
(一)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 3.在应用urls下分发路由 from django.conf.urls import url 4.定义模型类 (1)models.py中定义类 from django.db import models
class Book(models.Model):
title = models.CharField(max_length=64)
(2)数据库迁移 进入django的shell环境中:Tools----> run manage.py task 在shell环境中生成迁移文件:makemigrations。然后迁移:migrate 5.生成admin (1)在amin.py中注册并且导入模型 from django.contrib import admin (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之框架基础的更多相关文章
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
- Hibernatel框架基础使用
Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...
- Struts2框架基础
Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- 框架基础之Hibernate简介
框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...
- ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- Python云端系统开发入门——框架基础
Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...
- 如何基于Winform开发框架或混合框架基础上进行项目的快速开发
在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...
- PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类
一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...
随机推荐
- 初探Redis-基础类型List
Redis存在五种基础类型:字符串(String).列表(List).哈希(Hash).集合(Set).有序集合(Sorted Set).本次列举出List的常用操作. Redis官网:https:/ ...
- vue移动端转场动画
vue移动端转场动画 1.介绍:使用vue移动端做项目的时候,为了用户的体验良好,我们需要页面有一种进入和转出的效果 // 在App.vue根组件中 <template> <div ...
- Life In Changsha College - SQA计划和系统测试规程
一. SQA计划 (1) 对软件进行测试,保证软件不出问题: (2) 项目需要符合IEEE.ISO等软件工程标准 (3) 软件拥有基本的流程图.类图.数据流图等 (4) ...
- python3.7 64bit安装pygame1.9.3
https://blog.csdn.net/xiaolixi199311/article/details/79209506/
- [PHP动态]0001.关于 PHP 7 你必须知道的五件事
1.今年的计划表已出.PHP 7 时间表 RFC 投票一直通过, PHP 7 将在2015年10月发布.尽管有些延迟,但我们还是很高兴它在今年内发布.PHP 7 详细时间表由此查看. 2.PHP 要上 ...
- 初步理解 MySQL数据库
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1. 索引是做什么的? 索引用于快速找出在某个列中有一特定值的行.不使用索引,MYSQL必须从第1条记录 ...
- SpringMVC(三)Restful风格及实例、参数的转换
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Restful风格 1.Restful风格的介绍 Restful 一种软件架构风格.设计风格,而不是 ...
- Java实现 蓝桥杯VIP 算法训练 Hankson的趣味题
问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如 ...
- Java实现蓝桥杯3n+1问题
3n+1 [问题描述] 考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2:如果 n 是奇数,把它乘 3 加1.用新得到的值重复上述步骤,直到 n = 1 时停止.例如,n = ...
- Java实现 LeetCode 20 有效的括号
20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. ...
