备忘笔记:
yum -y groupinstall 'Development Tools'
yum -y install openssl-devel* ncurses-devel* zlib*.x86_64
yum -y install bzip2 bzip2-devel bzip2-libs
yum -y install sqlite-devel
下载python 2.7.8的tar.gz文件
./configure --prefix=/usr/local/python && make && make install
rm /usr/bin/python
ln -s /usr/local/python/bin/python2.7 /usr/bin/python
验证 $python -V
解决yum失效的问题
# vim /usr/bin/yum
#!/usr/bin/python
改成
#!/usr/bin/python2.4
-------------------------------
开始的时候安装的python2.7.3,安装成功后,运行django的时候错误:
ImportError: No module named _sqlite3
按照网上的普遍的解决办法:
yum install sqlite-devel
并且重新安装了python2.7.3,没有用--prefix
但是依然没有解决这个问题,始终找不到python-2.7.3/lib/python2.7/lib-dynload/_sqlite3.so。
个人怀疑是python 2.7.3的版本问题。
于是安装了python2.7.8,依然没有解决这个问题,但是存在python-2.7.8/lib/python2.7/lib-dynload/_sqlite3.so。
验证,import sys
print sys.path
看到引用的路径都是/usr/local/lib下的路径,总结出了以下的观点,如果/usr/local/lib下有python的话,系统会自动的使用这个python,而不会使用你--prefix安装到的那个目录的python,虽然你建立了软连接后运行python -V是你想要的结果。
在删除/usr/local/下的所有以前安装的python后,import sqlite3运行正常。
安装setuptools
setuptools与pip都是python的模块
setuptools源码包: https://pypi.python.org/pypi/setuptools
pip源码包: https://pypi.python.org/pypi/pip#downloads
先安装setuptools, 进入setuptools的源码根目录下, 执行以下命令进行setuptools模块的安装:
# python setup.py install
安装完setuptools后, 接着安装pip, 进入pip的源码包根目录下, 执行以下命令进行安装:
# python setup.py build # python setup.py install
安装完pip后. 看看pip都安装在哪里. 执行以下命令:
# whereis pip
然后再执行 # pip 命令并回车, 如果无法用pip命令, 则可通过创建pip软链接, 执行以下命令:
# ln -s /usr/local/python/bin/pip /usr/bin/pip
如果不使用pip的软连接,那么请使用pip的路径
# /usr/local/python/bin/pip
安装tornado
tornado源码包下载:http://www.tornadoweb.org/en/stable/
进入tornado的源码根目录下, 执行以下命令进行setuptools模块的安装:
# python setup.py build # python setup.py install
安装django
django下载包地址:https://www.djangoproject.com/
进入django的源码根目录下,执行一下命令进行django安装
# python setup.py build # python setup.py install
安装jinja2和sqlalchemy
pip install jinja2 pip install sqlalchemy
安装paramiko
pip install paramiko
安装结果: Installing collected packages: ecdsa, pycrypto, paramiko Running setup.py install for pycrypto Successfully installed ecdsa-0.13 paramiko-1.15.2 pycrypto-2.6.1
如果不使用pip而是使用源码包的方式的话,需要安装pycrypto和paramiko 而且要安装较新版本(遇到到paramiko低版本在python2.7.8中出现的问题,具体什么问题忘了)
安装xlrd xlwt(一个读excel一个写excel)
pip install xlwt pip install xlrd
其中xlwt默认的字符编码是ascii编码,所以要设置成utf-8编码,我的修改方式是在修改xlwt源码中的编码: 在xlwt/Workbook的第55行修改编码方式,按照上面的安装方式Workbook的位置应该为: /usr/local/python/lib/python2.7/site-packages/xlwt/Workbook.py 然后把 def __init__(self, encoding='ascii', style_compression=0): 修改成 def __init__(self, encoding='utf-8', style_compression=0): 这样就解决了xlwt的编码问题
安装mysql-python
pip install MySQL-python
安装Pillow(图形处理,项目用来生成验证码,下面有代码)
pip install Pillow
mysql数据库的编码设置成utf-8
创建数据库的编码设置 CREATE DATABASE `rmdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; my.conf里面的编码配置 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock default-character-set=utf8 user=mysql symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] default-character-set=utf8 [mysql] default-character-set=utf8 [server] default-character-set=utf8 连接数据库的编码设置(tornado例子) create_engine("mysql://dusername:dpasswd@localhost/dbname?charset=utf8",encoding='utf-8')
Pillow生成验证码的代码例子(4位)
#!/usr/bin/python #fileencoding:utf-8 from PIL import ImageDraw,ImageFont,ImageFilter from PIL import Image import random import math, string import os BASE_DIR = os.path.dirname(__file__) print BASE_DIR rootDir = BASE_DIR[0:-15] fontPath = rootDir+"wqy-zenhei.ttc" FONT_PATH = fontPath def initChars(): """ 允许的字符集合,初始集合为数字、大小写字母 usage: initChars() param: None return: list 返回允许的字符集和 for: picChecker类初始字符集合 todo: Nothi """ nums = [str(i) for i in range(10)] letter = "abcdefghijklmnopqrstuvwxyz" lowerCase = [x for x in letter] upperCase = [x.upper() for x in lowerCase] return (nums + lowerCase + upperCase) class picChecker(): """ 图片验证代码: 1) 用户注册需填写图片验证码,以阻止机器人注册 2) 图片验证码字符数为 4 位(大小写字母与数字,不区分大小写)。 用户如果没有填写验证码或没有填写正确的验证码, 页面友好性提示用户填写(同时程序方面也做相应限制) usage: pc = picChecker().createChecker() param: 很多,如下 chars 允许的字符集合, 类型 list 默认值 initChars() 例子 ['1','2','3'] length 字符串长度 类型 integer 默认值 4 size 图片大小 类型 tutle 默认值 (120,30) 例子 (120,30) fontsize 字体大小 类型 integer 默认值 25 begin 字符其实位置,即左上角位置 类型 tutle 默认值 (5,-2) outputType 输出类型 类型 string 默认值 GIF 可选值 GIF JPEG TIFF PNG mode 图片模式 类型 string 可选值 RGB L (还有其他模式,但只推荐这2种) 默认值 RGB backgroundColor 背景色 foregroundColor 前景色 当mode=RGB时,backgroundColor,foregroundColor为tutle类型 取值为(integer,integer,integer) 表示RGB颜色值 当mode=L时,backgroundColor,foregroundColor为数字,表示黑白模式 取值为0-255 表示灰度 fonttype 字体路径 类型 string 默认值 "simsum.ttc" jamNum 干扰线条数 类型 (int1,int1) int1 干扰线条数下限,包含 int2 干扰线条数上线,包含 pointBorder 散点噪音 构造方法:对每个像素点使用随机函数确定是否在该像素上画散点噪音 类型 (int1,int2) int1越大 散点越多 int2越大 散点越少 return: [picCheckerStr,pic] picCheckerStr: 表示返回图片中对应的字符串,可用于session验证以及其他用途 pic : 返回的图片,类型为Image for : todo : Nothing """ def __init__(self, chars = initChars(), size = (120, 35), fontsize = 25, begin = (5, -2), outputType = 'GIF', mode = 'RGB', backgroundColor = (255, 255, 255), foregroundColor = (0, 0, 255), fonttype = FONT_PATH, length = 4, jamNum = (1, 2), pointBorder = (40, 39) ): self.chars = chars self.size = size self.begin = begin self.length = length self.outputType = outputType self.fontsize = fontsize self.mode = mode self.backgroundColor = backgroundColor self.foregroundColor = foregroundColor self.jamNum = jamNum self.pointBorder = pointBorder self.fonttype = fonttype #self.font = ImageFont.truetype(self.fonttype, self.fontsize) self.font = ImageFont.truetype(FONT_PATH, self.fontsize) def createPoints(self, draw): """ usage: 创建散点噪音 para: draw 表示画笔 return: None for: todo: """ for x in range(self.size[0]): for y in range(self.size[1]): flag = random.randint(0, self.pointBorder[0]) if flag > self.pointBorder[1]: draw.point((x, y), fill = (0, 0, 0)) del flag def createJam(self, draw): """ usage: 创建干扰线 para: draw 表示画笔 return: None for: todo: """ lineNum = random.randint(self.jamNum[0], self.jamNum[1]) for i in range(lineNum): begin = (random.randint(0, self.size[0]), random.randint(0, self.size[1]) ) end = (random.randint(0, self.size[0]), random.randint(0, self.size[1]) ) draw.line([begin, end], fill = (0, 0, 0)) def getPicString(self): """ usage: getPicString() return: string for : 生成给定长度的随机字符串 todo: Nothing """ length = self.length chars = self.chars selectedChars = random.sample(chars, length) charsToStr = string.join(selectedChars, '') return charsToStr def createChecker(self): """ usage: createChecker() return: [str,pic] str:对应的字符串 pic:对应的图片 for: todo: """ randStr = self.getPicString() randStr1 = string.join([i + " " for i in randStr], '') im = Image.new(self.mode, self.size, self.backgroundColor) draw = ImageDraw.Draw(im) draw.text(self.begin, randStr1, font = self.font, fill = self.foregroundColor ) self.createJam(draw) self.createPoints(draw) para = [1 - float(random.randint(1, 2))/100, 0, 0, 0, 1 - float(random.randint(1, 10))/100, float(random.randint(1, 2))/500, 0.001, float(random.randint(1, 2))/500 ] im = im.transform(im.size, Image.PERSPECTIVE, para) im = im.filter(ImageFilter.EDGE_ENHANCE_MORE) im.save("checker.jpg", self.outputType) return ([randStr, im]) if __name__ == "__main__": c = picChecker() t = c.createChecker() print(t)
自己程序中登录拿验证码呈现在登录页面
@route('getRandomCode', name='') class GetRandomCodeHandler(BaseHandler): def get(self): c = picChecker() t = c.createChecker() sio=StringIO.StringIO() #wsServer.col(0).width = 7000 _id = self.get_secure_cookie("session_id") if not _id: _id = session_id() self.set_secure_cookie("session_id", _id) sessionForRandomCodeOld = self.db.query(SessionForRandomCode).filter_by(session_id=_id).first() if not sessionForRandomCodeOld: localTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) sessionForRandomCode = SessionForRandomCode(random_code=t[0],start_date=localTime,session_id=_id) self.db.add(sessionForRandomCode) self.db.commit() else: sessionForRandomCodeOld.random_code=t[0] self.db.commit() else: sessionForRandomCodeOld = self.db.query(SessionForRandomCode).filter_by(session_id=_id).first() if not sessionForRandomCodeOld: localTime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) sessionForRandomCode = SessionForRandomCode(random_code=t[0],start_date=localTime,session_id=_id) self.db.add(sessionForRandomCode) self.db.commit() else: sessionForRandomCodeOld.random_code=t[0] self.db.commit() t[1].save(sio,'jpeg') self.write(sio.getvalue())