一、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. 异步加载js文件的方法

    # 异步加载js文件 - js的加载默认是同步的,因为js是单线程执行,只能完成一件再执行下一件. - 一些外部引入的js文件可以因为文件太大,在加载资源的过程中会影响dom元素的加载,影响了用户体验 ...

  2. 如何使用fastJson来解析JSON格式数据和生成JSON格式数据

    由于项目用到了JSON格式的数据,在网上搜索到了阿里的fastjson比较好用,特此记录fastjson用法,以备以后查询之用. decode: 首先创建一个JSON解析类: public class ...

  3. Railroad UVALive - 4888 记忆化搜索

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)

    不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上.     其实大家安装的jdk路径下,这 ...

  5. 基于.NET网页开发的工作,需要掌握的知识点

    学习计划对于程序员来说尤为重要,我最近根据自己的职业规划和招聘网站上对于基于.NET网页开发工作所需要的技能做出了一个总结,这个总结的内容也将是自己最近一年的知识补充和学习的方向,各位园友也可以把它作 ...

  6. 五、UML类图和六大原则-----《大话设计模式》

    一.单一职责原则     就一个类而言,应该仅有一个引起它变化的原因.     如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力.这种耦合 ...

  7. CSS 布局说——可能是最全的

    前言 现在,我们被称为前端工程师.然而,早年给我们的称呼却是页面仔.或许是职责越来越大,整体的前端井喷式的发展,使我们只关注了js,而疏远了css和html. 其实,我们可能经常在聊组件化,咋地咋地. ...

  8. CSS3 基本要素概览

    这篇文章将对 CSS 的几个新属性 (text-shadow,box-shadow,and border-radius) 做基本介绍.这些 CSS3 属性通常用来加强页面布局.  RGBA  前面的 ...

  9. MySQL常用命令和语句

    1.常用SQL语句 1)常用函数/*type可取值为:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUT ...

  10. codevs 3129 奶牛代理商IX

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题目描述 Description 小X从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售质优价廉的“ ...