一、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. YII报错笔记:<pre>PHP Notice &#039;yii\base\ErrorException&#039; with message &#039;Uninitialized string offset: 0&#039; in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778

    YII常见报错笔记 报错返回的代码如下: <pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized str ...

  2. Jasper_crosstab_headerPosition_columngroup header position config - (headerPosition="Stretch")

    i.e <columnGroup name="column11" height="20" totalPosition="Start" ...

  3. solr亿万级索引优化实践-自动生成UUID

    solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09        本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的 ...

  4. 洛谷 P2483 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  5. CSS声明各个浏览器私有属性的命名前缀

    -moz代表firefox浏览器私有属性-ms代表IE浏览器私有属性-webkit代表chrome.safari私有属性-o代表opera私有属性

  6. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...

  7. poj1595 水题

    题意:输入n, 和c  统计1 - n 有多少个素数为cnt 若 2*c > cnt 则将素数全部输出 否则分支判断:  若cnt 为偶数,则从中心开始输出2*c 个  若cnt 为奇数,则从中 ...

  8. 激活 IDEA, PyCharm

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  9. WPF使用附加属性绑定,解决data grid列绑定不上的问题

    背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...

  10. HTTP协议详解-基础知识

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.绝大多数的Web开发,都是构建在HTTP协议之上的Web应用. HTTP协议的主要特点可概括如下: 简单: ...