由于种种原因,我需要把自己博客的一些静态资源都放到七牛上,但是一步一步地上传也太麻烦了。虽然七牛自己也推出了同步工具,不过。我还是动手写了一个很简单的上传工具。可以把本地的某个目录下的文件全上传到七牛里,前缀就根据目录结构来生成。
代码如下:
#!/usr/bin/env python
#coding:utf8
# Author : tuxpy
# Email : q8886888@qq.com
# Last modified : 2015-01-25 20:44:43
# Filename : qsync.py
# Description :
from qiniu import Auth, put_file
from os import path, chdir, walk
import sys
path.dirname(path.abspath(__file__))
def config():
from ConfigParser import ConfigParser
cfg = ConfigParser()
for f in [path.join(path.dirname(path.abspath(__file__)), 'qsync.cfg'),
'/etc/qsync.cfg']:
if path.isfile(f):
cfg.read(f)
return cfg
sys.stderr.write('qsync.fg does not exist\n')
sys.exit(1)
class Qiniu():
def __init__(self):
cfg = config()
for key, value in cfg.items('qiniu'):
self.__dict__['_' + key] = value
chdir(self._local_root)
q = Auth(self._access_key, self._secret_key)
self._token = q.upload_token(self._bucket_name)
# 扫描目录,并返回一个list,item为tuple,(key, filepath)
def scan_local_root(self):
file_list = []
for dirroot, _, filenames in walk('.'):
for filename in filenames:
if filename[0] == '.':
continue
local_file = path.join(dirroot, filename)
file_list.append((local_file[2:], local_file))
return file_list
def sync(self):
for key, local_file in self.scan_local_root():
ret, info = put_file(self._token, key, local_file)
if info.status_code != 200:
status = 'ERROR'
else:
status = 'OK'
print '%s > %s :%s' % (local_file, key, status)
def main():
q = Qiniu()
q.sync()
if __name__ == "__main__":
main()
需要一个 名为qsync.cfg的配置文件,内容如下:
[qiniu]
access_key = xxxxx
secret_key = xxxxxxxxx
bucket_name = xxxx
local_root = /home/ljd/py/coding/tuxpy/static/
local_root就是你本地的目录,这是我的博客在我本地上的路径,拿来放一些css,js还有图片的。
现在只需要执行qsync.py,就会出现大概这些信息:
./tuxpy/images/tux.png > tuxpy/images/tux.png :OK
./tuxpy/images/sort_head_bg.gif > tuxpy/images/sort_head_bg.gif :OK
./tuxpy/images/side_bar_bg.gif > tuxpy/images/side_bar_bg.gif :OK
./css/index_sider.css > css/index_sider.css :OK
应该能看明白吧。
然后就需要设置application中的settings['static_path'],把它指成自己七牛的域名,我的是http://7qnb6g.com1.z0.glb.clouddn.com
但是这样还不行。
tornado.web.RequestHandler中有一个static_url方法,里面有关键一行是这样的:
get_url = self.settings.get("static_handler_class", StaticFileHandler).make_static_url
结尾一行是:
return base + get_url(self.settings, path, **kwargs)
原来在application中还可以设置 stataic_handler_class属性,如果默认没设置,就是StaticFileHandler,原来是它在管理着static_path呀。
现在简单多了。我们写一个QiniuStaticHandler的类,继承于StaticFileHandler
class QiniuStaticHandler(StaticFileHandler):
@classmethod
def make_static_url(cls, settings, path, include_version=True):
static_path = settings.get('static_path')
if not static_path:
raise Exception
import urlparse
return urlparse.urljoin(static_path, path)
好了。现在就能正常工作了。现在static_path已经指向七牛了。