Python

Python

pip 安装MySQL-python:EnvironmentError: mysql_config not found

服务端atool 发表了文章 • 0 个评论 • 1044 次浏览 • 2016-11-21 20:43 • 来自相关话题

网上很多做法是:
 首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。 查看全部
网上很多做法是:
 
首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:
ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。

paramiko使用private key SSH登陆服务器

服务端atool 发表了文章 • 0 个评论 • 1828 次浏览 • 2016-08-01 15:24 • 来自相关话题

本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes修改配置文件之后,需要重启ssh
service sshd restart
四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramikoPython代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()执行之后,就可以看到打印出aaa账户home目录的文件列表了。 查看全部
本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+
其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys
如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes
修改配置文件之后,需要重启ssh
service sshd restart

四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramiko
Python代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()
执行之后,就可以看到打印出aaa账户home目录的文件列表了。

uwsgi部署到nginx出现invalid request block size: 4161 (max 4096)...skip问题

服务端atool 发表了文章 • 0 个评论 • 1621 次浏览 • 2016-04-22 14:11 • 来自相关话题

使用Flask制作一个网页平台之后,登陆使用openid登陆,然后使用uwsgi服务部署到nginx上,运行起来没有什么问题,但是偶尔在登陆的时候出现502的错误,一般登陆成功之后后面的任何操作都不会出错。

查看uwsgi的log之后,发现出现这样的一个错误:

invalid request block size: 4161 (max 4096)...skip

之前一个没有去详细搜索过,也没有具体去看错误产生的原因,因为只是偶尔出现,并且有时候重试的时候是可以登陆的,所以没有太多的去关注,今天因为在会议演示的过程中又出现这个问题,所以不得不重视了。

搜索一下,其实问题很简单:url地址长度超过了4096个字符,而4096就是uwsgi配置中buffer-size的默认值,所以只需要将buffer-size改大一点即可。

我是使用uwsgi -x 指定uwsgi配置文件来启动服务器的,所以只需要修改成以下方式启动即可:

uwsgi -x platform.uwsgi.xml --buffer-size 32768

即在后面增加一个 --buffer-size 32768

问题基本就解决了,至于为什么这个问题是偶尔出现?那是因为openid登陆的时候会携带一个参数叫next_url,这个地址是用来指定登陆成功之后返回到哪里地址,如果这个next_url太长就会导致url地址超过4096,有时候next_url=/,即网站根地址,url地址长度就不会超过4096。另外还和openid返回的登陆人信息长度有关系,导致有些人从来不会出现这个错误,有些人偶尔出现这个问题。

Enjoy~ 查看全部
使用Flask制作一个网页平台之后,登陆使用openid登陆,然后使用uwsgi服务部署到nginx上,运行起来没有什么问题,但是偶尔在登陆的时候出现502的错误,一般登陆成功之后后面的任何操作都不会出错。

查看uwsgi的log之后,发现出现这样的一个错误:

invalid request block size: 4161 (max 4096)...skip

之前一个没有去详细搜索过,也没有具体去看错误产生的原因,因为只是偶尔出现,并且有时候重试的时候是可以登陆的,所以没有太多的去关注,今天因为在会议演示的过程中又出现这个问题,所以不得不重视了。

搜索一下,其实问题很简单:url地址长度超过了4096个字符,而4096就是uwsgi配置中buffer-size的默认值,所以只需要将buffer-size改大一点即可。

我是使用uwsgi -x 指定uwsgi配置文件来启动服务器的,所以只需要修改成以下方式启动即可:

uwsgi -x platform.uwsgi.xml --buffer-size 32768

即在后面增加一个 --buffer-size 32768

问题基本就解决了,至于为什么这个问题是偶尔出现?那是因为openid登陆的时候会携带一个参数叫next_url,这个地址是用来指定登陆成功之后返回到哪里地址,如果这个next_url太长就会导致url地址超过4096,有时候next_url=/,即网站根地址,url地址长度就不会超过4096。另外还和openid返回的登陆人信息长度有关系,导致有些人从来不会出现这个错误,有些人偶尔出现这个问题。

Enjoy~

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 828 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

Flask + gunicorn + nginx 部署Web

服务端atool 发表了文章 • 0 个评论 • 535 次浏览 • 2016-04-22 12:46 • 来自相关话题

