准备进行的优化

提纲
  • 为什么选用django
  • 选择Jquery
  • Flex开发
  • 文件批量上传
  • 优化之路
[any material that should appear in print but not on the slide]为什么选用django
  • 之前一直使用asp.net做些web应用,因为课题的原因,遇见了python,接着就遇见了django,因为不满对.net的开发速度,决定试试django的敏捷开发,还有一个重要的原因是django让我很容易实现url重定向,就这一点让我决定使用django。
  • 由于研究方向的原因,只对c/c++熟悉,对java不熟悉,所以不采用java做web
  • 比较反感php的繁琐的语法,个人比较喜欢python干净的语法,所以放弃php
[any material that should appear in print but not on the slide]选择jquery
  • jquery资料多,这点是最关键的,因为这样学起来比较快
  • jquery的插件比较多,这样可以拿来主义,即使修改,也是比较简单的。
[any material that should appear in print but not on the slide]flex开发
  • flex是富互联网的产物,适当应用可以为网站增加不少眼球。
  • flex和django通信我采用的是pyamf,djangoamf也是不错的,并且其demo做的比pyamf要好,但配置起来比pyamf稍微麻烦,并且适用性不如pyamf,pyamf适合于flex和python做成的系统之间的通信。建议先看djangoamf的demo,然后再看pyamf。
  • 在实践中发现的问题:
    1.diango向flex传递数据,我采用的是json,但发现通过django的simplejson生成的json,flex无法识别,最后我只好写成列表嵌套字典的方式,flex才接收到数据。
    2.pyamf在django开发服务器和apche2+mod_python上很顺利,在nginx+fastcgi上,flex和django无法通信,大楷看了pyamf文档,pyamf适合兼容wsgi的桥接方式,最简单处理方式就是在apache2上只开通一个服务。
[any material that should appear in print but not on the slide]swfupload批量上传文件
  • 网站开通几天,用户就强烈建议开发批量上传,因为discuz做的批量上传是专利,自然不能随便使用了,只好自己开发
  • 原先的图片上传是ajax方式的,用ajaxfileupload这个组件
  • 好看簿的图片上传做的挺好的,但我不想再花时间学习flex了,并且我想上传完一个图片,就显示缩略图,就利用了swfupload
  • 原理:利用Flash选择文件后上传,通过Flash和JS交互,对整个过程进行控制——包括页面的DOM操作之类的,都可以通过JS来进行控制
  • 注意事项:
    1.swfupload没有django的demo,git上有一个,但太简单了,几乎没有参考意义,先把php和asp.net的看明白了,就差不多,网站上有几个demo,已经基本满足大多数场合应用了。
[any material that should appear in print but not on the slide]swfupload批量上传文件
  • 2.在后端处理上传的文件时,有一个地方要注意的是,filedata=request.FILES['Filedata'],获得的filedata对象,其属性content_type永远是application octet-stream(二进制流),而不是我们想得到的文件的真正属性,并且属性size也是无法获得的,这一点上我浪费了不少时间,还以为swfupload不适合django呢,后来反复摸索,知道,判断属性和大小在前端判断好,后端只能获得文件名和内容,文件名是根据filename=filedata.name来获得。
    3.在实践中发现,PIL处理动态gif时,会损失其动画信息,所以我们是需要判断其图片属性的,方法很简单:
    name=os.path.splitext(filename)
    exts=name[1],由于gif格式的图片都很小,所以直接生成图片,不需要处理就好了。
    4.这里介绍一个国人写的python的开源插件djshell,里面的对PIL的生成缩略图封装的挺好的。
[any material that should appear in print but not on the slide]google map应用
  • 刚开始使用,还没有太多要讲的,不知道在做的是否有精通的
[any material that should appear in print but not on the slide]我的优化过程
  • django开发速度快,但要注意的地方也是很多的,加上之前对这方面的经验不足,造成网站上线后出现了很多问题,在这里我按照优化过程给大家讲一下,同时抛砖引玉,希望大牛更够给与更多的指点
[any material that should appear in print but not on the slide]上线后前两天
  • 初始配置是:apahce2.2+mod_pyhton+mysql,测试两个月,没有发现任何问题,只因没有用测试工具,强烈建议上线前用ab测试一下。
  • 首先出现的问题是:没有改mysql的最大连接数,默认是500,可能是连接数太多,网站直接down掉,发现后,改为1000,用mysql admin软件实时观测,发现连接数接近10000,然后直接改为50000,先稳住再说。
  • 问题接着出现,CPU,内存很快达到100%,直接down,重启后依然,找了很多办法,都没有解决,最后直接重装系统,问题依旧,最后经闲云无心指点,发现了问题所在:我初期开发时,用的是django自带的服务器,静态文件时通过django处理,到apache2后,没有让apache2来处理静态文件,实在是一大失误,更改后,问题解决。
[any material that should appear in print but not on the slide]上线第三、四天
  • 用top命令查看服务器,发现apache2占内存比较严重,cpu也时不时的冒高,在mailist问了后,决定采用nginx+fastcgi的方式,由于对这一块不是很熟悉,所以也没有过多的配置优化,效果最明显就是内存利用率比apache2好了很多
  • 但问题来了,就是nginx不能够热启动,每次修改代码需要重启FastCGI,难道是高效率和便利性不可兼得?
[any material that should appear in print but not on the slide]上线第五、六天
  • 打开网页速度依然很慢,只好开始优化。
  • 关闭debug模式
  • 采用memcached作为缓存
  • 在nginx端开启gzip压缩功能,主要处理静态文件压缩,同时在django的settings文件里加上gzip的中间件
  • 更新语句直接裸写sql语句
[any material that should appear in print but not on the slide]继续优化(1)
  • 对有些数据,不要实时查询,而是让系统定时来运行,减少django运行的开支,比如论坛的十大,短时间内事不会变化的,那么就可以在crontab里定时执行,比如每五分钟执行一次,来查询十大帖子,然后存到数据库,django直接取出数据就行
  • 对于有外键的查询,要使用select_related,外网上介绍一次大查询要好于多次小的查询,但mailist也有人不同意其意见,我测试了,效果虽说不是很明显,但最好还是使用。
  • 同时如果一个model有大量的数据,可以采用1.1版本的defer和only,defer就是推迟取出数据,only是只取出想要的数据,但实践中发现,如果我只想去外键的一个数据,是取不出来的,比如,a.objects.select_related('b').only('b__d'),d是b的一个属性,我发现a.b.d是得不到数据的,我打印了sql语句,发现正常,就是取不出数据,很奇怪。
[any material that should appear in print but not on the slide]继续优化-mysql(2)
  • 复杂语句,最好用sql语句来写
  • 开启mysql的slow日志功能,查看慢查询,这一个是有效的,看哪个查询很慢,然后找出进行解决,找出问题所在后,最好关闭,以免影响mysql速度
  • 使用django-debug-bar,来查看sql查询时间和整个页面所需时间,从这个可以很明显观察到网站瓶颈所在。
  • 使用phpmyadmin,里面可以对mysql的状态进行实时分析,里面可以告诉你mysql应该开启多大的缓存为好。
[any material that should appear in print but not on the slide]继续优化-前台(3)
  • 用Firebug查看网页下载过程,查看请求数,无效连接
  • 去除css里的无效图片链接
  • 合并css和js文件,同时去除注释和压缩css和js文件
  • 对于有些在打开网页后才用到的js文件,建议放到body里,这样可以加快网页下载速度。
  • 将多个图片合并为一个文件,利用css背景图片的偏移技术呈现在网页中,避免多个图片的下载
[any material that should appear in print but not on the slide]尚未实现的优化
  • 动态网页静态化:staticgenerator。作者声称可以提高10倍
  • django模板缓存,提前加载模板
  • 弃用django模板,改用别的模板,或者直接组装字符串。
  • 使用数据库连接池,减少数据库连接所花费的时间。貌似django不支持mysql连接池?资料很少
[any material that should appear in print but not on the slide]结束
  • 期待你的建议
  • 谢谢
[any material that should appear in print but not on the slide]

转载于:https://www.cnblogs.com/xuq22/archive/2011/07/02/3769211.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值