Flask Framework初探

环境:

  • 操作系统: Mac OSX 10.9.5
  • Python: 2.7.8
  • Flask: 0.10.1
  • 开发工具: Eclipse Luna + Pydev 3.6

之前对Pyramid, Django都已经有一些项目经验了,这次研究一下Flask的易用性如何。 说不定以后能在小项目上用的上。 本文主要参考一下两个网页:

  • http://flask.pocoo.org/
  • http://flask.pocoo.org/docs/0.10/quickstart/

首先建立开发的环境

假设我们Base Dir 为 /temp/flaskstudy

cd /temp/flaskstudy
virtualenv env
mkdir ...
more ...


服务器上Gunicorn出现Timout 错误

Ngnix端出现以下错误

2013/07/29 09:25:24 [error] 30266#0: *6267 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx ...

Gunicorn端出现以下错误

2013-07-29 11:05:41,127 INFO  [gunicorn.error][Dummy-1] Booting worker with pid: 29995
2013-07-29 11:06:19,733 INFO ...
more ...

在阿里云的CentOS中升级Python2.7

环境:

  • CentOS: 6.x
  • Python: 2.6

CentOS 6中默认的python版本为2.6, 要安装2.7的话需要先安装compile环境。

yum groupinstall "Development tools"

安装时会出现以下错误

Error: Package: systemtap-devel-1.7-5.el6_3.1.x86_64 (updates)
           Requires: kernel-devel
Error: Package: glibc-headers-2.12-1.80.el6_3.6.x86_64 (updates)
           Requires: kernel-headers >= 2.2.1
Error ...
more ...

Python设置默认Encoding

当python中间处理非ASCII编码时,经常会出现如下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)

0x??是超出128的数字,python在默认的情况下认为语言的编码是ascii编码,所以无法处理其他编码,需要设置python的默认编码为所需要的编码。

解决的方案1

import sys

reload(sys)
sys.setdefaultencoding('utf-8')

解决的方案2

另一个方案是在python的Lib\site-packages文件夹下新建一个sitecustomize.py 文件, 内容如下

import sys
sys.setdefaultencoding('utf-8')

这样就能够自动的设置编码了。

测试已经成功的方法

>>> import sys
>>> sys.getdefaultencoding()
more ...

如何在 Python中使用namespace

如果想要在python中使用好像java一样的namespace, 又想发布到不一样的egg下面,就必须按以下修改

Package-1/example/__init__.py
Package-1/example/module1/__init__.py
Package-1/setup.py
Package-2/example/__init__.py
Package-2/example/module2/__init__.py
Package-2/setup.py

Package-1/setup.py内容

from setuptools import setup, find_packages
import sys
setup(name='example-a',
      version='1.0',
      include_package_data=True,
      )

Package-2/setup.py内容

from setuptools ...
more ...

Python 使用ssl去连接smtp服务器

smtp服务器是postfix, 如果我们只是简单的配置main.cf,如下

smtpd_tls_security_level = encrypt
smtpd_tls_key_file = /etc/pki/tls/private/localhost.key
smtpd_tls_cert_file = /etc/pki/tls/certs/localhost.crt
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:/var/spool/postfix/smtpd_tls_cache
tls_random_source = dev:/dev/urandom
smtpd_tls_auth_only = yes

这样在会出现以下exception

SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol ...
more ...

编译sqlcipher 到 python 安装程序

环境:

操作系统: MacOSX, Ubuntu Python: 2.7

编译sqlcipher

./configure --disable-tcl --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto" --prefix="python_install_path”

修改python 源代码下的setup.py

#sqlite_inc_paths = [ '/usr/include',
#                     '/usr/include/sqlite',
#                     '/usr/include/sqlite3',
#                     '/usr/local/include',
#                     '/usr/local/include/sqlite',
#                     '/usr/local/include/sqlite3',
#                   ]
sqlite_inc_paths = [ '/opt/recro_qtapp/include/sqlcipher',
]

#        for d_ in inc_dirs ...
more ...

Virtualenv

安装

用easy_install或者pip安装

easy_install -U virtualenv
pip install -U virtualenv

什么是virtualenv

如果我们的机器中只有一个python环境,所有的人都往里面安装库,这样会导致依赖和版本的问题, 试想一下,如果你有一个应用要使用LibFoo的版本1,另外的一个应用要使用版本2,如何运行这 两个程序。把一切的库都往/usr/lib/python2.7/site-packages里装,这样要因为一个程序要 升级某个库的时候可能会导致其他引用这个库的程序运行出错。

另一个问题是如果你没有权限往全局的site-packages里面安装库呢? 这个时候,我们就要使用到virtualenv。

要创建virtualenv环境很简单

virtualenv ENV

ENV是这个环境的名字,你可以命名为django_env, pyramid_env,或者就是env。

命令完后,会创建以下的目录结构,在Linux中Scripts由bin代替。

xxx_env
      |- etc
      |- Lib
      |- Scripts

在virtualenv环境中运行程序

Windows

在cmd中运行即可进入virtualenv的shell

Scripts\activate.bat

Linux ...

more ...

Python废弃的modules

NOTE: Python 2.7 only

  • strop, use string module or string object instead
  • interpolation > str.format > string.template.substitute, 0.10 > 0.14 > 0.95 but str.format is more pythoninc
more ...