现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:pip install gunicorn
pip install gevent使用gunicorn运行Flask:gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式nginx -t # 测试下配置是否正确
service nginx restart # 如果正确就重启3.1 如果有域名,nginx 配置文件如下erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}访问方式:http://xxx.163-inc.com

3.2 如果没有域名server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。 查看全部
现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:
pip install gunicorn
pip install gevent
使用gunicorn运行Flask:
gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app
注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式
nginx -t  # 测试下配置是否正确
service nginx restart # 如果正确就重启
3.1 如果有域名,nginx 配置文件如下
erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
访问方式:http://xxx.163-inc.com

3.2 如果没有域名
server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。

Python minidom去除xml文本中空行、空格、tab,美化xml显示样式

编程语言atool 发表了文章 • 0 个评论 • 2264 次浏览 • 2016-04-22 12:37 • 来自相关话题

使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
@classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~ 查看全部
使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
 @classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False
这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 828 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

pip 安装MySQL-python:EnvironmentError: mysql_config not found

服务端atool 发表了文章 • 0 个评论 • 1044 次浏览 • 2016-11-21 20:43 • 来自相关话题

网上很多做法是:
 首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。 查看全部
网上很多做法是:
 
首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:
ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。

paramiko使用private key SSH登陆服务器

服务端atool 发表了文章 • 0 个评论 • 1828 次浏览 • 2016-08-01 15:24 • 来自相关话题

本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes修改配置文件之后,需要重启ssh
service sshd restart
四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramikoPython代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()执行之后,就可以看到打印出aaa账户home目录的文件列表了。 查看全部
本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+
其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys
如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes
修改配置文件之后,需要重启ssh
service sshd restart

四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramiko
Python代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()
执行之后,就可以看到打印出aaa账户home目录的文件列表了。

uwsgi部署到nginx出现invalid request block size: 4161 (max 4096)...skip问题

服务端atool 发表了文章 • 0 个评论 • 1621 次浏览 • 2016-04-22 14:11 • 来自相关话题

使用Flask制作一个网页平台之后,登陆使用openid登陆,然后使用uwsgi服务部署到nginx上,运行起来没有什么问题,但是偶尔在登陆的时候出现502的错误,一般登陆成功之后后面的任何操作都不会出错。

查看uwsgi的log之后,发现出现这样的一个错误:

invalid request block size: 4161 (max 4096)...skip

之前一个没有去详细搜索过,也没有具体去看错误产生的原因,因为只是偶尔出现,并且有时候重试的时候是可以登陆的,所以没有太多的去关注,今天因为在会议演示的过程中又出现这个问题,所以不得不重视了。

搜索一下,其实问题很简单:url地址长度超过了4096个字符,而4096就是uwsgi配置中buffer-size的默认值,所以只需要将buffer-size改大一点即可。

我是使用uwsgi -x 指定uwsgi配置文件来启动服务器的,所以只需要修改成以下方式启动即可:

uwsgi -x platform.uwsgi.xml --buffer-size 32768

即在后面增加一个 --buffer-size 32768

问题基本就解决了,至于为什么这个问题是偶尔出现?那是因为openid登陆的时候会携带一个参数叫next_url,这个地址是用来指定登陆成功之后返回到哪里地址,如果这个next_url太长就会导致url地址超过4096,有时候next_url=/,即网站根地址,url地址长度就不会超过4096。另外还和openid返回的登陆人信息长度有关系,导致有些人从来不会出现这个错误,有些人偶尔出现这个问题。

Enjoy~ 查看全部
使用Flask制作一个网页平台之后,登陆使用openid登陆,然后使用uwsgi服务部署到nginx上,运行起来没有什么问题,但是偶尔在登陆的时候出现502的错误,一般登陆成功之后后面的任何操作都不会出错。

查看uwsgi的log之后,发现出现这样的一个错误:

invalid request block size: 4161 (max 4096)...skip

之前一个没有去详细搜索过,也没有具体去看错误产生的原因,因为只是偶尔出现,并且有时候重试的时候是可以登陆的,所以没有太多的去关注,今天因为在会议演示的过程中又出现这个问题,所以不得不重视了。

搜索一下,其实问题很简单:url地址长度超过了4096个字符,而4096就是uwsgi配置中buffer-size的默认值,所以只需要将buffer-size改大一点即可。

我是使用uwsgi -x 指定uwsgi配置文件来启动服务器的,所以只需要修改成以下方式启动即可:

uwsgi -x platform.uwsgi.xml --buffer-size 32768

