最后更新于 .

其实之前就有写过关于python web开发框架选择的文章,之前最终选择了bottle,并给出了bottle开发的物理设计,详见之前的文章:回归简单,向Django说再见bottle做web开发的物理设计,然而经过最近两个星期的实践,又有了一些新的想法。

Bottle作为一个微框架,本身确实有些小型项目的缺点,尝试列举如下:


  • 没有原生支持unicode

  • 例如route('/')获取的name并不是unicode类型,get和post的参数也默认并非unicode类型,虽然作者后来在0.10版本中给query和forms加入attr方式来解决这个问题,但是还是有所限制
    而flask则是 unicode based,对unicode支持的非常好
  • 影响力小,与其他组件的结合比较差

  • 一个典型的例子就是wtforms不支持bottle的files字段,而flask虽然也不支持,但是flask的插件flask-wtforms则完美修正了这个问题
  • 功能太基本

  • 关于这一点,可以说是优点也可以说是缺点。绝对的纯粹看起来是件好事,但是真正开发起来又发现完全不是那么回事,自己要重新开发的轮子实在太多了。比如session的支持
  • bottle由个人开发,有些地方并不那么专业

  • 比如route的参数method=['GET','POST'],因为是数组,所以用methods更合适;request.forms其实用request.form更合适
    再比如static_file函数,必须要求传入一个root_path和一个filename;而flask则有两个函数一个send_file和send_from_directory,支持直接返回file内容

反观flask,不能说flask的一切都是好的,但是确实在这几点上要比bottle做的要好一些,而且flask还有一些很实用的功能,比如实时debug ...

最后更新于 .

前段时间家里的无线路由还没到,手机直接连电信的路由又没法拨号(万恶的电信),所以没办法只能尝试在windows7开启隐藏的虚拟wifi热点功能~~ OK,开始~

1. 以管理员身份运行命令提示符

“开始”---在搜索栏输入“cmd”----右键以“管理员身份运行”

2. 启用并设定虚拟WiFi网卡

运行命令:

netsh wlan set hostednetwork mode=allow ssid=dantezhu_wifi key=00000000

"ssid"后为网络名称,起个名字就行 "Key"后为密码,一般要求是8位 执行完之后,打开“网络和共享中心”--“更改适配器设置”看看是不是多了一项,若果有多出的这一项“Microsoft Virtual WiFi Miniport Adapter”,为方便区分,将其改名为“虚拟wifi”。

1

3.设置Internet连接共享

在“网络连接”窗口中,右键单击已连接到Internet的网络连接,选择“属性”→“共享”,勾上“允许其他······连接(N)”并选择“虚拟WiFi”。

1

这里要注意的是,如果像我一样采用宽带拨号,那么要更改的网络链接是那个“宽带链接”而不是“本地链接”

4.开启无线网络

继续在命令提示符中运行:

netsh wlan start ...

最后更新于 .

过年回来也一直没发博客,其实东西还是搞了不少的,挨个给大家分享一下吧 今年过年回家恶补了一下js和css,发现vim的 css.vim 在处理着色的时候有bug,描述如下: 如果是如下css代码:

#menu ul li { background: #eee; border-bottom: 1px solid #ccc;}

则原版的css.vim 无法在同一行上显示两种颜色(#eee和#ccc),所以笔者修改了css.vim的代码,放出下载如下: http://vimercode.googlecode.com/svn/trunk/css.vim/css.vim

最后更新于 .

从老家回来第一天,特向各位博友拜个晚年~
祝福大家新年快乐,龙年大吉!
家庭幸福美满,事业蒸蒸日上!
心想事成,万事如意!

最后更新于 .

前几天同事的程序有个很奇怪的bug,跟大家分享一下。 描述如下:一个http接口在测试环境下能够正常访问,在外网环境下就会直接超时,并且超时的消耗是建是0ms。 我strace了一下,libcurl在测试环境能正常发包,在外网环境却总是直接返回,连连接都没有尝试建立。 仔细研究了他的代码,发现并没有什么不合理之处,一筹莫展时发现有如下代码:

curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, (int)(timeout_sec*1000));                                                        
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, (int)(timeout_sec*1000)); 

突然想起之前有文章说curl只支持秒级的超时时间,而我们外网的超时配置的是0.5秒。 把超时时间改成1秒之后,果然一切正常了。 google上搜了一下,在如下链接找到了答案: http://stackoverflow.com/questions/1856473/why-would-curl-ignore-curlopt-timeout-ms-but-honor-curlopt-timeout

The version of curl I am using (7.15.5) doesn't support CURLOPT_TIMEOUT_MS. According to Greg I ...

最后更新于 .

前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做) 这篇还是一些技术的整理,主要是用于备忘,大家如果觉得太简单就一笑而过啦~

一. python通过图片内容判断图片类型

前段时间写了一个小站练手,http://xiangshuguo.com,一个支持自由上传的图片小站。 因为要限制上传图片的格式,所以要做文件类型检测,代码如下:

