转载: 地址.

概要:python 通过 HTTP 交互处理数据的时候,url 里面的中文以及特殊字符要做处理的,来学习一下 urlencode 与 urldecode 之间相互转换的方法。
当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至’/‘做一下编码转换。

一、urlencode

urllib库里面有个urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串,比如:

1
2
3
4
5
6
7
>>> from urllib import urlencode
>>> data = {
... 'a': 'test',
... 'name': '魔兽'
... }
>>> print urlencode(data)
a=test&name=%C4%A7%CA%DE

如果只想对一个字符串进行urlencode转换,怎么办?urllib提供另外一个函数:quote()

1
2
3
>>> from urllib import quote
>>> quote('魔兽')
'%C4%A7%CA%DE'

二、urldecode

当urlencode之后的字符串传递过来之后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()!:

1
2
3
4
5
>>> from urllib import unquote
>>> unquote('%C4%A7%CA%DE')
'\xc4\xa7\xca\xde'
>>> print unquote('%C4%A7%CA%DE')
魔兽

三、讨论

在做urldecode的时候,看unquote()这个函数的输出,是对应中文在gbk下的编码,在对比一下quote()的结果不难发现,所谓的urlencode就是把字符串转车gbk编码,然后把\x替换成%。如果你的终端是utf8编码的,那么要把结果再转成utf8输出,否则就乱码。

可以根据实际情况,自定义或者重写urlencode()、urldecode()等函数。

需要使用新版本Python的相关功能,但是又不想要影响到系统自带的Python,这个时候就需要实现Python的多版本共存。

pyenv可以很好的实现Python的多版本共存。

安装pyenv

1
2
3
4
5
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exec $SHELL -l

安装Python

查看可安装的版本

1
$ pyenv install --list

安装指定版本

使用如下命令即可安装python 3.3.2.

1
$ pyenv install 3.3.2

该命令会从github上下载python的源代码,并解压到/tmp目录下,然后在/tmp中执行编译工作。编译过程依赖一些其他的库文件,若库文件不能满足,则编译错误,需要重新下载、编译。。。(为什么每次都要重新下呢?)

已知的一些需要预先安装的库包括:

  • readline readline-devel readline-static
  • openssl openssl-devel openssl-static
  • sqlite-devel
  • bzip2-devel bzip2-libs

在所有python依赖库都安装好的情况下,python的安装很顺利。

更新数据库

安装完成之后需要对数据库进行更新:

1
$ pyenv rehash

查看当前已安装的python版本

1
2
3
$ pyenv versions
* system (set by /export/home/seisman/.pyenv/version)
3.3.2

其中的星号表示使用的是系统自带的python。

设置全局的python版本

1
2
3
4
$ pyenv global 3.3.2
$ pyenv versions
system
* 3.3.2 (set by /export/home/seisman/.pyenv/version)

当前全局的python版本已经变成了3.3.2。也可以使用pyenv localpyenv shell临时改变python版本。

确认python版本

1
2
3
4
5
$ python
Python 3.3.2 (default, Sep 30 2013, 20:11:44)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

使用python

  • 输入python即可使用新版本的python;
  • 系统命令会以/usr/bin/python的方式直接调用老版本的python;
  • 使用pip安装第三方模块时会安装到~/.pyenv/versions/3.3.2下,不会和系统模块发生冲突。

使用Vagrant打造你的虚拟环境

因为要做mongDB的replication+sharding的实验,领导给我推荐Vagrant来模拟虚拟环境做部署实践,稍微了解够大为震惊,因网上文档不是特别容易理解,留下一份以备后用

vagrant的强大在于是一个镜像,配置完以后镜像可以放到任何地方去,真正做到了一劳永逸了。

总结一下自己使用vagrant的一点笔记,以免以后忘记还得再去翻官方文档。

vagrant的官方网站:http://www.vagrantup.com/ 现在又改版了,挺漂亮的。

vagrant的一些镜像:http://www.vagrantbox.es/ 各种linux都有。
然后按照官方说的,执行这三部,然后一个虚拟机就起来了。
注:先要安装VirtualBox

配置box

1
2
3
$ vagrant box add debian http://ergonlogic.com/files/boxes/debian-current.box  #增加一个box,debian就是box的title 后面跟vagrant上的virtualbox镜像地址
$ vagrant init debian #初始化debian
$ vagrant up #这个是真正的启动

注意国内网速访问很慢 这里可以先去 http://www.vagrantbox.es/ 下载你需要的镜像 然后把http那行直接换成你本地镜像的路径就ok比较方便和快捷

连接虚拟主机

