【问题标题】:getting error 400 while following the generated get_serving_url() for an image在为图像生成 get_serving_url() 时出现错误 400
【发布时间】:2014-04-24 22:08:10
【问题描述】:

thumbnail 是 images.Image() 的一个实例,没关系 - 我可以将其保存到 ndb 数据存储区并按照此处所述提供它:Displaying Blob Images in Python (App Engine)

一切似乎都正常,但我无法导航到我的开发服务器上生成的 URL(此时我无法在 gae 上尝试它)。我的做法如下:

blobstore_file = files.blobstore.create(mime_type='image/jpg') 
with files.open(blobstore_file, 'a') as f:
    f.write(thumbnail)
files.finalize(blobstore_file)
url = images.get_serving_url(blobstore_file)

当我转到 Blobstore Viewer 时,我可以很好地看到图片。但是,生成的 URL

http://localhost:8080/_ah/img//blobstore/writable:VjNUUUVINDZEOE9BQTlSMTNKSVFIMEJQN1RMWUIyUjFNUTROQjlZVjlKQlBSME1aR1c4M1NKRENRUVA3UktDSA==

返回 400 Bad Request,这是在日志中抛出的错误:

ERROR    2014-04-24 12:36:58,508 blob_image.py:168] Failed to parse image path "/_ah/img//blobstore/writable:VkFEMDVQMjNSNVQyT1NGTDFWQjMxRDU4SzhKM1hJOEMzNk5DQzgxOTlEWUtKRUhMQlQ0WTlGMFpCNFlXQU9DVA=="

任何帮助将不胜感激,因为谷歌搜索并没有发现任何问题。谢谢,


编辑:按照 radia 的建议进行更改后,我现在收到如下错误消息:

WARNING  2014-04-24 13:57:37,025 tasklets.py:409] suspended generator transaction(context.py:941) raised AttributeError('Key' object has no attribute 'reference')
ERROR    2014-04-24 13:57:37,025 webapp2.py:1553] 'Key' object has no attribute 'reference'
Traceback (most recent call last):
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/home/radek/google_appengine/google/appengine/ext/deferred/deferred.py", line 309, in post
    self.run_from_request()
  File "/home/radek/google_appengine/google/appengine/ext/deferred/deferred.py", line 304, in run_from_request
    run(self.request.body)
  File "/home/radek/google_appengine/google/appengine/ext/deferred/deferred.py", line 146, in run
    return func(*args, **kwds)
  File "/home/radek/google_appengine/google/appengine/ext/ndb/utils.py", line 179, in inner_wrapper
    return wrapped_decorator(func, args, kwds, **options)
  File "/home/radek/google_appengine/google/appengine/ext/ndb/model.py", line 3718, in transactional
    func, args, kwds, **options).get_result()
  File "/home/radek/google_appengine/google/appengine/ext/ndb/tasklets.py", line 325, in get_result
    self.check_success()
  File "/home/radek/google_appengine/google/appengine/ext/ndb/tasklets.py", line 371, in _help_tasklet_along
    value = gen.send(val)
  File "/home/radek/google_appengine/google/appengine/ext/ndb/context.py", line 937, in transaction
    result = callback()
  File "/home/radek/google_appengine/google/appengine/ext/ndb/model.py", line 3726, in <lambda>
    return transaction_async(lambda: func(*args, **kwds), **options)
  File "/home/radek/prasowalnia/models.py", line 75, in create_link
    blob_key = files.blobstore.get_blob_key(blobstore_file)
  File "/home/radek/google_appengine/google/appengine/api/files/blobstore.py", line 126, in get_blob_key
    namespace='')])[0]
  File "/home/radek/google_appengine/google/appengine/api/datastore.py", line 651, in Get
    return GetAsync(keys, **kwargs).get_result()
  File "/home/radek/google_appengine/google/appengine/api/datastore.py", line 626, in GetAsync
    return _GetConnection().async_get(config, keys, local_extra_hook)
  File "/home/radek/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1565, in async_get
    pbs = [key_to_pb(key) for key in keys]
  File "/home/radek/google_appengine/google/appengine/ext/ndb/model.py", line 629, in key_to_pb
    return key.reference()

但不幸的是,这可能是此处概述的真正错误。仅当我在事务中运行此错误时才会收到此错误。否则,一切正常,我可以从 url 检索图像就好了。

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    我已经遇到过这个问题,尝试使用带有 blob_key 的 images.get_serving_url() 方法

    blobstore_file = files.blobstore.create(mime_type='image/jpg') 
    with files.open(blobstore_file, 'a') as f:
        f.write(thumbnail)
    files.finalize(blobstore_file)
    blob_key = files.blobstore.get_blob_key(file_name)
    url = images.get_serving_url(blob_key )
    

    你会得到一个有效的网址

    【讨论】:

    • 感谢很多辐射,这有很大帮助!现在我有了 url,如果我只知道 url,有什么办法可以访问 blob?我已经弄清楚了保存部分,但是如果我只存储 url,以后如何删除 blob?再次感谢您!
    • 生成的url的最后一部分是blob key,所以可以解析然后edit_blob_info = BlobInfo.get(blob_key) edit_blob_info.delete()
    猜你喜欢
    • 2022-11-22
    • 2022-11-10
    • 2013-07-16
    • 2018-08-27
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多