我无法创建适用于“dev_appserver.py”的Google云端存储文件。 [英] I can't create a Google Cloud Storage file working on "dev_appserver.py."

查看:156
本文介绍了我无法创建适用于“dev_appserver.py”的Google云端存储文件。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  INFO〜module.py:639] default:HEAD / _ah / gcs /app_default_bucket/multibytes.txt HTTP / 1.1404  -  
ERROR〜gcs.py:99]期望Google Storage的状态[200]。但是获得状态404.
路径:'/app_default_bucket/multibytes.txt'。
请求标题:无。
响应标题:{'date':'Mon,2014年7月07日12:59:44 GMT','server':'Development / 2.0','connection':'close'}。
正文:''。
额外信息:无。
Traceback(最近一次调用最后一次):
文件/gcs.py,行97,状态
stat = gcs.stat(/%s /%s%(b ,nm))
文件/cloudstorage/cloudstorage_api.py,第142行,在stat
body = content)
文件/cloudstorage/errors.py,第132行,在check_status
引发NotFoundError(msg)
NotFoundError:期望Google Storage的状态[200]。但是获得状态404.
路径:'/app_default_bucket/multibytes.txt'。
请求标题:无。
响应标题:{'date':'Mon,2014年7月07日12:59:44 GMT','server':'Development / 2.0','connection':'close'}。
正文:''。
额外信息:无。

这是我自定义的GCS cliet类。

 #encoding:utf-8 

将cloudstorage导入为gcs

class mycustomgcsclient:


$ b def create(self,name,data,** options):
options ['retry_params'] = gcs.RetryParams(backoff_factor = 1.1)

如果不是options.get('content_type'):
选项['content_type'] ='octet-stream'

如果isintance(name,unicode):
name = name.encode('utf-8')

path ='/ mybucketname /%s'%name
try:
with gcs.open(path,'w ',** options)作为f:
f.write(data)
返回True
,除了Exception外e:
logging.exception(e)

return False
$ b $ if if __name __ =='__ main__':
data ='一些数据...¥n'

文件名='somedir /%s '%u'sample.txt'
mycustomgcsclient()。create(filename,data)#no发生了错误。

filename ='somedir /%s'%u'あいうえおお.txt'
mycustomgcsclient().create(filename,data)#error发生在这一行。

我只在使用多字节文件名时遇到上述错误。



使用ascii的文件名时,我没有发现任何错误。



我使用的是一个GCS Client Library(Python) a href =https://developers.google.com/appengine/docs/python/googlecloudstorageclient/download =nofollow> https://developers.google.com/appengine/docs/python/googlecloudstorageclient/download

我的dev_appserver.py的版本是Development SDK 1.9.6,
,这个工作在MacOS X Marve ..(?忘记了)。



是否有解决方案?

解决方案

在将它编码为utf8之后,在名称上调用 urllib.quote()



这是修改后的版本GCS Python演示( http:// appengine-gcs- client.googlecode.com/svn/trunk /python/demo/main.py )使用多字节文件名正常工作:

 #Copyright 2012 Google Inc 。 版权所有。 
#encoding:utf-8

使用GCS客户端操作
存储桶和文件的示例应用程序的修改版本


导入日志
导入os
导入cloudstorage as gcs
导入webapp2
导入urllib

from google.appengine.api import app_identity

my_default_retry_params = gcs.RetryParams(initial_delay = 0.2,
max_delay = 5.0,
backoff_factor = 2,
max_retry_period = 15)
gcs。 set_default_retry_params(my_default_retry_params)

$ b $ class MainPage(webapp2.RequestHandler):
GCS演示应用程序的主页。

def get(self):
bucket_name = os.environ.get('BUCKET_NAME',
app_identity.get_default_gcs_bucket_name())

self.response.headers ['Content-Type' ] ='text / plain'
self ('Demo GCS Application from Version:'
+ os.environ ['CURRENT_VERSION_ID'] +'\\\
')
self.response.write('使用存储桶名称:' + bucket_name +'\\\
\\\
')

bucket ='/'+ bucket_name
filename = bucket +'/'+ urllib.quote(u'あいうえお.txt')。 ('utf8'))
self.tmp_filenames_to_clean_up = []

尝试:
self.create_file(文件名)
self.response.write('\ n'\
')

self.read_file(文件名)
self.response.write('\\\
\\\
')

除了Exception, e:
logging.exception(e)
self.delete_files()
self.response.write('\\\
\\\
运行演示时发生错误! '
'请查看日志以获取更多详细信息。\\\
')

else:
self.delete_files()
self.response.write('\\ b' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'在打开的调用中指定的retry_params将覆盖此特定文件句柄的默认
retry params。

参数:
文件名:filename。

self.response.write('Creating file%s \\\
'%
urllib.unquote(filename).decode('utf-8'))

write_retry_params = gcs.RetryParams (backoff_factor = 1.1)
gcs_file = gcs.open(filename,
'w',
content_type ='text / plain',
options = {'x-goog-meta -foo':'foo',
'x-goog-meta-bar':'bar'},

gcs_file.write('some data ...¥n \ n')
gcs_file.close()
self.tmp_filenames_to_clean_up.append(filename)

$ b def read_file(self,filename):
self.response.write('File Content:\\\
')

gcs_file = gcs.open(filename )
self.response.write(gcs_file.readline())
gcs_file.close()

def delete_files(self):
self.response.write( '删除文件... \\\
')
用于self.tmp_filenames_to_clean_up中的文件名:
self.response.write('删除文件%s\\\
'%
urllib.unquote(文件名).decode('utf-8'))
尝试:
gcs.delete(文件名)
除gcs.NotFoundError:
通过

app = webapp2.WSGIApplication([('/',MainPage)],
debug = True)


I caught an error as below.

INFO     ~ module.py:639] default: "HEAD /_ah/gcs/app_default_bucket/multibytes.txt HTTP/1.1" 404 -
ERROR    ~ gcs.py:99] Expect status [200] from Google Storage. But got status 404.
Path: '/app_default_bucket/multibytes.txt'.
Request headers: None.
Response headers: {'date': 'Mon, 07 Jul 2014 12:59:44 GMT', 'server': 'Development/2.0', 'connection': 'close'}.
Body: ''.
Extra info: None.
Traceback (most recent call last):
  File "/gcs.py", line 97, in status
        stat = gcs.stat("/%s/%s" % (b,nm))
  File "/cloudstorage/cloudstorage_api.py", line 142, in stat
        body=content)
  File "/cloudstorage/errors.py", line 132, in check_status
        raise NotFoundError(msg)
