一、django的FBV 和 CBV

1、FBV(基于函数的视图):

urlpatterns = [
url(r'^users/', views.users),
]
def users(request):
user_list = ["amy", "jack", "lily"]
return HttpResponse(json.dumps(user_list))

2、CBV(基于类的视图):

urlpatterns = [
url(r'^students/', views.StudentsView.as_view()),
]
from django.views import View
class StudentsView(View): def get(self, request, *args, **kwargs):
"""get方法访问"""
return HttpResponse("get") def post(self, request, *args, **kwargs):
"""post方法访问"""
return HttpResponse("post") def put(self, request, *args, **kwargs):
"""put方法访问"""
return HttpResponse("put") def delete(self, request, *args, **kwargs):
"""delete方法访问"""
return HttpResponse("delete")

3、CBV实现原理

dispatch()方法的实现相当于:

from django.views import View

class StudentsView(View):
def dispatch(self, request, *args, **kwargs):
func = getattr(self, request.method.lower()) # 通过反射获取请求方法(记得把获取到的方法名变成小写)
return func(request, *args, **kwargs) # 执行这个方法并将结果返回给用户

CBV就是通过路由,执行view()函数,再通过dispatch()方法基于反射,根据不同的请求方式来执行这些请求方法,如get、post、patch等。

若是继承父类的dispatch方法:

class StudentsView(View):
def dispatch(self, request, *args, **kwargs):
# 继承父类的dispatch方法
return super(StudentsView, self).dispatch(request, *args, **kwargs)

4、多个类继承基类

多个类公用的功能可以用继承来实现:

from django.views import View

class MyBaseView(object):
def dispatch(self, request, *args, **kwargs):
# 继承父类的dispatch方法
return super(MyBaseView, self).dispatch(request, *args, **kwargs) class StudentsView(MyBaseView, View): def get(self, request, *args, **kwargs):
"""get方法访问"""
return HttpResponse("get") def post(self, request, *args, **kwargs):
"""post方法访问"""
return HttpResponse("post") def put(self, request, *args, **kwargs):
"""put方法访问"""
return HttpResponse("put") def delete(self, request, *args, **kwargs):
"""delete方法访问"""
return HttpResponse("delete") class TeachersView(MyBaseView, View): def get(self, request, *args, **kwargs):
"""get方法访问"""
return HttpResponse("get") def post(self, request, *args, **kwargs):
"""post方法访问"""
return HttpResponse("post") def put(self, request, *args, **kwargs):
"""put方法访问"""
return HttpResponse("put") def delete(self, request, *args, **kwargs):
"""delete方法访问"""
return HttpResponse("delete")

5、CBV的csrf认证

方法1:给dispatch()方法加上装饰器,即可让该视图免于csrftoken认证:

import json
from django.shortcuts import render, HttpResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator class StudentsView(View): @method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(StudentsView, self).dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs):
"""get方法访问"""
return HttpResponse("get") def post(self, request, *args, **kwargs):
"""post方法访问"""
return HttpResponse("post") def put(self, request, *args, **kwargs):
"""put方法访问"""
return HttpResponse("put") def delete(self, request, *args, **kwargs):
"""delete方法访问"""
return HttpResponse("delete")

方法2:给类加上装饰器,使得该视图免于csrftoken认证:

from django.shortcuts import render, HttpResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name="dispatch")
class StudentsView(View): def get(self, request, *args, **kwargs):
"""get方法访问"""
return HttpResponse("get") def post(self, request, *args, **kwargs):
"""post方法访问"""
return HttpResponse("post") def put(self, request, *args, **kwargs):
"""put方法访问"""
return HttpResponse("put") def delete(self, request, *args, **kwargs):
"""delete方法访问"""
return HttpResponse("delete")

二、基于Django实现restful api

1、例:订单的增删改查

对于普通的接口开发:

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^get_order/', views.get_order),
url(r'^del_order/', views.del_order),
url(r'^add_order/', views.add_order),
url(r'^update_order/', views.update_order),
]
from django.shortcuts import render, HttpResponse