你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。

1
$ vagrant ssh  # SSH 登录 ssh的后面可以跟你的title来连接不同的vm主机

打包分发

当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:

1
$ vagrant package

打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

常用命令

1
2
3
4
5
6
7
$ vagrant init  # 初始化
$ vagrant up # 启动虚拟机
$ vagrant halt # 关闭虚拟机
$ vagrant reload # 重启虚拟机
$ vagrant ssh # SSH 至虚拟机
$ vagrant status # 查看虚拟机运行状态
$ vagrant destroy # 销毁当前虚拟机

box管理

1
2
3
$vagrant box list
$vagrant box add
$vagrant box remove

更多内容请查阅官方文档 http://docs.vagrantup.com/

Multi-VM 多虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
VAGRANTFILE_API_VERSION = "2"    #定义版本
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| #使用内部2版本
config.vm.define :debian1 do |debian1| #定义第一台虚拟机,||里面就类似一个变量设置参数时使用
debian1.vm.box = "debian1" #设置box名为debian1
debian1.vm.host_name = "debian1" #设置hostname为debian1
debian1.vm.network :private_network, ip: "192.168.1.11" #设置网络为内部网络 ip为192.168.1.11
end
config.vm.define :debian2 do |debian2|
debian2.vm.box = "debian2"
debian2.vm.host_name = "debian2"
debian2.vm.network :private_network, ip: "192.168.1.12"
end
config.vm.define :debian3 do |debian3|
debian3.vm.box = "debian3"
debian3.vm.host_name = "debian3"
debian3.vm.network :private_network, ip: "192.168.1.13"
end

end

注意语法格式就好,配置前关闭虚拟机,配置完后打开虚拟机。

注意事项

使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:

Apache 配置添加:

1
EnableSendfile off

Nginx 配置添加:

1
sendfile off;

zabbix监控mongoDB

推荐文档:

官方推荐:http://docs.mongodb.org/manual/administration/monitoring/

因我使用的是zabbix.所以选择:

https://code.google.com/p/mikoomi/wiki/03

插件下载地址:

http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/

学习地址:

https://blog.serverdensity.com/mongodb-monitoring-db-serverstatus/

http://www.yaukb.com/2012/05/zabbix_mongodb/

1.在Zabbix Server上安装php MongoDB驱动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost conf.d]# pecl install mongo

WARNING: channel “pecl.php.net” has updated its protocols, use “pecl channel-update pecl.php.net” to update
downloading mongo-1.4.3.tgz …
Starting to download mongo-1.4.3.tgz (140,481 bytes)
…………………………done: 140,481 bytes
84 source files, building
running: phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525

……

Build process completed successfully
Installing ‘/usr/lib64/php/modules/mongo.so
install ok: channel://pecl.php.net/mongo-1.4.3
configuration option “php_ini” is not set to php.ini location
You should add “extension=mongo.so” to php.ini
You have new mail in /var/spool/mail/root

[root@localhost conf.d]# vim /etc/php.ini

[root@localhost conf.d]# /etc/init.d/httpd reload

[root@localhost conf.d]# php -m |grep mongo

mongo

2.下载:

1
2
3
4
5
6
7
[root@localhost externalscripts]# pwd

/etc/zabbix/externalscripts

[root@localhost externalscripts]# wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.php

[root@localhost externalscripts]# wget http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/mikoomi-mongodb-plugin.sh

3.导入模板 建立主机:

MongoDB_Plugin_template_export.xml导入到zabbix中
修改"Miscellaneous: Data Collector"监控项的key值,因默认提供的值有错误:

1
mikoomi-mongodb-plugin.sh["--", "-h", "{$MONGODB_HOSTNAME}", "-p", "{$MONGODB_PORT}", "-z", "{$MONGODB_ZABBIX_NAME}"]

在zabbix里建立主机,定义宏:

{$MONGODB_HOSTNAME} = 10.0.199.30 #即ip地址

{$MONGODB_PORT} = 27017 #监控mongdb的端口号

{$MONGODB_ZABBIX_NAME} =MongDB1 #hostname 就是主机名 不要写显示名 这样会接受不到数据 一定是hostname

然后给主机连接上模板即可。

4.测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost externalscripts]# ./mikoomi-mongodb-plugin.sh -D -h10.0.199.30 -p27017 -z MongDB1
0
[root@localhost externalscripts]# less /tmp/mikoomi-mongodb-plugin.php_MongoDB1.log

mikoomi-mongodb-plugin.php:Successfully connected to mongoDB using connect string root:passworda@MongDB1:27017
zabbix_sender [8413]: Warning: [line 66] ‘Key value’ required

