写了几周的脚本,今天终于开始接触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. <head>中<meta name="viewport" content="width=device-width,initical-scale=1"的作用>

    <meta name="viewport" content="width=device-width,initical-scale=1"的作用> co ...

  2. kindeditor在光标处插入编辑器外的数据

    页面 <div class="form-group clearfix"> <label class="control-label col-sm-3 co ...

  3. 兼容IE6的min-width、min-height

    如果一个站是宽屏的,你左右拖动浏览器的窗口网站宽度会随着窗口的大小而改变,而浏览器窗口宽度减小到一定程度后就会出现下边的滚动条,网站宽度就不会再减小了,我们知道这一简单的功能用css的min-widt ...

  4. ngnix 配置CI框架 与 CI的简单使用

    ngnix 支持 CI框架1.修改config.php 参考网址:https://www.chenyudong.com/archives/codeigniter-in-nginx-and-url-re ...

  5. 【Alpha版本】冲刺阶段——Day 1

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...

  6. jquery.validate.js插件使用

    jQuery验证控件jquery.validate.js使用说明+中文API 官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-valid ...

  7. HTTP API开发

    近期手上的安卓app需要用到自动更新的功能,想着怎么实现,看了下很多应用商店的sdk,觉得不太好,可能会收集用户隐私,于是想着自己实现一个http api后面自己可以实现自动更新,甚至广告推送的功能, ...

  8. java基础 集合类

    java集合类主要有以下集中: List结构的集合类: ArrayList类, LinkedList类, Vector类, Stack类 Map结构的集合类: HashMap类,Hashtable类 ...

  9. jquery-常用的运行函数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. C语言 链表排序

    #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct node{ in ...