Django中间件(Middleware)

  • 中间件,顾名思义,就是处在中间的一些软件。比如匹配到了URL,但是还没有执行view函数的时候,这个时候可以执行一些代码,这个代码就是中间件。
  • HttpRequest  一(中间件)一> View 一(中间件)一> HttpResponse
对Django自带的中间件进行详细解释:
django.middleware.security.SecurityMiddleware:
一些安全设置,比如XSS脚本过滤。
django.contrib.sessions.middleware.SessionMiddleware:session
支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。
django.middleware.common.CommonMiddleware:
通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理成/blog/111/自动加上反斜杠。
django.middleware.csrf.CsrfViewMiddleware:
跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。
django.contrib.auth.middleware.AuthenticationMiddleware:
用户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可以在view中通过request访问user。
django.contrib.messages.middleware.MessageMiddleware:
消息中间件。展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要,可以把这两个都删除。
django.middleware.clickjacking.XFrameOptionsMiddleware:
防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。 中间件的执行顺序
在调用视图前,settings中配置的MIDDLEWARE数组顺序执行
在调用视图后,中间件会按相反的顺序

自定义中间件格式

名字必须是 XxxxMiddleware

在settings配置路径MIDDLEWARE=[]

class TestMiddleware(object):
''' 自定义中间件 '''
def __init__(self, get_response):
self.get_response = get_response # 是View的function def __call__(self, request):
# 请求之前的处理代码 response = self.get_response(request) # 执行View请求 # 请求之后的处理代码 return response # 需要返回response对象

另一种写法:

class Test1Middleware(MiddlewareMixin): # 继承Middleware相当于上面的标准写法
''' 自定义中间件 '''
   pass
  • 在调用视图前,他有以下函数
    • process_view(request, view_func, view_args, view_kwargs): return None or HttpResponse
      • 在函数为你执行view视图前调用的方法
  •    def process_veiw(self, request, view_func, view_args, view_kwargs):
    """
    @request, 当前请求对象
    @view_func, 就是我们需要执行的view_func方法,
    @view_args, 就是我们的view_func所带的位置参数
    @view_kwargs, 就是我们的view_func所带的键值参数
    """
    print u'process_veiw方法,在执行View之前执行' # 这个方法如果返回的是一个response, 它就提前结束请求
    response = view_func(request, *view_args, **view_kwargs)
    return request
  • 调用视图之后
    • process_template_response(request, response) return 的结果实现了render方法的HttpResponse
      • 如果需要调用这个函数,view视图返回的response对象必须包含render方法(SimpleTemplateResponse, TemplateResponse
        )包含了render方法。而不是view直接render,一般该函数做模版内容处理
    •     def process_template_response(self, request, response):
      # 这个方法必须返回的response对象拥有render函数才会调用
      # from django.template.response import SimpleTemplateResponse, TemplateResponse
      # 这个中间件会在render方法之前调用中间件(view调用后且并没有直接渲染页面才会被调用,如果view返回render方法,则它是已经渲染完毕,该中间件则不能被调用。
      view可以用TemplateResponse, SimpleTemplateResponse代替render)
      # 也就是渲染html之前调用
      print u"执行process_template_response"
      return response
    • process_exception(request, exception): return None or HttpResponse
      • 该请求在报出异常时,执行该方法
    •     def process_exception(self, request, exception):
      # 这个异常必须是在执行view get中出现的异常,它才能进入
      # 这里的异常是指代码出现错误,403,500错误不代表代码出现异常
      print u"---- exception ----"

中间件开发准则

    • 中间件的类不能是任何类的子类。
    • 中间件可以存在于你Python 路径中的任何位置。 Django所关心的只是被包含在MIDDLEWARE中的配置。
    • 将Django 中可用的中间件作为例子随便看看。https://docs.djangoproject.com/en/1.11/ref/middleware/
    • 如果你认为你写的中间件组建可能会对其他人有用,那就把它共享到社区! 让我们知道它,我们会考虑把它添加到Django中
    • 中间件一般是实现一个系统级别的应用或者面向整个工程应用,所以一般情况下,中间件不能有业务代码

流量统计

中简件:

class StatFlowMiddleware(object):
""" 流量统计 """
def __init__(self, get_response):
self.get_response = get_response
self.count = {} def __call__(self, request):
if request.META.has_key("HTTP_X_FORWARDED_FOR"):
ip = request.META["HTTP_X_FORWARDED_FOR"]
else:
ip = request.META["REMOTE_ADDR"] response = self.get_response(request) stats = cache.get_or_set("stats", {})
count = 0
count += 1 # 次数没统计 只统计了一次 怎么解决?
if not stats.get(ip):
stats[ip] = [time.time(), count] # 设置时间戳,计算某段时间的流量
cache.set("stats",stats,60) return response

view

class StatFlowMiddleware(View):
"""
显示一分钟的流量
from django.core.cache import cache
"""
def get(self, request):
stats = cache.get('stats')
if stats:
current_time = time.time()
curr_ips = [k for k, v in stats.items() if int(v[0])-current_time < 60]
count = []
for ip in curr_ips:
count.append(stats[ip][1])
else:
curr_ips=[]
count=[]
return render(request, "stats_flow.html", locals())

html

<body>
访问IP:{{ curr_ips }}
访问次数:{{ count }}
</body>

django-中间件,流量统计实例的更多相关文章

  1. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  2. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  3. Django中间件加载原理

    假设我们有如下中间件: setting.py文件 MIDDLEWARE = [ 'django.middleware.A', 'django.middleware.B', 'django.middle ...

  4. cookie和session django中间件

    目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...

  5. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  6. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

  7. Django中间件(Middleware)处理请求

    关注公众号"轻松学编程"了解更多. 1.面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码 在不修改原有代码的情况下,动态注入一部分代码 默认情况,不中断传播 ...

  8. iOS 网络流量统计

    在开发中,有时候需要获取流量统计信息.研究发现:通过函数getifaddrs来得到系统网络接口的信息,网络接口的信息,包含在if_data字段中, 有很多信息, 但我现在只关心ifi_ibytes,  ...

  9. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

随机推荐

  1. JAVA技术分享:消失的线程

    很多小伙伴都问过我一个问题,就是任务线程跑着跑着消失了,而且没有任何异常日志.我都是条件反射式的回复,是不是用了线程池的submit提交任务.而且很大几率对方给予肯定答复. 解决方案,很多人都听过不少 ...

  2. 关联规则&Apriori算法

    2017-12-02 14:27:18 一.术语 Items:项,简记I Transaction:所有项的一个非空子集,简记T Dataset:Transaction的一个集合,简记D 关联规则: 一 ...

  3. c# 如何调用python脚本

    1.net4.5: http://www.jb51.net/article/84418.htm 2.net4.0: https://www.cnblogs.com/shiyingzheng/p/605 ...

  4. java中进行四舍五入

    在oracle中有一个很好的函数进行四舍五入,round(), select round(111112.23248987,6) from dual; 但是java的Number本身不提供四舍五入的方法 ...

  5. 转载:【Oracle 集群】RAC知识图文详细教程(九)--RAC基本测试与使用

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  6. Relation.js——基于pixi.js的拓展模块之人物关系图谱

    出于[重构基于D3的关系图谱项目]的目的,在看完pixi.js之后,并且网上又没有现成的基于webgl的关系图谱js库,于是,本人决定自己写一个. 因为平常要工作的原因,进度可能有点慢,但是githu ...

  7. 二叉树的前序、中序、后序遍历 python

    话不多说,直接上代码 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None cl ...

  8. 《次元唤醒 需求规格说明书v1.0》

    一.团队分工 组员 工作比例 参与范围 王诚荣 17% 原型设计,需求规格说明书整合,LOGO设计 马祎特 22% PPT制作,演讲,博客模板,用户描述 陈斌 21% 评审表格制作,引言,项目描述,功 ...

  9. 最大流之dinic

    先用bfs预处理出层次图,然后在层次图上用dfs找增广路径,理论复杂度O(n*n*m) const int INF=0xfffffff ; struct node { int s,t,cap,nxt ...

  10. latex的使用

    要写论文了,要用到latex,总算明白了一些,在ubuntu下安装好texlive和texmaker后,在终端测试,输入命令tex: 出现上面的图说明安装好了. 在texmaker下编写tex文档,保 ...