Създайте прост, но ефективен инструмент за качване на изображения с този урок за Python.

Една от най-привлекателните характеристики на едно модерно приложение е способността му да побира изображения. Изображения като снимки, илюстрации и анимации придават визуална привлекателност на приложението.

Докато изображенията са важни, те могат да забавят приложението и да увеличат заплахите за сигурността на базата данни.

За приложения, създадени на Django, качването на изображения е лесно и сигурно. Django има специализирана функция, която осигурява качване на изображения.

Нека научим как да качваме изображения в приложение на Django, без да компрометираме сигурността.

От какво имаш нужда

Преди да започнете да качвате изображения, уверете се, че отговаряте на следните изисквания:

  • Инсталирайте Python
  • Инсталирайте Pip
  • Инсталирай Pipenv (можете също да използвате venv, ако желаете)
  • Инсталирайте Django
  • Имате съществуващо приложение Django, което се нуждае от изображения

Сега, когато имате необходимите зависимости, нека започнем.

instagram viewer

1. Инсталиране на възглавница

Джанго има ImageField в своите модели. Полето съхранява качените изображения на определено място във файловата система, а не в базата данни. Възглавница е библиотека на Python, която проверява за изображения в ImageField.

Да инсталираш възглавница използвайте командата по-долу:

pipenv install pillow

Ако използвате venv, използвайте тази команда вместо това

pip install pillow

2. Създаване на модел

Създайте ImageField справка в базата данни. След това добавете upload_to аргумент в модела. Аргументът дефинира място за съхранение във файловата система.

classProfile(models.Model):
name = models.CharField(max_length=80, blank=True)
bio = models.TextField(max_length=254, blank=True)
profile_picture = models.ImageField(upload_to='photos/')

def__str__(self):
returnf'{self.user.username} profile'

Методът в края помага за преобразуването на данните в низове.

След това мигрирайте и ангажирайте новите промени в базата данни. След това трябва да редактирате настройките на проекта.

Придвижете се до настройката на проекта. Под заглавието # Статични файлове (CSS, JavaScript, изображения), добавете URL адреса на медията.

# https://docs.djangoproject.com/en/4.0/howto/static-files/
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
 
# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
 
# STATICFILES_STORAGE =
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Добавянето на медийни URL адреси към настройките определя конкретен маршрут за показване на качени изображения. Медийният файл съхранява изображенията на приложението. Пътят ще изглежда така: 127.0.0.1:8000/media/profile/image.jpg

Актуализирайте ШАБЛОНИ масив в настройките на проекта. Добавете django.template.context_processors.media към масива от шаблони.

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.template.context_processors.media'
],
},
},
]

Медийната настройка на процесорите помага за зареждането на качените изображения в шаблоните на приложението.

След това трябва да добавите MEDIA_ROOT маршрут до URL адресите на приложението. Това ще помогне за зареждането на качените изображения на сървъра за разработка.

Първо импортирайте настройките на проекта от django.conf модул и а статична функция. След това добавете към URL модели статичен маршрут, показващ местоположението на качените файлове.

from django.urls import path
from. import views
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
urlpatterns = [
path('', views.index, name = 'index'),
path('profile', views.profile, name='profile'),
]
 
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

5. Тестови качвания на изображения

След това стартирайте сървъра:

python manage.py runserver

Ако няма грешки, отидете до администраторския панел на Django, като добавите администраторски маршрут към основния URL адрес, http://127.0.0.1:8000/admin.

В административния панел, когато щракнете върху модела на профил, ще видите поле за изображение, добавено в долната част.

Когато качите изображение, ще видите нова папка, създадена в папката на приложението, наречена медии. Когато отворите папката, ще видите изображението, което сте качили през админ панела.

6. Показване на качено изображение

Трябва да актуализирате шаблона на профила, за да покажете изображението на профила.

Ще добавите img маркирайте и го попълнете с снимка на профила атрибут. The ImageField има URL атрибут, който предоставя абсолютния URL адрес на файла. Можете да укажете формата и външния вид на изображението с помощта на CSS класове.

{% extends "base.html" %}
{% load static %}

{% block content %}
<divclass="card mb-3 bg-whitesmoke"style="max-width: fit content;">
<divclass="row g-0">
<divclass="col-md-4">
<imgsrc="{{user.profile.profile_picture.url}}"width="100px"alt="profile pic"class="mx-auto d-block rounded-circle" />
div>
div>
div>
{% endblock %}

Можете да стартирате сървъра, за да заредите изображението. След това проверете шаблона в браузъра, за да видите показаното изображение.

Как да качвате изображения в приложение Django

Django улеснява качването на изображения във вашите приложения. Django има специализирано поле в своите модели, което добавя и проверява типа на файла преди качване.

ImageField предоставя абсолютен път до файлова система за съхраняване на изображенията. Съхраняването на изображенията във файлова система увеличава скоростта на приложението и гарантира, че базата данни не е проникната с вредни файлове.