即在后面增加一个 --buffer-size 32768

问题基本就解决了,至于为什么这个问题是偶尔出现?那是因为openid登陆的时候会携带一个参数叫next_url,这个地址是用来指定登陆成功之后返回到哪里地址,如果这个next_url太长就会导致url地址超过4096,有时候next_url=/,即网站根地址,url地址长度就不会超过4096。另外还和openid返回的登陆人信息长度有关系,导致有些人从来不会出现这个错误,有些人偶尔出现这个问题。

Enjoy~

一个轻量级 Python 装饰器的缓存库——wrapcache

服务端atool 发表了文章 • 0 个评论 • 828 次浏览 • 2016-04-22 13:22 • 来自相关话题

A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache




 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instanceREDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。 查看全部
A python Function / Method OUTPUT cache system base on function Decorators.
github 地址:https://github.com/hustcc/wrapcache
未命名.png

 
一、使用场景

经常会在某些很小的场合需要缓存一些数据,提高一些性能,而这种缓存又不是经常需要,比如:

两个进程共享数据库,其中只读进程读取数据做一些操作,这个时候,可以将数据库内容缓存一下,避免重复读数据库;

一个web页面数据太多,然而页面并不需要完全的实时性,这个时候就可以将页面内容完全缓存,在过期时间之后,不读数据库,不进行大量计算,这种在一些报告页面非常常见。

这两个场景其实挺常见的,要完成也不难,无非就是存到python 字段,加一个时间戳,判断过期,如果是redis,就直接存redis,并赋予timeout时间就ok了。

自己因为经常遇到这种场景,所以将其封装成一个python库,方便使用。

二、如何使用

使用简单,只需要要在方法上面加一个装饰器即可缓存,并且设置缓存过期时间。
import wrapcache
@wrapcache.wrapcache(timeout = 60)
def need_cache_function(input, t = 2, o = 3): sleep(2)
return random.randint(1, 100)
以上即可,第一次运行需要 2 秒,第二次运行(过期时间 60 秒之内)瞬间给出缓存结果。适合于小场景的方法缓存。
 
三、安装方法
 
首先 pip install wrapcache,支持python2和python3。

然后import wrapcache。

最后在需要缓存的方法上加上装饰器即可@wrapcache.wrapcache(timeout = 3)

其中 @wrapcache.wrapcache(timeout = 3, adapter = RedisAdapter) 有两个参数:

timeout, 过期时间,默认为-1,不缓存数据

adapter,存储器,默认为MemoryAdapter(存到python的全局字典中),可选RedisAdapter(存储到redis中)

注意:如果选择adapter = RedisAdapter,则需要在使用前设置redis市里 调用 RedisAdapter.db = redis_instance
REDIS_CACHE_POOL = redis.ConnectionPool(host = 'xx.xxx.xx.xxx', port = 6379, password = 'redis_pwd', db = 2)
REDIS_CACHE_INST = redis.Redis(connection_pool = REDIS_CACHE_POOL, charset = 'utf8')
RedisAdapter.db = REDIS_CACHE_INST #初始化装饰器缓存
四、TODO

目前是使用内存 dict 和 redis 存储缓存,后续要支持将 memcached 等服务器中,只需要补充 adapter 中代码,实现对应方法即可。

欢迎 push requst 和 issue 。

Flask + gunicorn + nginx 部署Web

服务端atool 发表了文章 • 0 个评论 • 535 次浏览 • 2016-04-22 12:46 • 来自相关话题

现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:pip install gunicorn
pip install gevent使用gunicorn运行Flask:gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式nginx -t # 测试下配置是否正确
service nginx restart # 如果正确就重启3.1 如果有域名,nginx 配置文件如下erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}访问方式:http://xxx.163-inc.com

3.2 如果没有域名server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。 查看全部
现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:
pip install gunicorn
pip install gevent
使用gunicorn运行Flask:
gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app
注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式
nginx -t  # 测试下配置是否正确
service nginx restart # 如果正确就重启
3.1 如果有域名,nginx 配置文件如下
erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
访问方式:http://xxx.163-inc.com

3.2 如果没有域名
server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。

Python minidom去除xml文本中空行、空格、tab,美化xml显示样式

编程语言atool 发表了文章 • 0 个评论 • 2264 次浏览 • 2016-04-22 12:37 • 来自相关话题

使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
@classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~ 查看全部
使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
 @classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False
这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~