花了一下午,总得写点什么吧~
这是在博客历程里的话:
2014-03-31
1.昨天学习wtforms和flask-wtf。有点绕,花了大量时间,但是没怎么实战。算了,总比没看好,就当锻炼自己的毅力了。
2.根据澳洲一刻的源码以及FMN的博文中提到的SAE python图床网站,最终为博客添加了“相册”功能。目前可以上传图片,可以显示所有图片。
待解决:
1.上传图片,自动创建缩略图,不用每次都载入所有图片。
2.以后图片多了,要创建相册。目前不需要,且没思路。
3.美化“相册”页面,太丑了。
4.CSS已经荒废了.....
总结:
1.storage的文档在这:http://sae.sina.com.cn/doc/python/storage.html#id1
storage用来存放用户的持久化存储的文件。可以用API读取写入获取操作,也可以用客户端 ,不过我没用过客户端,原因是....丫的下载不了
2.API使用手册
-
class
sae.storage.
Error
-
Storage异常类。
-
class
sae.storage.
Connection
(
accesskey=ACCESS_KEY,
secretkey=SECRET_KEY,
account=APP_NAME,
retries=3
)
¶
-
Connection类
参数: - accesskey – 可选。storage归属的应用的accesskey,默认为当前应用。
- secretkey – 可选。storage归属的应用的secretkey,默认为当前应用。
- account – 可选。storage归属的应用的应用名,默认为当前应用。
- retries – 请求失败时重试的次数。
-
get_bucket
(
bucket
)
-
获取一个bucket类的instance。
参数: bucket – bucket的名称。
-
class
sae.storage.
Bucket
(
bucket,
conn=None
)
-
Bucket类,封装了大部分的storage操作。
参数: - bucket – bucket的名称。
- conn – 可选。一个sae.storage.Connection的实例。
-
put
(
acl=None,
metadata=None
)
-
创建一个bucket。
参数: - acl – bucket的 ACL (Access Control List)。
- metadata – 需要保存的元数据,metadata应该是一个dict,例如 {‘color’: ‘blue’} 。
-
post
(
acl=None,
metadata=None
)
-
修改bucket的acl和metadata。其中metadata的修改为增量修改。
-
list
(
prefix=None,
delimiter=None,
path=None,
limit=10000,
marker=None
)
-
列出bucket中的object。
参数: - prefix – object名称的前缀。
- delimiter – 分割字符。折叠包含该分割字符的条目。
- path – 返回路径path下的全部objects。等价于prefix为path,delimiter为/。
- limit – 最大返回的objects条数。
- marker – 返回object名为marker后面的结果(不包含marker)。
返回: 符合条件的objects的属性的一个generator。
-
stat
(
)
-
返回: 当前bucket的属性信息。
-
delete
(
)
-
删除bucket。被删除的bucket必须已经清空(没有任何object)。
-
put_object
(
obj,
contents,
content_type=None,
content_encoding=None,
metadata=None
)
-
创建或更新一个object。
参数: - obj – object的名称。
- contents – object的内容,可以是字符串或file-like object。
- content_type – object的mime类型。
- content_encoding – object的encoding。
- metadata – object的元数据。
-
post_object
(
obj,
content_type=None,
content_encoding=None,
metadata=None
)
-
更新object的一些属性。
注意:object的metadata的更新是全量的,和container的增量修改不一样。
-
get_object
(
obj,
chunk_size=None
)
-
获取object的内容和属性信息。
参数: - obj – object的名称。
- chunk_size – 不返回object的全部内容,而是返回一个文件内容的generator,每次iterate返回chunk_size大小的数据。
返回: 一个tuple (obj的属性信息, object的内容)。
-
get_object_contents
(
obj,
chunk_size=None
)
-
获取object的内容。
参数同get_object,只返回object的内容。
-
stat_object
(
obj
)
-
获取object的属性信息。
-
delete_object
(
obj
)
-
删除object。
-
generate_url
(
obj
)
-
返回object的public url。
-
3.模拟storage为文件系统
from sae.ext.storage import monkey
monkey.patch_all()
以上代码会将storage挂载到/s/目录下,每个bucket为这个目录下的一个子目录。用户可以使用/s/<bucket-name>/<object-name>这样的形式的路径通过文件系统接口来访问storage中的object。
目前支持(patch)的文件系统接口函数为: open, os.listdir, os.mkdir, os.path.exists, os.path.isdir, os.open, os.fdopen, os.close, os.chmod, os.stat, os.unlink, os.rmdir。
4.在SAE线上运行环境中操作storage
#创建一个bucket的instance
from sae.storage import Bucket
bucket = Bucket('t')
# 创建该bucket
bucket.put()
#修改该bucket的acl和缓存过期时间。
略
#获取该bucket的属性信息
attrs = bucket.stat()
返回值:
好吧,是字典,好操作。#存储一个字符串到bucket中
bucket.put_object('1.txt','hello,world')
#获取object的public url
bucket.generate_url('1.txt')
返回值: