1. django模式

def users(request):
user_list = ['alex','oldboy']
return HttpResponse(json.dumps((user_list)))

FBV,function base view

路由:
url(r'^students/', views.StudentsView.as_view()),
视图: 通过发射来找到对应的方法去执行
from django.views import View
class StudentsView(View):
def get(self,request,*args,**kwargs):
return HttpResponse('GET') def post(self, request, *args, **kwargs):
return HttpResponse('POST') def put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

CBV,class base view

详谈cbv工作模式

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

原理

-- url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)

流程

class StudentsView(View):
def dispatch(self, request, *args, **kwargs):
print('before')
ret=super(StudentsView,self).dispatch(request,*args,**kwargs)
print('after')
return ret def get(self,request,*args,**kwargs):
return HttpResponse('GET') def post(self, request, *args, **kwargs):
return HttpResponse('POST') def put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

cbv执行父类的dispatch方法

2. 面向对象的继承

多个类共用的功能,为了避免重复编写

from django.views import View
最左原则
class MyBaseView(object):
def dispatch(self, request, *args, **kwargs):
print('before')
ret = super(MyBaseView, self).dispatch(request, *args, **kwargs)
print('after')
return ret 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 put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE') class TeachersView(MyBaseView, View):
def get(self, request, *args, **kwargs):
return HttpResponse('GET') def post(self, request, *args, **kwargs):
return HttpResponse('POST') def put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

继承父类的dispatch方法

3. 面向对象的封装

class File:
文件增删改查方法 Class DB:
数据库的方法

同一类方法封装到类中

class File:
def __init__(self,a1,a2):
self.a1 = a1
self.xxx = a2
def get:...
def delete:...
def update:...
def add:... obj1 = File(123,666) 将数据123,666 封装到对象中
obj2 = File(456,999)

数据封装到对象中

from django.test import TestCase

# Create your tests here.

## 封装示例

class Request(object):
def __init__(self,obj): # OBJ=对象B,AUTH的这个对象
self.obj = obj @property # 静态方法
def user(self): # REQ.USER执行这里,返回 self.obj.authticate() = self.B.authticat() = Auth.authticat() = 'JOKER'
return self.obj.authticate() class Auth(object):
def __init__(self,name,age): # NAME=JOKER,AGE=18
self.name = name
self.age = age def authticate(self):
return self.name # 返回类的属性NAME class APIView(object):
def dispatch(self): # 方法被执行
self.f2() # SELF就是这个类,调用F2() def f2(self): # 调用属性方法
b = Auth('joker',18) # 实例化Auth,得到对象B
req = Request(b) # 实例化Request,得到对象REQ
print(req.user) # obj = APIView() # 得到APIView实例化对象OBJ
obj.dispatch() # 调用属性方法

封装示例

4. django中间件

- process_request
- process_view
- process_response
- process_exception
- process_render_template

五种方法

中间件做过什么?

-权限  -登陆验证

4.1 django的csrf是如何实现?

1 a. 请求来,第一次来GET,不仅给你数据还给你一个大字符串,但是只能我自己反解,那你提交数据的时候要带着这个字符串
2 取消 MIDDLEWARE里面的注释,发送login登录时候,会有CSRFTOKEN的COOKIES
3 b. 无CSRF时存在隐患
4 所有网页都可以向你的网页提交数据
5 c. Form提交(CSRF)
6 {% csrf_token %}
7 d. Ajax提交(CSRF)
8 拿到请求头里面去,发送过去就可以了,CSRF请求头 X-CSRFToken

发生在,process_view方法,因为要检查函数是否被装饰器装饰
- 检查视图是否被 @csrf_exempt (免除csrf认证)
- 去请求体或cookie中获取token

请求时候会随机产生字符串,在访问的时候会携带这个随机字符串

4.2 针对django,fbv模式如何关闭验证

from django.views.decorators.csrf import csrf_exempt(无需验证),csrf_protect(需验证)

找到需要验证的函数,@csrf_exempt,@csrf_protect

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 该函数无需认证
def users(request):
user_list = ['alex', 'oldboy']
return HttpResponse(json.dumps((user_list)))

情况一,全局验证,该函数无需验证

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
] from django.views.decorators.csrf import csrf_protect @csrf_protect # 该函数需认证
def users(request):
user_list = ['alex', 'oldboy']
return HttpResponse(json.dumps((user_list)))

情况二,全局不验证,该函数需验证

4.3 针对django, cbv模式如何关闭验证

dispatch函数,或者方法,是通过反射来执行相对应的方法,控制它的验证或不验证

from django.views.decorators.csrf import csrf_exempt(无需验证),csrf_protect(需验证)
from django.utils.decorators import method_decorator

- @method_decorator(csrf_exempt)
- 在dispatch方法中(单独方法无效)

可以针对验证的函数去写,但是不能单独写,要写在@method_decorator里面

@method_decorator(csrf_exempt),@method_decorator(csrf_protect)

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') def put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

针对dispatch函数

