001---CBV和restful规范

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
  • 使用
    • 认证
      ```python
      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('更新小狗')

      ```

原文地址:https://www.cnblogs.com/xjmlove/p/10394796.html

时间: 2024-10-31 18:48:47

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

Django框架 --CBV源码分析、restful规范、restframework框架

一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view()) 2.as_view方法 as_view是一个类方法,实际上是一个闭包函数(内层函数包含对外层作用域的使用) 请求来了以后,调用as_view方法,调用函数中的view方法,view方法是调用了dispatch方法 @classonlymethod def as_view(cls, **initkwargs): def view(req

django中cbv源码和restful规范

1 django 请求声明周期 -先进入实现了wsgi协议的web服务器---->进入django--->中间件--->路由--->视图--->取模板,取数据,用数据渲染模板--->返回模板的字符串--->在浏览器上看到页面了 2 开发模式(前后端分离和前后端不分离) -前后端不分离项目 -前后端分离项目 前端和后端通过json格式数据交互 3 cbv 源码分析 -FBV和CBV -执行流程: -路由如果这么配置:url(r'^test/', views.Test

第一章 restframework——restful规范

第一章 restframework--restful规范 什么是restful(what): REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST与技术无关,代表的是一种软件架构风格,REST是Representation

lement-ui、接口、restful规范、drf

element-ui 安装 cnpm i element-ui -S 配置main.js import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); 使用:官方API https://element.eleme.cn/#/zh-CN/component/installation <!--案例--> <el-row> <el-butto

RESTful规范和DRF

RESTful规范 REST风格 资源 网页中能看到的都是资源 URI 统一资源标识符 URL 统一资源定位符 统一资源接口 对资源的操作根据HTTP请求方式的不同来进行不同的操作 遵循HTTP请求方式的语义 前后端传输的是资源的表述 展现的是资源的状态 凡是遵循REST风格实现的前后端交互都叫RESTful架构 核心思想 面向资源去编程, url中尽量用名词不要用动词 根据HTTP请求方式的不同对资源进行不同的操作 在url中体现的 体现版本 https://v3.bootcss.com/ h

restful规范与rest_framework

restful规范与rest_framework django两种开发模式: 一.前后端不分离项目 二.前后端分离项目 什么是restful规范? 在前后端不分离的项目中,网页所需要的数据可以直接通过模板渲染的方式传递到前端页面,并且可以很好的支持django自带的各种验证工具,比如csrfmiddleware 但在前后端分离的项目中,前后端的数据通信普遍通过json字符串的形式通信,那么我们就需要有个标准去定义前后端沟通方式或者说格式 restful就是来干这件事情的,它是一种面向资源的架构,

DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 [TOC] 一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆页面吧 login.html文件内容如下: <!DOCTYPE html> <html lang="en"> <head>

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

一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆页面吧 login.html文件内容如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</tit

Django restful 规范

一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为&qu