写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的路径时附带版本号,例如“example.v1124.css”,然后再在request请求中祛除掉版本号。为什么要这么做呢?因为这样做的话在前端输出静态文件的路径就会加上就会加上版本号,这样当开发出新的静态文件的时候,客户端就会强制刷新本地的缓存,为了达到这个目的就要首先要在settings文件中配置,这样就可以每次修改的时候直接从settings读取版本号了,下面是大致的处理流程,各位自己感受一下吧~

好了,那么我们就开始一步步的完成吧~首先在settings文件中定义好一个版本号的变量。

#Static file version number
STATIC_VERSION = 'v1124'

然后就是在你要使用版本号的app中的views文件中取到这个变量并赋值给需要渲染的模板中了。

#要想在settings文件中取到变量就要先导入模块
from django.conf import settings #在settings配置文件中取得静态文件版本号
version = settings.STATIC_VERSION #下面这个函数是例子.....
def index(request):
template = loader.get_template('base/base_index.html')
#将取得的静态文件版本号传入到模板中
context = Context({'version':version})
return HttpResponse(template.render(context))

这样就可以在HTML文件中这样写静态文件路径了。

<link rel="stylesheet" type="text/css" href="/youappname/static/css/css.{{version}}.css">
<script language="javascript" type="text/javascript" src="/youappname/static/js/script.{{version}}.js"></script>

到这一步,当你打开浏览器后台的时候你就会发现你的路径就会改变了,但是这个时候当你再刷新的时候就会出现静态文件找不到的问题了,为什么会这样呢?因为这个时候的浏览器会继续按照新的路径去请求静态文件,但是你会发现你静态文件的物理地址其实是没有改变过的,所以这时候你请求的是新的地址,自然也就取不到了,那么我们该怎么办呢?

下面就是我们的主角Middleware出场了!那什么是Middleware呢?文档上说是中间件,可能不好理解,那么其实就是Javaweb框架中Struts2中的拦截器,无论是作用还是原理都是如出一辙的,那么这样一等价的话就很好理解Django中的Middleware了,既然是拦截器那么能做的就不仅仅是过滤一个静态文件版本号这么简单咯,查看了文档之后发现它还有很多很多实用的功能,那么都能哪些方法呢?

process_request  接受request之后确定所执行的view之前

process_view  确定了所要执行的view之后 view真正执行之前

process_response   view 执行之后

process_exception(self, request, exception)  view抛出异常

通过我们继承实现上面的一个或者多个方法就可以实现我们想要的功能了,那么它的处理流程呢?自然也是和拦截器一样了。

为什么要注意这个处理流程呢?因为这个流程会影响我们在settings文件中配置我们自己的Middleware顺序,其实在settings文件中我们的配置顺序就是它执行的顺序了,那么说到底该如何安装Middleware呢?

首先我们先要在settings文件中配置好我们的Middleware文件路径

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
#下面的这个地址就是我们自己的中间件文件了
'youappname.pyname.calssname',
)

这样我们就已经安装好了自己的中间件了,那下面就可以拦截下所有的request请求了,现在我们该在中间件中处理我们的业务逻辑了

#coding=utf-8
import urllib,pdb,re
from django.template import RequestContext
from django.shortcuts import render_to_response class middlewareVersion(object):
def process_request(self, request):
#判断如果url请求中有今天文件的请求,那么就拦截下来
if request.path_info.startswith('/youappname/static/'):
#得到path路径,使用正则表达式将版本号过滤掉
request.path_info = re.sub(r'\.v\d+','',request.path_info)

因为我的版本号是以v开头,后面是数字,所以用正则将这样的字符串替换成空。

现在按照之前流程图里面的我们是不是就完成了呢?显然不是嘛~仅仅这样做的话你会发现你的Middleware并没有起作用,我们用pdb断点调试发现,其实我们并没有捕获到静态文件的request请求,为什么会这样呢?因为是一个系统app捣的鬼!

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
#就是下面的这个app
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)

