当前位置: 首页 > 知识库问答 >
问题:

如何将图像从Google Places API保存到Django应用程序中的ImageField?

艾自强
2023-03-14

我正在构建人口代码,用来自Google Places API的图像填充Django模型“City”。

这是模型:

class City(models.Model):
    city_image = models.ImageField(blank=True, upload_to='city_pictures')

我构建了返回照片的API URL:

#fetch image from this url
        city_image_url = ('https://maps.googleapis.com/maps/api/place/photo'
        '?maxwidth=%s'
        '&photoreference=%s'
        '&key=%s') % (maxwidth, city_image_ref, GoogleKey)

谷歌说回复是一张照片,我在Postman上测试过,所以我想这样做:

with urllib.request.urlopen(city_image_url) as response:
            city_image = response
created_city = City.objects.get_or_create(city_id=city_id)[0]
created_city.city_image = city_image 
#plus other fields

但我收到这个错误:

回溯(最近的最后一次调用):文件"C:\User\bnbih\Djangos\excurj_proj\population_script.py",第68行,填充()文件"C:\User\bnbih\Djangos\excurj_proj\population_script.py",第64行,填充created_city.save()文件"C:\用户\bnbih\AppData\本地\程序\Python\Python36-32\lib\site-包\django\db\模型\base.py",第796行,保存force_update=force_update,update_fields=update_fields)文件"C:\用户\bnbih\AppData\本地\程序\Python\Python36-32\lib\site-包\django\db\模型\base.py",第824行,save_base更新=自己。_save_table(原始、cls、force_insert、force_update、使用、update_fields)文件"C:\用户\bnbih\AppData\本地\程序\Python\Python36-32\lib\site-包\django\db\模型\base.py",non_pks]文件"C:\用户\bnbih\AppData\本地\程序\Python\Python36-32\lib\站点包\django\db\模型\base.py",第886行,用于non_pks中的f]文件"C:\用户\bnbih\AppData\本地\程序\Python\Python36-32\lib\站点包\django\db\模型\字段\files.py",第290行,pre_saveif文件而不是文件。_committed:属性错误:'HTTP响应'对象没有属性'_committed'

我正在使用Python 3和Django 1.10

共有2个答案

夔宏深
2023-03-14

在遵循上述答案和本教程之后

这让我可以将Google Places图片保存到ImageField:

首先,准备HTTP响应为图像的URL:

city_image_url = ('https://maps.googleapis.com/maps/api/place/photo'
        '?maxwidth=%s'
        '&photoreference=%s'
        '&key=%s') % (maxwidth, city_image_ref, GoogleKey) 

其次,检索实际图像并将其保存到变量:

retrieved_image = requests.get(city_image_url)

第三,在本地创建一个文件并将远程图像的内容写入其中:

with open(city_names[i] + '.jpg', 'wb') as f:
                f.write(retrieved_image.content)

第四,打开包含图像的文件,并将其转换为Django文件:

reopen = open(city_names[i] + '.jpg', 'rb')
            django_file = File(reopen)

第五,创建一个模型对象并将django文件保存在ImageField中,如下所示:

created_city = City.objects.get_or_create(city_id=city_id)[0]
#save it to the ImageField -> args are: 1. the name of the file that is to be saved in MEDIA_ROOT path 2. The Django file itself 3. save instance
created_city.city_image.save(city_names[i] + '.jpg', django_file, save=True)
created_city.save()

最后,这些是您需要的导入:

from django.core.files import File
import requests
斜和硕
2023-03-14

试试这个:

from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

city_image = NamedTemporaryFile(delete=True)
city_image.write(urllib2.urlopen(url).read())
city_image.flush()

created_city = City.objects.get_or_create(city_id=city_id)[0]
created_city.city_image = city_image 
 类似资料:
  • 问题内容: 好的,我已经尝试了几乎所有内容,但无法正常工作。 我有一个上面带有ImageField的Django模型 我有通过HTTP下载图像的代码(已测试并且可以工作) 图像直接保存到“ upload_to”文件夹中(upload_to是在ImageField上设置的文件夹) 我需要做的就是将已经存在的图像文件路径与ImageField相关联 我已经用6种不同的方式编写了这段代码。 我遇到的问题

  • 问题内容: 我有一个UIImageView,它允许用户放置并保存图像,直到可以保存为止。问题是,我不知道如何实际保存和检索放置在视图中的图像。 我已经将图像检索并放置在UIImageView中,如下所示: 它在我的UIImageView中显示选定的图像就很好了,但是我不知道如何保存它。我将视图的所有其他部分(主要是UITextfield)保存在Core Data中。我已经搜索了很多,然后尝试了很多

  • 如何添加图像并将其设置为我的应用程序背景 我知道你把你想要的图片粘贴到了drawable文件夹中。这是代码本身的问题,还是我应该创建一个RelativeLayout?或者仅仅是提供的代码中的一行更改? 这是我的代码,没有任何改动。

  • 问题内容: 基本上,我想做的是允许用户自己制作folder,然后转到activity包含的button来启动camera。 从这里我希望能够启动camera并将camera图像保存到新创建的文件夹中。 我在将camera图像保存到新创建的文件夹的最后一部分时遇到麻烦。 这是我的Code: 从这里我过渡到此活动: public class Press extends Activity { 请告诉我如

  • 问题内容: 我有这样的JavaScript代码 我的PHP代码是这样的 执行此代码时,我得到了一个零尺寸的png文件图像?我的代码有什么问题? 问题答案: 我最近不得不自己做。 首先,我将canvasData放入一个隐藏字段中,并将其发布到我的PHP页面中。 它以以下格式返回: 您需要首先拆分数据,因为这是标题信息。其余的是编码数据。 然后,在服务器上创建映像: 然后阅读以完成我想做的事情。 我非

  • 我正在开发一个Android应用程序,在某个时候我必须拍摄一张照片并将其保存到图库中。相机将打开并拍摄照片,但不会将其保存到多媒体资料中。这是我的密码: 布局: 有人能帮帮我吗?我已经搜索了其他类似的问题,但都没有帮助我。感谢大家,祝大家有美好的一天。