def get_order(request):
return HttpResponse("get_order") def del_order(request):
return HttpResponse("del_order") def update_order(request):
return HttpResponse("update_order") def add_order(request):
return HttpResponse("add_order")

这种方式在url比较多的情况下并不实用,所以我们引出了restful规范,根据请求方式的不同来进行不同的操作:

  get请求→查询

  post请求→创建

  delete请求→删除

  put请求→更新

(1)基于FBV的写法:

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^order/', views.order),
]
from django.shortcuts import render, HttpResponse
from django.views.decorators.csrf import csrf_exempt @csrf_exempt
def order(request):
if request.method == "GET":
return HttpResponse("查询订单")
elif request.method == "POST":
return HttpResponse("创建订单")
elif request.method == "DELETE":
return HttpResponse("删除订单")
elif request.method == "PUT":
return HttpResponse("更新订单")

(2)基于CBV的写法:

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^order/', views.OrderView.as_view()),
]
from django.shortcuts import render, HttpResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name="dispatch")
class OrderView(View):
def get(self, request, *args, **kwargs):
return HttpResponse("查询订单") def post(self, request, *args, **kwargs):
return HttpResponse("创建订单") def delete(self, request, *args, **kwargs):
return HttpResponse("删除订单") def put(self, request, *args, **kwargs):
return HttpResponse("更新订单")

三、RESTful协议

REST与技术无关,它代表的是一种面向资源软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”。

1、API与用户的通信协议,总是使用https协议

2、域名

要让别人看到这个URL就知道这是一个网站,还是一个要返回数据的接口

  • 子域名的方式(存在跨域问题)
www.baidu.com  # 用户访问这个
api.baidu,com # 返回json数据
  • URL方式
www.baidu.com  # 用户访问这个
www.baidu,com/aip/ # 返回json数据

3、版本

在URL上应该体现版本,例如Bootstrap,有https://v2.bootcss.com/,有https://v3.bootcss.com/等。

  • 加到URL上:https://www.baidu.com/api/v1/
  • 加到请求头上(跨域时,会引发多次请求)

4、路径

将网络上的一切东西都看作资源,建议尽量将URL的后缀使用名词表示(也可以用复数):

  https://www.baidu.com/api/v1/user/

  https://www.baidu.com/api/v1/users/

5、method

根据不同类型的请求来做不同的操作。

  • GET   从服务器取出资源(一项或多项)
  • POST  在服务器新建一个资源
  • PUT    在服务器更新资源(客户端提供改变后的完整资源,全部更新)
  • PATCH  在服务器更新资源(客户端提供改变后的属性,局部更新)
  • DELETE  从服务器删除资源

6、过滤

在URL上面加条件

https://www.baidu.com/api/v1/user/?status=1&page=2  # 表示status=1的、第2页的用户

7、状态码

建议在响应中添加状态码

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

常见状态码

例:

8、错误处理

比如进行登录操作,如果用户名或者密码错误,就会给用户返回一个错误信息。

状态码为4xx时,应返回错误信息:

{
   code: 1001,
error: "Invalid API key"
}

9、返回结果

根据不同的操作,返回不同的结果:

GET /order/:返回所有订单列表(数组)
GET /order/1/:返回单个订单的详细信息(资源对象)
POST /order/:返回新生成的订单
PUT /order/1/:返回修改后完整的订单信息
PATCH /order/1/:返回修改后的订单信息(局部)
DELETE /oder/1/:删除订单 返回一个空文档

常用规范示例

10、Hypermedia API

在返回结果中提供链接,连向其他API方法,使得用户不用查文档,通过这个链接来获取数据

四、Django rest framework框架

1、安装

pip3 install djangorestframework

2、Django rest framework认证源码及实现

rest_framework的dispatch方法:

如何获取加工后的request的值:

到这个加工过的Request里面去看看user都干了些什么:

实现认证:

可以自定制认证类:

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^course/', views.CourseView.as_view()),
]

urls.py

