一、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. github添加版本号

    1.将官方的库clone下来 http://github.com/xxx.xxx.git 2.修改要修改的地方 3.git add src 4.commit -m 'xxx'   5.git push ...

  2. springMVC-接收数据-参数绑定

    接收数据-参数绑定 #Method Arguments概观 Same in Spring WebFlux The table below shows supported controller meth ...

  3. python学习之结构语句

    一 循环语句: 1.1 for x in rang(n) :#rang(n)生成左闭右开区间的序列 1.2 while x 条件n: 二条件语句: if 条件表达式: elif 表达式: elif 表 ...

  4. tomcat启动时自动运行代码

    原文链接:http://jingpin.jikexueyuan.com/article/49660.html 作者: 一直向北 发布时间:2015-07-13 11:12:13 方法1:tomcat ...

  5. Git常用命令的使用方法

    推荐一个比较好的GIT的教学地址,廖雪峰老师的git教程! 这里简述Git常用命令的使用方法: 一.初始化git 右键进入 Git Bash 1.建立身份信息 git config --global ...

  6. mysql IF语句使用

    类似于三元运算符 1)  IF(where,result1,result2) = where?result1:result2 例如 SELECT IF(1=1,1,2)    =>  1 2)  ...

  7. 51nod 1526 分配笔名

    题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题. 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一 ...

  8. elastic-job lite 编程实战经验

    (继续贴一篇之前写的经验案例) elastic-job lite 编程实战经验 其实这是一次失败的项目,虽然最后还是做出来了,但是付出了很大代价.并且需要较深入的踩坑改造elastic-job,导致代 ...

  9. pytest生成测试报告

    生成JunitXML格式的测试报告    --junitxml=report\h.xml 生成result log 格式的测试报告     --resultlog=report\h.log 生成htm ...

  10. html5文本超过指定行数隐藏显示省略号

    这个很简单,直接贴代码就好了 HTML <span class="name">博客园是一个面向开发者的知识分享社区.自创建以来,博客园一直致力并专注于为开发者打造一个纯 ...