def get_image_type(pd, is_path=True):
    '''
    获取图片的类型,支持传入路径和文件内容
    '''
    if is_path:
        f = file(pd, 'rb')
        data = f.read(10).encode('hex')
    else:
        data = pd.encode('hex')

    ftype = None

    if data.startswith('ffd8'):
        ftype = 'jpeg'
    if data ...

最后更新于 .

几年之前刚玩wordpress的时候,还是用apache+wordpress,而后来虽然自己成了nginx粉,却也只是用来做nginx+python的开发,没有把nginx+php配合起来。这次趁这要搭建wordpress的调试环境,所以重新梳理了一遍。 PS:网上很多盛传的版本,基本都不太准,我这里算是亲身试验了,给大家个准的 PS2:这次就在windows下来搞了,其实在linux也是一样 OK,我们正式开始 一. php安装部署

  1. php windows下载页面下载zip包,而不是安装包
  2. 解压,我是解压到 D:\program\php5
  3. 重命名php.ini-production为php.ini
  4. 修改php.ini
  5. 将如下代码去掉注释来支持mysql
    extension=php_mysql.dll
        
    将如下代码去掉注释,来指明ext的路径
    extension_dir = "ext"
        

二. mysql安装部署

  1. http://www.mysql.com/downloads/mysql/下载windows版MySQL ...

最后更新于 .

前言:

  • 好久没写Vim插件了,这次给Vimer们带来个好福利!-- 用Vim(gVim)发腾讯微博
  • 昨晚折腾了大半夜,总算成功实现!~~ 当然,代价就是今天头痛的厉害……

昨天突发奇想,当我用vim读文档,看代码的时候,如果有一段我觉得特别好,想要分享给大家,有没有快捷点的方式呢? 所以需求也就来了,在Vim里面分享内容~而目前用的最广的,自然是微博~(由于笔者只用腾讯微博,所以只实现了腾讯微博……)

细化一下功能:

  1. 分享文章中的一段文字,并支持评论
  2. 直接发送微博

如果你读这篇文章比较早,应该还能看到页面右侧的微博里有这条微博:

花了一晚上,终于把用vim发腾讯微博给折腾出来了,明天写博客跟大家分享,敬请期待! 来自weibo.vim

在正式开始介绍之前,声明一下:

  1. 文中所使用的QQ登录的API均为对外公开的API,不存在任何使用保密API的问题
  2. 笔者是用 vimer.cn 来申请了 QQ登录,但是access_token在生成之后,笔者不会对这个信息做任何保存,如果有所怀疑,请不要使用。
  3. weibo.vim插件本身不会主动发起任何发送微博的操作

OK,废话不多说,开始介绍吧

一. 环境依赖

  1. python ...

最后更新于 .

接着回归简单,向Django说再见,继续来聊用bottle做web开发。 其实上一篇文章已经讲的比较清楚了,这一次主要从另一个角度来分享一下:物理设计 干脆直接贴出来吧:

bottle_site_tpl/
|~conf/
|~depend/
| |+autumn/
| |+jinja2/
| |+wtforms/
| |-__init__.py
| `-bottle.py
|~log/
| `-site.log
|~module/
| |-__init__.py
| |-forms.py
| |-models.py
| |-mysession.py
| `-web_func.py
|+static/
|~views/
| `-test.html
|~web/
| |-__init__.py
| `-test.py
|-myapp.py
`-setting.py

可以看出,最外层有两个文件,分别是setting.py 和 myapp.py。 setting ...

最后更新于 .

前言:这是我最近在公司内部分享的一篇文章,大家反响比较强烈,所以也分享到博客里来。 一转眼,来公司已经三年多了。 这三年里,所属部门在变,地理位置在变,技术也日新月异,但是有很多设计原则却是一直不曾改变的,而这次就是我用自身的实践来谈谈我对其中的一个的理解---有损服务。 记得当年qwang用一个很形象的比喻来解释有损(原话记不太清楚了): 比如一个人在沙漠里迷失了寻找水源,那么在他还能走的时候,就尽量走;实在走不动了,用爬的;最后爬也爬不了了,起码要保证自己活着。 所以我们从这个比喻中起码可以获得如下几个信息:

  1. 问题时,优先保证关键功能
  2. 非关键功能不可以影响关键功能
  3. 在条件允许的情况下,损失越少越好

接下来就从自己印象比较深刻的有损服务项目讲起吧。

一、空间应用列表有损服务优化

想当年,苍井空还是处女,玛利亚还姓圣母。好吧,扯远了,想当年第一款国民级应用《QQ农场》横空出世,其空前的火爆导致空间个人中心应用列表的农场图标变得如此重要。 然而由于各种网络等各种原因,这个列表的展现总是会有一定的失败率,而且只要稍微失败就会招来大批用户的投诉。 我们分析一下这个模块的功能:

  • 正常功能:正常展示用户已经安装的应用列表
  • 关键功能:正常展示用户最关心的基础应用(如日志)、火爆游戏(农场)等的应用列表

于是优化开始了……

Step1. 应用信息本地cache

由于应用列表第一个要获取的就是应用自身的信息 ...