from django.shortcuts import render, HttpResponse
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from rest_framework.views import APIView
from rest_framework.authentication import BasicAuthentication
from rest_framework import exceptions class MyAuthentication(object):
"""自定制认证""" def authenticate(self, request):
# 去请求里面获取信息,到数据库中进行校验,如果校验失败就抛出异常
token = request._request.GET.get("token")
if not token:
raise exceptions.AuthenticationFailed("用户认证失败")
return ("amy", None) def authenticate_header(self, val):
pass @method_decorator(csrf_exempt, name="dispatch")
class CourseView(APIView):
authentication_classes = [MyAuthentication] # 使用自定义的 authentication_classes def get(self, request, *args, **kwargs):
print(request.user) # 打印 amy
return HttpResponse("查询课程") def post(self, request, *args, **kwargs):
return HttpResponse("创建课程") def delete(self, request, *args, **kwargs):
return HttpResponse("删除课程") def put(self, request, *args, **kwargs):
return HttpResponse("更新课程")

views.py

django的rest framework框架——安装及基本使用的更多相关文章

  1. Django之Rest Framework框架

    一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...

  2. play framework 框架安装及myeclipse 导入项目

    下载 play framework 框架. 解压你你要解压的目录 E:\play-1.2.7 相对其他的WEB框架.play的配置是相当简单的.没有那么多配置文件的搞法.上手比较快,就是相关的资料比较 ...

  3. django的rest framework框架——分页、视图、路由、渲染器

    一.rest framework的分页 1.使用rest framework内置类PageNumberPagination实现分类 from django.conf.urls import url f ...

  4. django的rest framework框架——版本、解析器、序列化

    一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...

  5. django的rest framework框架——认证、权限、节流控制

    一.登录认证示例 模拟用户登录,获取token,当用户访问订单或用户中心时,判断用户携带正确的token,则允许查看订单和用户信息,否则抛出异常: from django.conf.urls impo ...

  6. 基于Django的Rest Framework框架的解析器

    本文目录 一 解析器的作用 二 全局使用解析器 三 局部使用解析器 四 源码分析 回到目录 一 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有appli ...

  7. 基于Django的Rest Framework框架的认证组件

    0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py   ...

  8. 基于Django的Rest Framework框架的url控制器

    本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...

  9. 基于Django的Rest Framework框架的版本控制

    本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 from rest_framework.v ...

随机推荐

  1. 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了 ...

  2. C#连接Oracle中文乱码问题解决方法

    1.打开注册表:开始-运行-regedit       HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/OLEDB    在右侧点鼠标右键- ...

  3. springMVC 与 struts+hibernate+spring优缺点

    springMVC: Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和POI.Spring M ...

  4. Java编程基础-字符串

    在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...

  5. Android 面试总结~~~

    一.面试中的问题 通过这几天的面试,总结了自己在面试过程中问到的问题,部分问题已经给出了答案,还有部分问题,还未有时间整理出来. ListView出现闪图.图片错乱原因解决方案 函数式编程 (Lamb ...

  6. Linux自带-系统级性能分析工具 — Perf(转)

    https://blog.csdn.net/zhangskd/article/details/37902159/

  7. Yslow使用方法

    Yslow是雅虎开发的基于网页性能分析浏览器插件,从年初我使用了YSlow后,改变了博客模板大量冗余代码,不仅提升了网页的打开速度,这款插件还帮助我分析了不少其他网站的代码,之前我还特意写了提高网站速 ...

  8. iOS 如何解决并发请求时,只接受最后一个请求返回的结果

      大致意思是 虽然NSOperation 的cancel 并不能取消请求,但是可以对这个NSOperation进行标记. 当cancel 属性是YES时,表明 NSOperation虽然已经执行,并 ...

  9. 雨林木风ghost win7 64位快速装机版V2016年

    雨林木风ghost win7 64位快速装机版V2016年2月 系统下载:http://www.xitongma.com 系统概述 雨林木风ghost win7 64位旗舰装机版自动无人值守安装,采用 ...

  10. 测试ReplicaSets读写分离和故障转移

    读写分离实现步骤: 从库能够进行查询就更好了,这样可以分担主库的大量的查询请求. 1) 先向主库中插入一条测试数据 rs1:PRIMARY> db.c1.insert({age:30});db. ...