Bouw een eenvoudige, maar effectieve uploader voor afbeeldingen met deze Python-tutorial.

Een van de aantrekkelijkste kenmerken van een moderne applicatie is de mogelijkheid om afbeeldingen te plaatsen. Afbeeldingen zoals foto's, illustraties en animaties geven een toepassing een visuele aantrekkingskracht.

Hoewel afbeeldingen belangrijk zijn, kunnen ze de app vertragen en de beveiligingsbedreigingen voor de database vergroten.

Voor applicaties die op Django zijn gebouwd, is het uploaden van afbeeldingen eenvoudig en veilig. Django heeft een gespecialiseerde functie die zorgt voor het uploaden van afbeeldingen.

Laten we leren hoe u afbeeldingen naar een Django-app kunt uploaden zonder de beveiliging in gevaar te brengen.

Wat je nodig hebt

Voordat u begint met het uploaden van afbeeldingen, moet u ervoor zorgen dat u aan de volgende vereisten voldoet:

  • Python installeren
  • Pip installeren
  • Installeren pijpenv (je kunt ook venv gebruiken als je dat wilt)
  • Django installeren
  • Je hebt een bestaande Django-app die afbeeldingen nodig heeft
instagram viewer

Nu je de nodige afhankelijkheden hebt, laten we beginnen.

1. Kussen installeren

Django heeft een Afbeeldingsveld in zijn modellen. Het veld slaat afbeeldingsuploads op op een opgegeven locatie in het bestandssysteem, niet in de database. Kussen is een Python-bibliotheek die controleert op afbeeldingen in het ImageField.

Installeren kussen gebruik de onderstaande opdracht:

pipenv install pillow

Als u venv gebruikt, gebruikt u in plaats daarvan deze opdracht

pip install pillow

2. Model maken

Creëer een Afbeeldingsveld referentie in de databank. Voeg dan de uploaden naar redenering in het model. Het argument definieert een opslaglocatie in het bestandssysteem.

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'

De methode aan het einde helpt om de gegevens om te zetten in strings.

Migreer en commit vervolgens de nieuwe wijzigingen in de database. Vervolgens moet u de projectinstellingen bewerken.

Navigeer naar de projectinstelling. Onder de titel # Statische bestanden (CSS, JavaScript, afbeeldingen), voeg de media-URL toe.

# 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')

Door media-URL's aan instellingen toe te voegen, wordt een specifieke route gedefinieerd om geüploade afbeeldingen weer te geven. Het mediabestand slaat de app-afbeeldingen op. Het pad zal er als volgt uitzien: 127.0.0.1:8000/media/profile/image.jpg

Update de SJABLONEN array in de projectinstellingen. Toevoegen django.sjabloon.context_processors.media naar sjablonenarray.

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'
],
},
},
]

De media-instelling van de processor helpt bij het laden van de geüploade afbeeldingen in de app-sjablonen.

Vervolgens moet u de toevoegen MEDIA_ROOT route naar de app-URL's. Dit zal helpen om de geüploade afbeeldingen naar de ontwikkelingsserver te laden.

Importeer eerst de projectinstellingen uit het django.conf moduul en een statische functie. Voeg dan toe aan de urlpatronen een statische route die de locatie van de geüploade bestanden laat zien.

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. Uploaden van afbeeldingen testen

Voer vervolgens de server uit:

python manage.py runserver

Als er geen fouten zijn, navigeer dan naar het Django-beheerderspaneel door een beheerdersroute toe te voegen aan de basis-URL, http://127.0.0.1:8000/admin.

Als u in het beheerderspaneel op het profielmodel klikt, ziet u onderaan een afbeeldingsveld toegevoegd.

Wanneer u een afbeelding uploadt, ziet u een nieuwe map gemaakt in de app-map met de naam media. Wanneer u de map opent, ziet u de afbeelding die u via het beheerderspaneel hebt geüpload.

6. Geef de geüploade afbeelding weer

U moet de profielsjabloon bijwerken om de profielafbeelding weer te geven.

Je voegt een img tag en vul het met de profielfoto attribuut. De Afbeeldingsveld heeft een URL-attribuut dat de absolute URL naar het bestand geeft. U kunt de vorm en het uiterlijk van de afbeelding specificeren met behulp van CSS-klassen.

{% 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 %}

U kunt de server laten draaien om de afbeelding te laden. Controleer vervolgens de sjabloon in de browser om de weergegeven afbeelding te zien.

Afbeeldingen uploaden in een Django-app

Django maakt het gemakkelijk om afbeeldingen in uw applicaties te uploaden. Django heeft een gespecialiseerd veld voor zijn modellen dat het bestandstype toevoegt en controleert voordat het wordt geüpload.

Het ImageField biedt een absoluut pad naar een bestandssysteem om de afbeeldingen op te slaan. Het opslaan van de afbeeldingen in een bestandssysteem verhoogt de snelheid van de app en zorgt ervoor dat de database niet wordt geïnfiltreerd met schadelijke bestanden.