可以针对类,然后指定类里面的方法去验证还是不验证,同样需要写在@method_decorator里面

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') # 无需验证
class StudentsView(View): def get(self, request, *args, **kwargs):
print('get方法')
return HttpResponse('GET') def post(self, request, *args, **kwargs):
return HttpResponse('POST') def put(self, request, *args, **kwargs):
return HttpResponse('PUT') def delete(self, request, *args, **kwargs):
return HttpResponse('DELETE')

针对dispatch方法

5. 总结

- cbv
- 本质,基于反射来实现
- 流程:路由,view,dispatch(反射)
- 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)

- csrf
- 基于中间件的process_view方法
- 装饰器给单独函数进行设置(认证或无需认证)

-urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^students/', views.StudentsView.as_view()), 点 as_view查看源码

]

class View(object):
"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
""" http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] def __init__(self, **kwargs):
"""
Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
"""
# Go through keyword arguments, and either save their values to our
# instance, or raise an error.
for key, value in six.iteritems(kwargs):
setattr(self, key, value) @classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key)) def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs # take name and docstring from class
update_wrapper(view, cls, updated=()) # and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

cbv反射源码

django请求周期

FBV          wsgi--中间件--路由--视图--模版--渲染--返回

CBV          wsgi--中间件--路由--dispatch

RESTFRAMEWORK    wsgi--中间件--路由--dispatch

p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }

Django-CBV和跨域请求伪造的更多相关文章

  1. Django框架 之 跨域请求伪造

    Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...

  2. spring-security中的csrf防御机制(跨域请求伪造)

    什么是csrf? csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点.CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社 ...

  3. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  4. Django之cfrs跨站请求伪造和xfs攻击

    跨站请求伪造 一.简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防 ...

  5. django的csrf跨站请求伪造

    1.什么是跨站请求伪造 请看图: 我们自行写了一个网站模仿中国银行,用户不知道是否是真的中国银行,并且提交了转账信息,生成一个form表单,向银行服务器发送转账请求,这个form表单和正规银行网站的f ...

  6. Django之CSRF 跨站请求伪造

    一.简介 1.点我了解什么是跨站请求伪造 2.django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对 ...

  7. Spring-Security+Freemarker 开启跨域请求伪造防护功能

         CSRF简介--摘抄自<Spring实战(第4版)> 我们可以回忆一下,当一个POST请求提交到"/spittles"上时,SpittleController ...

  8. Django添加防跨站请求伪造中间件

    第一步: 在全局设置中打开此中间件: MIDDLEWARE_CLASSES = [ ... 'django.middleware.csrf.CsrfViewMiddleware', ... ]     ...

  9. Django框架之跨站请求伪造

    跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在 ...

  10. 【Django】实现跨域请求

    目录 JsonP实现跨域 在Django中间件中添加响应头 @ *** CORS 即 Cross Origin Resource Sharing 跨域资源共享. 跨域请求分两种:简单请求.复杂请求. ...

随机推荐

  1. K8s集群中部署SpringCloud在线购物平台(三)

    五.SpringCloud概述 springcloud架构图 5.1 SpringCloud是什么? 官网: https://spring.io/projects/spring-cloud Sprin ...

  2. vue-router设置页面切换滑动效果的方法及解决遇到的坑

    先上gif:这里演示顺序是1232121 1.router.js中配置入口路由 {     path: '/',     redirect: '/index'   } 2.main.js中new vu ...

  3. Java 泛型,这次面试我表现很棒!

    public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryBy ...

  4. 手把手搭建WebSocket多人在线聊天室(SpringBoot+WebSocket)

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: https://www.callicoder.com/spring-boot-websocke ...

  5. 《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇

    1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的.重要的操作单独拿出来进行详细的介绍和讲解. 2.鼠标操作语法 鼠标操作介 ...

  6. 基于改进MFCC特征和卷积递归神经网络的心音分类

    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能 心音分类在心血管疾病的早期发现中起着至关重要的作用,特别是对于小型初级卫生保健诊所.尽管近年来心音分 ...

  7. vue安装tinyMCE

    目录 [参考视频] [参考文章] 官网: https://www.tiny.cloud/auth/signup/ 资源下载 tinymce 官方为 vue 项目提供了一个组件tinymce-vue n ...

  8. Golang 之 casbin(权限管理)

    目录 1. 权限管理 官网 编辑器测试 1.1.1. 特征 Casbin的作用 Casbin不执行的操作 1.1.2. 怎么运行的 1.1.3. 安装 1. 示例代码 xormadapter 2. 示 ...

  9. uniapp登录板块封装(旧接口getUserInfo)

    点击查看代码 // 授权并获取用户信息 const authorizeAndGetUserInfo = (loginRes) => { uni.getUserInfo({ success(res ...

  10. 开源低代码框架 ReZero API 正式版本发布 ,界面操作直接生成API

    一.ReZero简介 ReZero是一款.NET中间件 : 全网唯一界面操作就能生成API ,  可以集成到任何.NET6+ API项目,无破坏性,也可让非.NET用户使用exe文件 免费开源:MIT ...