NotFoundError: Expect status [200] from Google Storage. But got status 404.
Path: '/app_default_bucket/multibytes.txt'.
Request headers: None.
Response headers: {'date': 'Mon, 07 Jul 2014 12:59:44 GMT', 'server': 'Development/2.0', 'connection': 'close'}.
Body: ''.
Extra info: None.

this is my custom GCS cliet class for example.

# encoding: utf-8

import cloudstorage as gcs

class mycustomgcsclient:

  #...

  def create(self,name,data,**options):
    options['retry_params'] = gcs.RetryParams(backoff_factor=1.1)

    if not options.get('content_type'):
      options['content_type'] = 'octet-stream'

    if isintance(name,unicode):
      name = name.encode('utf-8')

    path = '/mybucketname/%s' % name
    try:
      with gcs.open(path,'w',**options) as f:
        f.write(data)
      return True
    except Exception as e:
      logging.exception(e)

    return False

if __name__=='__main__':
  data = 'some data ...¥n'

  filename = 'somedir/%s' % u'sample.txt'
  mycustomgcsclient().create(filename,data) # no error occured.

  filename = 'somedir/%s' % u'あいうえお.txt'
  mycustomgcsclient().create(filename,data) # error occured in this line.

I have caught an error above when only using a multibytes filename.

I have not caught any error when using a ascii's filename.

I am using a "GCS Client Library (Python)" given by on https://developers.google.com/appengine/docs/python/googlecloudstorageclient/download.

My dev_appserver.py's version is Development SDK 1.9.6, and this is working on MacOS X Marve..(? forgotten).

Is there some solutions?

解决方案

I think you may need to call urllib.quote() on the name after encoding it to utf8.

Here is a modified version of the GCS Python demo (http://appengine-gcs-client.googlecode.com/svn/trunk/python/demo/main.py) that works properly using a multibyte filename:

# Copyright 2012 Google Inc. All Rights Reserved.
# encoding: utf-8

"""A modified version of the sample app that uses GCS client to operate on
   bucket and file.
"""

import logging
import os
import cloudstorage as gcs
import webapp2
import urllib

from google.appengine.api import app_identity

my_default_retry_params = gcs.RetryParams(initial_delay=0.2,
                                          max_delay=5.0,
                                          backoff_factor=2,
                                          max_retry_period=15)
gcs.set_default_retry_params(my_default_retry_params)


class MainPage(webapp2.RequestHandler):
  """Main page for GCS demo application."""

  def get(self):
    bucket_name = os.environ.get('BUCKET_NAME',
                                 app_identity.get_default_gcs_bucket_name())

    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write('Demo GCS Application running from Version: '
                        + os.environ['CURRENT_VERSION_ID'] + '\n')
    self.response.write('Using bucket name: ' + bucket_name + '\n\n')

    bucket = '/' + bucket_name
    filename = bucket + '/' + urllib.quote(u'あいうえお.txt'.encode('utf8'))
    self.tmp_filenames_to_clean_up = []

    try:
      self.create_file(filename)
      self.response.write('\n\n')

      self.read_file(filename)
      self.response.write('\n\n')

    except Exception, e:
      logging.exception(e)
      self.delete_files()
      self.response.write('\n\nThere was an error running the demo! '
                          'Please check the logs for more details.\n')

    else:
      self.delete_files()
      self.response.write('\n\nThe demo ran successfully!\n')

  def create_file(self, filename):
    """Create a file.

    The retry_params specified in the open call will override the default
    retry params for this particular file handle.

    Args:
      filename: filename.
    """
    self.response.write('Creating file %s\n' %
                        urllib.unquote(filename).decode('utf-8'))

    write_retry_params = gcs.RetryParams(backoff_factor=1.1)
    gcs_file = gcs.open(filename,
                        'w',
                        content_type='text/plain',
                        options={'x-goog-meta-foo': 'foo',
                                 'x-goog-meta-bar': 'bar'},
                        retry_params=write_retry_params)
    gcs_file.write('some data ...¥n\n')
    gcs_file.close()
    self.tmp_filenames_to_clean_up.append(filename)


  def read_file(self, filename):
    self.response.write('File Content:\n')

    gcs_file = gcs.open(filename)
    self.response.write(gcs_file.readline())
    gcs_file.close()

  def delete_files(self):
    self.response.write('Deleting files...\n')
    for filename in self.tmp_filenames_to_clean_up:
      self.response.write('Deleting file %s\n' %
                          urllib.unquote(filename).decode('utf-8'))
      try:
        gcs.delete(filename)
      except gcs.NotFoundError:
        pass

app = webapp2.WSGIApplication([('/', MainPage)],
                              debug=True)

这篇关于我无法创建适用于“dev_appserver.py”的Google云端存储文件。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