zabbix_sender [8413]: Warning: [line 68] ‘Key value’ required

zabbix_sender [8414]: DEBUG: answer [{

<div class="highlight"><pre> &quot;response&quot;:&quot;success&quot;,

&quot;info&quot;:&quot;Processed 58 Failed 13 Total 71 Seconds spent 0.001618&quot;}]
</pre></div>

sent: 71; skipped: 2; total: 73

/tmp/mikoomi-mongodb-plugin.php_MongDB1.log (END)

若出现 Failed 的数目和 Total数目相等的话 应该是 mikoomi-mongodb-plugin.sh 后面-z参数的 hostname没写对 这个hostname是zabbix主机的hostname即主机名 而不是显示名

使用github和pelican搭建本站博客

安装virtualenv虚拟环境

安装虚拟环境是为了防止污染,linux本身的python环境

1
easy_install virtualenv

使用virtualenv

1
2
3
virtualenv pelican   #创建虚拟环境
cd pelican
source bin/activate #激活虚拟环境

安装pelican和markdown

pelican 就是生成静态博客的程序

markdow 是写博客使用的轻量级标记语言,不会使用的同学可以查看帮助

1
2
3
$ pip install pelican
$ pip install Markdown
$ pip install ghp-import

建立blog目录

1
$ mkdir myblog

开始创建

1
$ pelican-quickstart

基本按照提示设置就可以,稍后可以在pelicanconf.py文件中手动修改。

1
2
3
4
5
6
7
.
|-- content #所有文章放于此目录
|-- develop_server.sh #用于开启测试服务器
|-- Makefile #方便管理博客的Makefile
|-- output #静态生成文件
|-- pelicanconf.py #配置文件
|-- publishconf.py #配置文件

写一篇文章

content目录新建一个test.md文件, 填入一下内容:

1
2
3
4
5
Title: 文章标题
Date: 2013-04-18
Category: 文章类别
Tag: 标签1, 标签2
这里是内容

然后执行:

1
make html

用以生成html

然后执行

1
./develop_server.sh start

开启一个测试服务器, 这会在本地 8000 端口建立一个测试web服务器, 可以使用浏览器打开:http://localhost:8000来访问这个测试服务器, 然后就可以欣赏到你的博客了

Github上的准备

在Github上创建一个新项目,把这个项目clone到myblog文件夹下。然后按照Github的规定建立一个没有父节点的分支gh-pages。

注:在是用分支创建github的blog的时候,要先确保自己的github上有例如:zbing3.github.io命名的项目并且在settings中开启Github Pages
如图:
Alt Github Pages

点击Automatic Page Generator开启Github Pages服务

进入output目录中:

1
2
3
4
5
6
$ git init
$ git checkout --orphan gh-pages
$ git add .
$ git commit -m "first post"
$ git remote add origin git@github.com:zbing3/opslinux.git
$ git push origin gh-pages

这样上传完代码等10分钟左右,即可在浏览器中使用http://zbing3.github.io/myblog就能访问到自己的博客

定制自己的Makefile文件,让git提交更方便一点

使用此方法就不用在output目录中初始git了。编辑Makefile vim Makefile ,在github下面添加如下格式的文件:

1
2
3
4
5
6
pip install ghp-import

git:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
ghp-import $(OUTPUTDIR)
git push origin gh-pages

ghp-import 是用来Easily import docs to your gh-pages branch,就是方便添加到gh-pages分支的,这个分支github才能解析我们的html嘛。
接着以后:make git 就可以直接提交到git的gh-pages分支的

pelican的备份

因为有时候要换电脑,所以肯定要把你的pelican的博客环境做备份,以便换完电脑后快速的搭建出写博客的环境

进入blog目录:

1
2
3
4
5
6
7
8
$ git branch #查看本地分支,没有master所以要创建 如果有master就跳过创建
gh-pages
$ git branch master #创建master分支
$ git checkout master #切换到master分支
$ git add .
$ git commit -m "first post"
$ git remote add origin git@github.com:zbing3/opslinux.git #添加过origin就不用添加
$ git push origin master #有事提交报错,如因原来提交过master分支起冲突,就在后面追加--froce

未完待续……

总想找个地方写博客,分享下自己所学的东西,原来因为种种原因一直没坚持下来,这次用了github和pelican搭建了个静态博客,使用git上传真的很爽,就是markdown这玩应我不是太会用,还的慢慢学学,大家都说他好用,我也不知道到为什么,学着看吧与大家共勉,开源世界的软件,总能给人们带来美好的东西。