《Python Web开发实战》读书笔记一

1、python web课程资源

2、虚拟环境virtualenv的使用

3、virtualenvwrapper扩展

4、使用virtualenv-burrito打包完成virtualenv, virtualenvwrapper的安装、配置与集成一步完成

5、使用autoenv让你在切换目录的同时自动完成激活虚拟环境的操作

6、pip高级用法

7、使用devpi作为缓存代理服务器

8、使用PYPI的完全镜像bandersnatch


1、python web课程资源


获取使用代码示例:https://github.com/dongweiming/web_develop

git pull --release origin master


本地部署一个docker环境,下载并使用封装好的镜像:

docker pull dongweiming/web_develop:dev
docker run -itd --name web_dev -p 9000:9000 -p 3141:3141 -p 5000:5000 dongweiming/web_develop:dev  /bin/zsh
docker start web_dev
docker attach web_dev

进入docker容器web_dev安装并更新PIP:
sudo apt-get install python-pip -yq
sudo pip install pip -U -q

2、虚拟环境virtualenv的使用
使用virtualenv可以方便得在系统中创建出环境隔离的新的python运行环境。
1)安装virtualenv:sudo pip install virtualenv

创建一个python环境:virtualenv venv

激活刚刚创建的虚拟python环境:> source venv/bin/activate
查看python执行路径信息:
(venv)> which python
(venv) 00e9dedd02aa% which python
/home/ubuntu/web_develop/venv/bin/python

退出虚拟python环境,取消激活:(venv)> deactivate

2)定制virtualenv脚本以生成自定义的虚拟环境
调整virtualenv脚本的权限:sudo chown ubuntu.ubuntu /usr/local/bin/virtualenv

修改virtualenv的脚本内容为自定义内容(自动安装flake8):python create-venv-script.py

创建一个名为tmp的虚拟环境:virtualenv tmp

查看创建结果:
ls -l tmp/bin/flake8
-rwxr-xr-x. 1 ubuntu ubuntu 243 Oct 11 00:36 tmp/bin/flake8

create-venv-script.py:
# coding=utf-8
import subprocess

import virtualenv

virtualenv_path = subprocess.check_output(['which', 'virtualenv']).strip()

EXTRA_TEXT = '''
def after_install(options, home_dir):
    subprocess.call(['{}/bin/pip'.format(home_dir), 'install', 'flake8'])
'''


def main():
    text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version='2.7')
    print 'Updating %s' % virtualenv_path
    with open(virtualenv_path, 'w') as f:
        f.write(text)


if __name__ == '__main__':
    main()

更复杂的virtualenv定制方法
virtualenv定制支持以下3种手段:
  • extend_parser(optparse_parser):添加额外的选项
  • adjust_options(options,args):改变当前的选项
  • after_install:在默认的环境安装好后,执行其它的工作。

使用下面的脚本重新定制virtualenv的脚本内容,增加额外的选项参数,以支持在生成的虚拟环境中按需定制安装软件包:
python create-venv-script_v2.py

virtualenv -h
Usage: virtualenv [OPTIONS] DEST_DIR
Options:
  -r REQS, --req=REQS   specify additional required packages

create-venv-script_v2.py
import subprocess
import virtualenv

virtualenv_path = subprocess.check_output(['which', 'virtualenv']).strip()

EXTRA_TEXT = '''
ROOT_PATH = '/home/ubuntu/venv'

def extend_parser(parser):
    parser.add_option(
        '-r','--req', action='append', type='string', dest='reqs',
        help="specify additional required packages", default=[])

def adjust_options(options, args):
    if not args:
        return

    base_dir = args[0]
    args[0] = join(ROOT_PATH, base_dir)


def after_install(options, home_dir):
    if not options.reqs:
        logger.warn('Warn: You maybe need specify some required packages!')

    for req in options.reqs:
        subprocess.call(['{}/bin/pip'.format(home_dir), 'install', req])
'''


def main():
    text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version='2.7')
    print 'Updating %s' % virtualenv_path
    with open(virtualenv_path, 'w') as f:
        f.write(text)

if __name__ == '__main__':
    main()


因为同时增加了对命令参数的判断函数,若干不带参数则直接退出:
>virtualenv tmp
New python executable in /home/ubuntu/venv/tmp/bin/python2.7
Also creating executable in /home/ubuntu/venv/tmp/bin/python
Installing setuptools, pip, wheel...done.
Warn: You maybe need specify some required packages!

现在安装一个自动安装flake8和jinjia2的虚拟环境:
virtualenv tmp2 -r flake8 -r jinja2


3、virtualenvwrapper扩展
VirtualEnv用于在一台机器上创建多个独立的python运行环境,VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。
安装:sudo pip install virtualenvwrapper

初始化环境变量:
export WORKON_HOME=~/venv
source  /usr/local/bin/virtualenvwrapper.sh

创建虚拟环境:
mkvirtualenv venv1
会提示可以使用以下5个钩子模板:
virtualenvwrapper.user_scripts creating /home/ubuntu/venv/venv1/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/venv/venv1/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/venv/venv1/bin/preactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/venv/venv1/bin/postactivate
virtualenvwrapper.user_scripts creating /home/ubuntu/venv/venv1/bin/get_env_details

