如何从Django应用程序上传图片到Cloudinary

196 阅读5分钟

从Django应用程序向Cloudinary上传图片

有时在从事需要使用图像的应用程序时,将图像上传到服务器这样一个简单的过程会变得很困难。如果你把你的应用程序部署到像Heroku这样的平台,你就不能保存图像。

另外,我们可以让图片存储在数据库中,但数据库的大小会随着时间的推移而爆炸。因此,一个原因是图像应该存储在外部服务中,如Cloudinary、AWS S3或Imgur。

Cloudinary的优势在于 "配置快速而简单"。在本教程中,我们将学习如何使用Cloudinary在Django中保存图片。

Cloudinary是一个为网站和移动应用程序提供的端到端图像和视频管理解决方案。它涵盖了从图片和视频的上传、存储、操作、优化到交付的所有内容。

创建一个账户是免费的,你还可以获得25GB的存储空间。

前提条件

要继续学习本教程,你需要在你的机器上安装Python3

对Django的基本了解将有助于读者更好地跟读。

创建和设置一个新的Django项目

让我们从创建一个新的虚拟环境开始。

虚拟环境允许你在你的电脑上创建不同的空间,使用不同的库和版本。

通过创建一个虚拟环境,你就可以为一个项目分开安装必要的库,而不需要全局安装。

现在,你创建一个虚拟环境env ,如下图所示。

$ python -m venv /path/to/new/virtual/environment

在这里,我们指定/path/to/new/virtual/environmentenv

在创建后,你可以使用下面的命令激活虚拟环境。

$ source env/bin/activate

激活环境后,我们可以用下面的命令来安装Django。

$ pip install django

现在,让我们创建一个新的Django项目photoapp ,使用。

$ django-admin startproject photoapp

然后,我们创建一个Django应用程序。

$ django-admin startapp photos

让我们把我们的应用程序添加到已安装的应用程序列表中。导航到photoapp 目录并编辑settings.py 文件。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photos',
    ]

设置Cloudinary

现在,让我们前往Cloudinary网站,创建一个新的账户。

点击Sign Up 按钮,填写你的详细资料,创建一个账户。

安装

使用以下命令在我们的项目中安装Cloudinary模块。

$ pip install cloudinary

接下来,我们必须将Cloudinary添加到settings.py 中已安装的应用程序的列表中,像这样。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photos',
    'cloudinary'
    ]

我们还需要在settings.py 中包含 Cloudinary 的 Python 类。

import cloudinary
import cloudinary.uploader
import cloudinary.api

配置

为了使用Cloudinary Django库,我们必须配置我们的cloud_name,api_key, 和api_secret

我们可以在账户控制台的 Dashboard 页面上找到我们特定的配置凭证,如下所示。

Cloudinary dashboard page

Cloudinary 仪表板页面

settings.py 中添加配置凭证,如下图所示。

# adding config
cloudinary.config( 
  cloud_name = "YOUR_CLOUD_NAME", 
  api_key = "YOUR_API_KEY", 
  api_secret = "YOUR_API_SECRET" 
)

创建一个模型

迁移是Django将你对模型所做的改变(增加一个字段,删除一个模型,等等)传播到你的数据库模式的方式。

photos 目录中,编辑models.py 文件,并在其中添加以下几行代码。

from django.db import models
from cloudinary.models import CloudinaryField

class photos(models.Model):
    # title field
    title = models.CharField(max_length=100)
    #image field
    image = CloudinaryField('image')

现在,让我们通过运行下面的命令将我们的模型迁移到数据库中。

# migrating the app and database changes
$ python manage.py makemigrations

# final migrations
$ python manage.py migrate

超级用户拥有在Django admin中创建、编辑、更新和删除数据的权限。我们通过运行下面的命令来创建一个超级用户。

$ python manage.py createsuperuser 

现在让我们在admin.py 文件中注册照片的模型,这样我们就可以在Django管理部分修改它。

from django.contrib import admin
from .models import photos

admin.site.register(photos)

现在,我们可以登录到管理页面了。

要登录到管理区,请到这个链接localhost:8000/admin,用我们刚刚创建的超级用户的详细信息登录。

Django admin login page

Django管理员登录页面

Django admin page

Django管理页面

现在,让我们在照片类别中添加一张图片,测试它是否上传到Cloudinary。

点击图片,然后点击Add Photo ,添加一张图片。

Add photo

添加照片

Photo added

添加的照片

为了确认图片是否被成功上传,点击刚刚添加的图片,并点击那里的链接。

我们也可以通过进入Cloudinary账户的media library 部分来确认。

创建一个视图

现在,让我们创建一个视图,以查看图片。

添加以下代码到你的views.py 文件。

from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

让我们创建我们的templates 文件夹。在该文件夹中,创建一个index.html 文件,如photos/templates/index.html

在添加我们的HTML代码之前,让我们为新创建的视图快速创建一个新的URL。

urls.py 文件中添加以下代码。

from django.contrib import admin
from django.urls import path
from photos import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='index'),
]

让我们也在views.py 文件中导入我们的photos 模型。

我们还需要为渲染添加上下文,这样我们就可以在我们的模板中使用图片。

from django.shortcuts import render
from .models import photos #import photos model

def index(request):
    # imports photos and save it in database
    photo = photos.objects.all()
    # adding context 
    ctx = {'photo':photo}
    return render(request, 'index.html', ctx)

现在,让我们为显示图片的HTML模板工作。

打开我们之前创建的index.html 文件,粘贴以下代码。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Photoapp</title>
    </head>
    <body>
        <h2>Cloudinary Fish</h2>
        <!-- loop through all the images -->
        {% for pic in photo %}
        <h2>{{pic.title}}</h2>
            <img src="{{pic.image.url}}" alt="fish">
        {% endfor %}
    </body>
</html>

在上面的代码中,我们用一个for-loop ,来浏览所有的图片。

Image of a fish

在HTML页面上显示一条鱼的图片

结语

最后,我们已经学会了Cloudinary如何为我们的网页提供一个更好的处理媒体内容的方法。我们还学会了从Django应用程序上传图片。

总结一下。

  • 读者学会了从我们的Django应用程序上传图片到Cloudinary。
  • 读者了解了Cloudinary如何提供一种更好的方式来存储图片。
  • 读者学会了建立一个Django应用程序并将其与Cloudinary集成。