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. 在FPGA中何时用组合逻辑或时序逻辑

    在设计FPGA时,大多数采用Verilog HDL或者VHDL语言进行设计(本文重点以verilog来做介绍).设计的电路都是利用FPGA内部的LUT和触发器等效出来的电路. 数字逻辑电路分为组合逻辑 ...

  2. MacOS Endnote修改引用样式和文献序号样式方法

    目录 1. 打开Endnote的Style Manager 2. 修改文献序号样式"1."" -> [1]" 3. 修改引用样式为上标形式 1. 打开En ...

  3. Mysql5.7 Linux编译安装教程

    1.系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/usr/local/mysql 数据库保存位置:/usr/local/mysql/data 日志保存位置:/tm ...

  4. linux网络管理及常用网络工具详解

    linux网络管理及常用网络工具详解 目录 linux网络管理及常用网络工具详解 1. linux网络管理 1.1 centos网卡命名规则 1.2 域名解析配置文件 1.3 ifconfig命令管理 ...

  5. HTTP 结构概述

    Web 客户端和服务器 Web 内容都是存储在 Web 服务器上的,Web 服务器所使用的是 HTTP 协议,因此经常被称为 HTTP 服务器,HTTP 服务器存储了因特网的数据.客户端向服务器发送 ...

  6. vue2组件封装示例

    组件封装注意事项: 1.props:属性.是父容器给子组件参数传递的桥梁 2.this.$emit:事件.子组件通知父容器事件发生,并给父容器传递数据和参数 3.子组件中经常要用watch监控数据变化 ...

  7. Linux环境下:程序的链接, 装载和库[动态链接]

    静态链接库在程序编译阶段就完成了链接工作,完成链接后,依赖的库就都打入了可执行文件中,所以文件大小一般会比较大. 而动态库链接库是在程序运行时才被链接的,所以磁盘上只要保留一份副本,因此节约了磁盘空间 ...

  8. docker之企业级镜像仓库Harbor

    Harbor概述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的 企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管 ...

  9. webapi动态创建后台任务(使用排队的后台任务)

    很多时候我们都会使用后台定时任务,但有些任务不需要定时执行,只需要请求到来时执行一次,比如请求服务器到某个地方同步数据,但请求不需要等数据同步完成再响应.这时候就可以使用排队的后台任务. 基本原理是用 ...

  10. android studio 安装与配置

    android  studio  下载地址:http://www.android-studio.org/ 找一个存储空间,我在D盘上,建好如下目录 : 找到刚才在载的文件    android-stu ...