如果我们没有额外配置static路径的话,系统会默认将所有静态文件的请求发给staticfiles来处理,所以我们要将这个app静止掉,这样就可以完美的接收请求了,鉴于我百度了很多方法都没有给出路由文件的配置方法,这样会导致结果会不正确,所以我就把路由中的配置方法贴出来了。

static_dir = os.path.join(os.path.dirname(__file__),'../youappname/static')

urlpatterns += patterns('',
(r'^youappname/static/(?P<path>.*)$','django.views.static.serve',{'document_root':static_dir}),
)

这样就应该不会再出现什么大的问题了。完美收官!!!

今天的工作繁琐而又多,为了实现这个小功能我也是看了又看试了又试,果然英语不好真是硬伤额T.T…..今晚就到这了,下次有机会再写一些其他小功能吧。

Django分析之Middleware中间件的更多相关文章

  1. Django中的MiddleWare中间件

    1. middleware简介 Django的middleware的概念相当于SSH框架里面的filter的概念.中间键的作用就是对所有的request,在request前,和在response后做一 ...

  2. Django中Middleware中间件

    Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...

  3. Django middleware (中间件)

    关于中间价: django 中的中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings中,有一个 MIDDLE ...

  4. Django 分析(一)Requst、Middleware 和 Response 数据流

    0. 前言 通过 Django 编写 HTTP 接口时,我们需要指定 URL.Model 和 Views 函数(或者指定 RESTBaseView 对象解析参数和编写逻辑) 编写逻辑时的基本思路就是解 ...

  5. Django分析之国际化处理

    最近在公司终于开始做web开发了,本以为会是简单的首页之类的小规模项目,结果上来就是一个处理大数据分析的项目,一个关于油品分析的系统,不过我接到的第一个任务是做这个网站的国际化处理,虽然项目还没有上线 ...

  6. Django组件——分页器和中间件

    分页器 Django内置分页器(paginator) 分页器函数为paginator,里面有几个重要的参数需要我们了解 paginator = Paginator(book_list, 10) #第二 ...

  7. Django组件之Middleware

    一.中间件 在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件. MIDDLEWARE = [ 'django.middleware.security. ...

  8. django数据库操作和中间件

    数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...

  9. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

随机推荐

  1. C++ GC

    http://www.codeproject.com/Articles/912/A-garbage-collection-framework-for-C http://www.codeproject. ...

  2. centos 7.1 apache 源码编译安装

    Apache编译安装 一,需要软件: http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mi ...

  3. 数据库性能优化常用sql脚本总结

    最近闲来无事,正好抽出时间,来总结总结 sql性能优化方面的一下小技巧,小工具.虽然都是些很杂的东西,但是我个人觉得,如果真的清楚了里面的一下指标,或许真的能抵半个DBA. 有些时候,找不到DBA或者 ...

  4. HTML补充

    补充一: 让DIV 自动居中 width:980px;margin:0 auto; 补充二: 内敛标签: inline #块级标签转换成内联标签. block #变成块级. inline-block ...

  5. [NHibernate]立即加载

    目录 写在前面 文档与系列文章 立即加载 一个例子 总结 写在前面 上篇文章介绍了nhibernate延迟加载的相关内容,简单回顾一下延迟加载,就是需要的时候再去加载,需要的时候再向数据库发出sql指 ...

  6. [Java] jackson注解

    Jackson(http://jackson.codehaus.org)库是基于java语言的开源json格式解析工具.相对于javajson解析的其他库,诸如json-lib.gson包,Jacks ...

  7. 【总结1】PhpStorm配置XDebug(远程)调试PHP

    配置PhpStorm调试PHP 第一步:配置 XDebug 下载安装XDebug到本地环境,打开php.ini,参考配置如下: [XDebug] zend_extension = "D:\P ...

  8. 摄像头拍照,PHP输入流php://input的使用分析

    在做一个摄像头拍照然后上传的功能,php中使用php://input来获取内容.于是就了解了下php://input. 从官网信息来看,php://input是一个只读信息流,当请求方式是post的, ...

  9. 7.2WebApi2中的全局异常处理

    现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常.一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的.例如: 从控制器的构造函数引发的异常. 从消息处理程序引 ...

  10. dos 下删除文件、文件夹

    删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...