Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
looyolo
scrapy
提交
cfc567f4
S
scrapy
项目概览
looyolo
/
scrapy
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scrapy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
cfc567f4
编写于
2月 15, 2016
作者:
K
Konstantin Lopuhin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
botocore support for S3FilesStore
上级
32cd8c91
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
46 addition
and
20 deletion
+46
-20
scrapy/pipelines/files.py
scrapy/pipelines/files.py
+46
-19
tests/test_feedexport.py
tests/test_feedexport.py
+0
-1
未找到文件。
scrapy/pipelines/files.py
浏览文件 @
cfc567f4
...
...
@@ -28,6 +28,7 @@ from scrapy.utils.misc import md5sum
from
scrapy.utils.log
import
failure_to_exc_info
from
scrapy.utils.python
import
to_bytes
from
scrapy.utils.request
import
referer_str
from
scrapy.utils.boto
import
is_botocore
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -86,20 +87,30 @@ class S3FilesStore(object):
}
def
__init__
(
self
,
uri
):
try
:
self
.
is_botocore
=
is_botocore
()
if
self
.
is_botocore
:
import
botocore.session
session
=
botocore
.
session
.
get_session
()
self
.
s3_client
=
session
.
create_client
(
's3'
,
aws_access_key_id
=
self
.
AWS_ACCESS_KEY_ID
,
aws_secret_access_key
=
self
.
AWS_SECRET_ACCESS_KEY
)
else
:
from
boto.s3.connection
import
S3Connection
self
.
S3Connection
=
S3Connection
except
ImportError
:
raise
NotConfigured
(
"missing boto library"
)
assert
uri
.
startswith
(
's3://'
)
self
.
bucket
,
self
.
prefix
=
uri
[
5
:].
split
(
'/'
,
1
)
def
stat_file
(
self
,
path
,
info
):
def
_onsuccess
(
boto_key
):
checksum
=
boto_key
.
etag
.
strip
(
'"'
)
last_modified
=
boto_key
.
last_modified
modified_tuple
=
parsedate_tz
(
last_modified
)
modified_stamp
=
int
(
mktime_tz
(
modified_tuple
))
if
self
.
is_botocore
:
checksum
=
boto_key
[
'ETag'
].
strip
(
'"'
)
last_modified
=
boto_key
[
'LastModified'
]
modified_stamp
=
time
.
mktime
(
last_modified
.
timetuple
())
else
:
checksum
=
boto_key
.
etag
.
strip
(
'"'
)
last_modified
=
boto_key
.
last_modified
modified_tuple
=
parsedate_tz
(
last_modified
)
modified_stamp
=
int
(
mktime_tz
(
modified_tuple
))
return
{
'checksum'
:
checksum
,
'last_modified'
:
modified_stamp
}
return
self
.
_get_boto_key
(
path
).
addCallback
(
_onsuccess
)
...
...
@@ -111,24 +122,40 @@ class S3FilesStore(object):
return
c
.
get_bucket
(
self
.
bucket
,
validate
=
False
)
def
_get_boto_key
(
self
,
path
):
b
=
self
.
_get_boto_bucket
()
key_name
=
'%s%s'
%
(
self
.
prefix
,
path
)
return
threads
.
deferToThread
(
b
.
get_key
,
key_name
)
if
self
.
is_botocore
:
return
threads
.
deferToThread
(
self
.
s3_client
.
head_object
,
Bucket
=
self
.
bucket
,
Key
=
key_name
)
else
:
b
=
self
.
_get_boto_bucket
()
return
threads
.
deferToThread
(
b
.
get_key
,
key_name
)
def
persist_file
(
self
,
path
,
buf
,
info
,
meta
=
None
,
headers
=
None
):
"""Upload file to S3 storage"""
b
=
self
.
_get_boto_bucket
()
key_name
=
'%s%s'
%
(
self
.
prefix
,
path
)
k
=
b
.
new_key
(
key_name
)
if
meta
:
for
metakey
,
metavalue
in
six
.
iteritems
(
meta
):
k
.
set_metadata
(
metakey
,
str
(
metavalue
))
h
=
self
.
HEADERS
.
copy
()
if
headers
:
h
.
update
(
headers
)
buf
.
seek
(
0
)
return
threads
.
deferToThread
(
k
.
set_contents_from_string
,
buf
.
getvalue
(),
headers
=
h
,
policy
=
self
.
POLICY
)
if
self
.
is_botocore
:
return
threads
.
deferToThread
(
self
.
s3_client
.
put_object
,
Bucket
=
self
.
bucket
,
Key
=
key_name
,
Body
=
buf
,
Metadata
=
{
k
:
str
(
v
)
for
k
,
v
in
six
.
iteritems
(
meta
)},
ACL
=
self
.
POLICY
)
else
:
b
=
self
.
_get_boto_bucket
()
k
=
b
.
new_key
(
key_name
)
if
meta
:
for
metakey
,
metavalue
in
six
.
iteritems
(
meta
):
k
.
set_metadata
(
metakey
,
str
(
metavalue
))
h
=
self
.
HEADERS
.
copy
()
if
headers
:
h
.
update
(
headers
)
return
threads
.
deferToThread
(
k
.
set_contents_from_string
,
buf
.
getvalue
(),
headers
=
h
,
policy
=
self
.
POLICY
)
class
FilesPipeline
(
MediaPipeline
):
...
...
tests/test_feedexport.py
浏览文件 @
cfc567f4
...
...
@@ -22,7 +22,6 @@ from scrapy.extensions.feedexport import (
)
from
scrapy.utils.test
import
assert_aws_environ
,
get_s3_content_and_delete
from
scrapy.utils.python
import
to_native_str
from
scrapy.utils.boto
import
is_botocore
class
FileFeedStorageTest
(
unittest
.
TestCase
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录