tornado把static_path指向到七牛

本文介绍了一款用于将本地文件同步到七牛云存储的Python工具。该工具通过递归扫描本地目录并将所有文件上传到指定的七牛云存储桶。此外,还介绍了如何配置Tornado应用以使用七牛云作为静态资源服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于种种原因,我需要把自己博客的一些静态资源都放到七牛上,但是一步一步地上传也太麻烦了。虽然七牛自己也推出了同步工具,不过。我还是动手写了一个很简单的上传工具。可以把本地的某个目录下的文件全上传到七牛里,前缀就根据目录结构来生成。

代码如下:

#!/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已经指向七牛了。


转载于:https://my.oschina.net/tuxpy/blog/371765

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值