CBV 和 restful规范

知识点准备:

django的view

  • FBV:基于函数的视图
  • CBV:基于类的视图
    urls.py
    
    from django.urls import path
    from app01.views import StudentsView urlpatterns = [
    path('students/ ',StudentsView.as_view()),
    ] views.py from django.views import View
    from django.shortcuts import HttpResponse class StudentsView(View): def get(self,request,*args,**kwargs):
    return HttpResponse('GET 请求') def post(self,request,*args,**kwargs):
    return HttpResponse('POST 请求')

csrf_token

  • 原理:基于中间件的process__view()做的,用户发送get请求的时候django会给他返回一个随机字符串,下次用户发送post请求的时候,要求携带这个随机字符串,验证是否一样,
  • 免除:csrf_exempt
  • 验证:csrf_protect
  • 为什么不写在process__request()里面?

    因为它中间件要判断视图函数有没有加免除或者验证的装饰器,如果在request里面,他无法获取哪些视图函数加了装饰器。
    # 第一种:给方法加
from django.views import View
from django.views.decorators.csrf import csrf_exempt, csrf_protect
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): print('GET')
return HttpResponse('GET请求') def post(self, request, *args, **kwargs):
return HttpResponse('POST请求') # 第二种:给类加
@method_decorator(csrf_exempt,name='dispatch')
class TeachersView(View): def get(self, request, *args, **kwargs):
print('GET')
return HttpResponse('GET请求') def post(self, request, *args, **kwargs):
return HttpResponse('POST请求')

CBV源码剖析

  • FBV 和 CBV

    基于反射实现根据请求方式不同,执行不同的方法

    原理:

    • 路由 cls.as_view()-->view()-->self.dispatch()-->反射
    • 视图:get post delete put……
    • 流程
       class StudentsView(View):
    
           def dispatch(self, request, *args, **kwargs):
    # return HttpResponse('dispath')
    func = getattr(self,request.method.lower())
    return func(request, *args, **kwargs) def get(self, request, *args, **kwargs):
    return HttpResponse('GET请求') def post(self, request, *args, **kwargs):
    return HttpResponse('POST请求') def delete(self,request,*args,**kwargs):
    return HttpResponse('DELETE请求') def put(self,request,*args,**kwargs):
    return HttpResponse('PUT请求')
    • 继承(多个类共用的功能,避免重复编写)
       class MyBaseView(object):
    def dispatch(self, request, *args, **kwargs):
    print('before')
    func = super(MyBaseView, self).dispatch(request, *args, **kwargs)
    print('after')
    return func class StudentsView(MyBaseView, View): def get(self, request, *args, **kwargs):
    print('GET')
    return HttpResponse('GET请求') def post(self, request, *args, **kwargs):
    return HttpResponse('POST请求') def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE请求') def put(self, request, *args, **kwargs):
    return HttpResponse('PUT请求')

restful规范

十条规范

  • API与用户的通信协议:https

  • 域名:

    • URL方式:www.abc.com/api/
    • 子域名方式(存在跨域问题) :www.abc.com www.api.abc.com
  • 版本:www.abc.com/api/v1/

  • 面向资源(视网络上的任何数据为资源,均使用名词、可复数):www.abc.com/api/v1/order/

  • 过滤,通过url传递搜索条件

  • 根据method不同进行不同的操作

  from django.urls import path
from app01.views import OrderView urlpatterns = [
path('order/',OrderView.as_view()),
] 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('更新订单')
  • 状态码
  • 错误处理
  • 返回结果
  • 返回结果中就是url

django rest_framework

  • 安装:pip install djangorestframework
  • 使用
    • 认证
          from rest_framework.views import APIView
      from rest_framework.exceptions import AuthenticationFailed class MyAuthentication(object): def authenticate(self, request): token = request._request.GET.get('token')
      # 可以做用户名密码验证
      if not token:
      raise AuthenticationFailed('认证失败')
      return (1, 2) def authenticate_header(self, request):
      pass class DogView(APIView):
      authentication_classes = [MyAuthentication] 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('更新小狗')

001---CBV和restful规范的更多相关文章

  1. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  2. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

  3. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  4. DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用

    CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()),  --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...

  5. Django框架(十八)—— CBV源码分析、restful规范、restframework框架

    目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...

  6. Restful规范-APIView源码分析

    目录 一.Restful规范 十条规范 二.drf的简单使用 三.APIView源码分析 CBV源码分析 APIView源码分析 一.Restful规范 Restful规范是一种web API接口的设 ...

  7. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

  8. restful 规范(建议)

    需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...

  9. django rest framework restful 规范

    内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...

随机推荐

  1. 乘风破浪:LeetCode真题_008_String to Integer (atoi)

    乘风破浪:LeetCode真题_008_String to Integer (atoi) 一.前言 将整型转换成字符串,或者将字符串转换成整型,是经常出现的,也是必要的,因此我们需要熟练的掌握,当然也 ...

  2. Asp.Net MVC Identity 2.2.1 使用技巧(八)

    一.添加管理链接 在View/Shared/_layout.cshtml,在页面导航上(28行)添加如下代码: @*通过身份验证并确认用户属于Admin角色显示管理菜单*@ @if (Request. ...

  3. Mysql进阶-day1

     Mysql数据库启动-关闭-登录-查看帮助 #单实例启动 1./etc/init.d/mysqld start 2.service mysqld start/restart 3./usr/local ...

  4. ETCD TLS 配置的坑

    一.环境准备 环境总共 3 台虚拟机,系统为centos7,1个 master,2 个 etcd 节点,master 同时也作为 node 负载 pod,在分发证书等阶段将在另外一台主机上执行,该主机 ...

  5. 深入浅出SharePoint2010——请假系统无代码篇之工作流设计

    使用SharePoint Designer 2010进行设计. 主要使用的Actions如下图所示. 关于权限,考虑到严谨的权限设计,所以所有参与人员均为Read权限. 关于请假天数的计算,请假天数的 ...

  6. Redis 拒绝连接

    1.本地防火墙是否关闭   2.服务器的防火墙是否关闭      检查方法:       service iptables status    查看防火墙状态   service iptables s ...

  7. UVA 10617 Again Palindrome 区间DP

    题目链接: https://cn.vjudge.net/problem/UVA-10617 题目大意: 问有几种删除字符的方法可以使得该字符串为回文. 解题思路: 删除字符得到回文串的方法数 等于 字 ...

  8. 「CF741DArpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths」

    题目 这题目名字怎么这么长 zky学长讲过的题 非常显然,就是重排之后能形成回文串的话,最多只能有一个字母出现奇数次 又发现这个字符集大小只有\(22\),于是套路的使用状压,把每一条边转化成一个二进 ...

  9. P2585 [ZJOI2006]三色二叉树

    题目描述 输入输出格式 输入格式: 输入文件名:TRO.IN 输入文件仅有一行,不超过500000个字符,表示一个二叉树序列. 输出格式: 输出文件名:TRO.OUT 输出文件也只有一行,包含两个数, ...

  10. Week7:SVM难点记录

    1.函数dataset3Params(),如何计算模型估计偏差的? model=svmTrain(X,y,c_array,@(x1,x2)gaussianKernel(x1,x2,sigma_arra ...