gpt4 book ai didi

python - Django 从外部 api 缓存图像

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:50 25 4
gpt4 key购买 nike

我想缓存从 google api 传入我的应用程序的图像。

设置(请注意,我更喜欢使用 FileBasedCache):

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
'LOCATION': CACHE_ROOT,
'TIMEOUT': 0,
}
}

这是我的代码,每当我想要获取任何照片时都会调用它:

    # Shorting later syntaxes
photo_ref = photo["photo_reference"]
# Setting up cache key
cache_key = "PHOTO_IMAGE" + photo_ref
# Getting previous cache
cached_data = cache.get(cache_key)

# Checking if previously cached data exists
if cached_data != None:
# Returning cached data
return cached_data
else:
image = "IMAGE NONE"

# Getting temp image
URL = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&key=" + settings.KEY
URL += "&photoreference=" + photo_ref
result = urllib.request.urlretrieve(URL)
img_temp = NamedTemporaryFile(delete = True)
img_temp.write(urlopen(URL).read())
img_temp.flush()

# Saving new data to cache
cache.set(cache_key, File(img_temp), django_settings.CACHES["default"]["TIMEOUT"])
return img_temp

但是这段代码让我困惑:

TypeError at /api/image_gallery/ChIJvxOujlf6PEcRIG3Mt57gV4A
cannot serialize '_io.BufferedRandom' object

完整回溯:

Internal Server Error: /api/image_gallery/ChIJvxOujlf6PEcRIG3Mt57gV4A
Traceback (most recent call last):
File "/home/dolidod/.local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/dolidod/.local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/dolidod/.local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/dolidod/.local/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/dolidod/.local/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/home/dolidod/.local/lib/python3.7/site-packages/rest_framework/views.py", line 495, in dispatch
response = self.handle_exception(exc)
File "/home/dolidod/.local/lib/python3.7/site-packages/rest_framework/views.py", line 455, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/dolidod/.local/lib/python3.7/site-packages/rest_framework/views.py", line 492, in dispatch
response = handler(request, *args, **kwargs)
File "/home/dolidod/coding/fest-apka/app/views.py", line 59, in get
print(places_info.get_place_images_gallery(places_info, place_id))
File "/home/dolidod/coding/fest-apka/app/scripts_for_api_control/high_level_code.py", line 135, in get_place_images_gallery
cache.set(cache_key, File(img_temp), django_settings.CACHES["default"]["TIMEOUT"])
File "/home/dolidod/.local/lib/python3.7/site-packages/django/core/cache/backends/filebased.py", line 54, in set
self._write_content(f, timeout, value)
File "/home/dolidod/.local/lib/python3.7/site-packages/django/core/cache/backends/filebased.py", line 44, in _write_content
file.write(zlib.compress(pickle.dumps(value, self.pickle_protocol)))
File "/usr/lib/python3.7/tempfile.py", line 620, in func_wrapper
return func(*args, **kwargs)
TypeError: cannot serialize '_io.BufferedRandom' object
[03/Jul/2019 19:26:44] "GET /api/image_gallery/ChIJvxOujlf6PEcRIG3Mt57gV4A HTTP/1.1" 500 123133

我认为这一行是问题所在:cache.set(cache_key, File(img_temp), django_settings.CACHES["default"]["TIMEOUT"])

我认为 django 不知道如何处理图像。

我应该以某种方式转换此图像吗?如果我转换它,我如何重新获取该图像(以显示在我的模板中/发送到我的前端框架)。

或者也许我应该创建自己的模型来负责缓存(例如使用字段“updated_at”、“image”、“api_reference”)?

最佳答案

我不确定为什么要使用 NamedTemporaryFile 执行所有这些操作,更不知道为什么在将其传递到缓存之前将其包装在 File 对象中。 特别,因为 urlretrieve已经将对象作为临时文件保存到磁盘;由于某种原因,您所做的是将其检索到磁盘,然后获取 URL 并再次检索它,将其包装在临时文件中,然后将该临时文件包装在另一个 File 对象中。它不起作用也就不足为奇了。

您可以读取 urlretrieve 保存的文件并传递该文件,但这毫无意义。实际上,您应该使用 urlopen 来代替,并将读取结果直接传递到缓存。所以这只是:

result = urllib.request.urlopen(URL).read()
cache.set(cache_key, result)

关于python - Django 从外部 api 缓存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com