例如在postdeactivate中增加一行信息输出的提示:

以下为进入虚拟化环境和从虚拟环境退出的方法,可以看到退出时的信息提示是使用postdeactivate实现的:


切换环境
- workon [env]
随时使用“workon 环境名”可以进行环境切换,如果不带环境名参数,则显示当前使用的环境
- deactivate
在某个环境中使用,切换到系统的python环境

其他命令
  • lsvirtualenv 列出全部的虚拟环境
  • showvirtualenv [env] 显示指定环境的详情。
  • rmvirtualenv [env] 移除指定的虚拟环境,移除的前提是当前没有在该环境中工作。如在该环境工作,先使用deactivate退出。
  • cpvirtualenv [source] [dest] 复制一份虚拟环境。
  • allvirtualenv 对当前虚拟环境执行统一的命令。
  • cdvirtualenv [subdir] 把当前工作目录设置为所在的环境目录。
  • cdsitepackages [subdir] 把当前工作目录设置为所在环境的sitepackages路径。
  • add2virtualenv [dir] [dir] 把指定的目录加入当前使用的环境的path中,这常使用于在多个project里面同时使用一个较大的库的情况。
  • toggleglobalsitepackages -q 控制当前的环境是否使用全局的sitepackages目录。

用户级别的钩子脚本
放在下面环境变量参数指定的路径下,默认等同于$WORKON_HOME :
VIRTUALENVWRAPPER_HOOK_DIR=/home/ubuntu/venv

4、使用virtualenv-burrito打包完成virtualenv, virtualenvwrapper的安装、配置与集成一步完成

另启动一个容器测试:
docker run -itd --name burrito -p 9001:9000 -p 3142:3141 -p 5001:5000 dongweiming/web_develop:dev  /bin/zsh

curl -sL https://raw.githubusercontent.com/brainsik/virtualenv-burrito/master/virtualenv-burrito.sh | $SHELL
注:上面的$SHELL可以替换为自己系统的shell

然后直接使用virtualenv, virtualenvwrapper的管理命令就可以了。可以使用以下方式对集成安装的软件进行版本升级。
virtualenv-burrito upgrade

5、使用autoenv让你在切换目录的同时自动完成激活虚拟环境的操作
sudo pip install autoenv
source /usr/local/bin/activate.sh

像下面这样,为这个目录定制一个.env文件后。当再次进入该目录时,autoenv会提示是否执行激活虚拟环境:
/home/ubuntu/web_develop
more .env
source /home/ubuntu/web_develop/venv/bin/activate

cd web_develop
autoenv:
autoenv: WARNING:
autoenv: This is the first time you are about to source /home/ubuntu/web_develop/.env:
autoenv:
autoenv:     --- (begin contents) ---------------------------------------
autoenv:     source /home/ubuntu/web_develop/venv/bin/activate
autoenv:
autoenv:     --- (end contents) -----------------------------------------
autoenv:
autoenv: Are you sure you want to allow this? (y/N) y
(venv) 00e9dedd02aa% which python
/home/ubuntu/web_develop/venv/bin/python

6、pip高级用法

使用pip的自动补全功能
zsh的配置方法如下:
pip completion --zsh >> ~/.zprofile
source ~/.zprofile

bash的配置方法:
pip completion --bash >> ~/.bash_profile

普通权限用户使用pip安装工具包的方法:
pip install django --user
安装的包会放在当前用户的.local目录下。
注:在virtualenv环境中不能使用这种方法。


使用pip的编辑模式以提高开发效率
在你的程序目录中执行pip install -e .  ,这样pip会自动把这个路径作为执行程序的包加载路径,即使不在该目录下也可以执行程序进行测试。
git clone https://github.com/dongweiming/vine
cd vine
pip install -e .
Obtaining file:///home/ubuntu/web_develop/vine
Installing collected packages: vine
  Running setup.py develop for vine
Successfully installed vine

cd  /
python -c 'import vine;print vine'


7、使用devpi作为缓存代理服务器
当公司内部python应用规模较大时,使用缓存代理提高下载效率。
安装:pip install devpi-server

启动:devpi-server --host=0.0.0.0 --start

服务默认使用3141端口。

此时,局域网内安装软件时就可以通过使用-i参数指定缓存代理了。
如:pip install -i http://localhost:3141/root/pypi/  tornado

还有一种办法是把上述配置信息写入指定的配置文件中,pip会自动发现和使用指定的缓存代理:
mkdir  ~/.config/pip -p
cat  ~/.config/pip/pip.conf
[global]
index-url = http://localhost:3141/root/pypi/+simple/

此时再安装软件时,pip会自动使用缓存代理。

使用web管理界面
pip  install -U devpi-web
重启devpi-server:
devpi-server  --host=0.0.0.0  --stop
devpi-server  --host=0.0.0.0  --start
可以通过访问http://127.0.0.1:3141/来使用这个web界面。

8、使用PYPI的完全镜像
bandersnatch是一个pypi的镜像客户端,用于建立本地镜像服务,注意全部的安装包有几百GB。
详细安装方法参见以下链接。
https://bitbucket.org/pypa/bandersnatch

你可能感兴趣的:(DEVOPS)