2022-11-20 11:35 Doba čtení: 28 min

Průvodce vytvořením aplikace pro zkracování adres URL s Django

Nejefektivnější metoda, jak se naučit Django či jakoukoli jinou dovednost, spočívá v praktickém využití nabytých znalostí prostřednictvím vytváření funkčních projektů.

Django představuje jeden z nejpopulárnějších frameworků pro tvorbu webových aplikací v Pythonu. Díky svým integrovaným funkcím a rozsáhlému výběru balíčků třetích stran si získal celosvětovou oblibu.

Je známé svou rychlostí, spolehlivostí a množstvím vestavěných nástrojů, jako je například systém ověřování uživatelů, který vám umožní soustředit se na klíčové funkce vaší aplikace. Dále můžete snadno implementovat externí balíčky pro složitější úkoly, jako je například Django-allauth, který umožňuje registraci uživatelů pomocí sociálních sítí.

Nicméně, Django je tak rozsáhlý rámec, že pro nováčky může být obtížné s ním začít. Django je komplexní nástroj.

V tomto návodu si proto společně krok za krokem vytvoříme plně funkční Django aplikaci.

Po dokončení tohoto tutoriálu budete schopni:

  • Vytvořit aplikaci pro zkracování URL adres.
  • Pochopit architekturu Django MVT.
  • Osvojit si pracovní postup při vytváření Django projektů.

Požadavky pro začátek

Následující požadavky jsou doporučené pro snadnější sledování tohoto návodu. Pokud s některými z nich nemáte zkušenosti, nemusíte se obávat. Nejdůležitější je začít.

  • Základní znalost příkazů UNIX (ls, cd, rm, touch).
  • Základní porozumění třídám a funkcím v Pythonu.
  • Python nainstalovaný na vašem počítači (samozřejmost, ale museli jsme ji zmínit).
  • Zkušenosti s vývojem v Django jsou výhodou.

Veškerý kód z tohoto tutoriálu je dostupný v tomto Github repozitáři.

Nyní, když máte všechny potřebné informace, můžeme se pustit do práce.

Specifikace projektu

V tomto tutoriálu si vytvoříme zkracovač URL adres. Zkracovač URL je služba, která transformuje dlouhou URL adresu na kratší, snáze sdílitelnou verzi.

Například, pokud chcete sdílet tweet s odkazem na váš web, ale máte omezený počet znaků, můžete využít zkracovač URL adres.

Podívejme se na to graficky.

Zkracovač URL přijme dlouhou URL adresu a vygeneruje krátkou URL adresu. Toto je přesně to, co se naučíte vytvářet v tomto návodu.

Během tohoto projektu si procvičíte používání architektury MVT, osvojíte si základy návrhu databáze pomocí Django modelů a naučíte se, jak uživatelům zobrazovat data pomocí views, URL a šablon.

Struktura Django projektu

Webové aplikace v Django jsou postaveny na principu jednoho projektu, který se skládá z několika samostatných aplikací. Každá aplikace má své specifické funkce a může fungovat nezávisle.

Představte si komplexní webovou aplikaci, jako je například Stack Overflow. Její funkčnost je rozdělena do dvou hlavních oblastí:

  • Správa uživatelů: Přihlášení, Odhlášení, Hodnocení, Oprávnění.
  • Fórum: Otázky, Odpovědi, Štítky, Filtry.

Podle struktury Django by se projekt nazýval StackOverflow a obsahoval by dvě hlavní aplikace: aplikaci pro správu uživatelů a aplikaci pro fórum.

Každá z těchto aplikací má nezávislé funkce a obsahuje veškerý kód potřebný pro svou správnou činnost.

To zahrnuje modely (struktura databáze), views (zpracování požadavků a generování odpovědí), specifické URL schémata a samozřejmě šablony a statické soubory (obrázky, CSS, JavaScript). Každá aplikace Django je tak potenciálně znovu použitelná, protože dokáže fungovat sama o sobě.

Zkráceně, projekt označuje soubor konfigurací a aplikací, které tvoří webovou aplikaci. Aplikace Django je pak samostatnou součástí projektu, která je navržena pro vykonávání konkrétního úkolu.

Konfigurace Django projektu

V této části si nastavíme Django projekt. Budeme používat nástroje jako virtuální prostředí pro správu závislostí Pythonu a důležité skripty Django, jako jsou django-admin a manage.py.

Virtuální prostředí

Vřele doporučujeme pracovat s virtuálním prostředím při vývoji Django aplikací. Jedná se o efektivní způsob, jak udržovat specifickou sadu závislostí. Hlavním účelem je izolovat balíčky potřebné pro vývoj od globálních balíčků.

Vytvořme si virtuální prostředí pomocí vestavěného příkazu v Pythonu.

Poznámka: Tato metoda vyžaduje Python 3.6 nebo novější.

python -m venv .venv

Tento příkaz používá `python -m` nebo `python --mod`. V podstatě spouští modul nebo knihovnu jako skript. V našem případě je venv knihovna, kterou spouštíme, a .venv je název virtuálního prostředí, které chceme vytvořit.

Zjednodušeně řečeno, tento příkaz říká:

Pythone, spusť jako skript knihovnu venv a vytvoř virtuální prostředí s názvem .venv.

Nyní aktivujte vytvořené virtuální prostředí pomocí tohoto příkazu:

source .venv/bin/activate

Pro ověření, že v novém virtuálním prostředí nejsou nainstalovány žádné balíčky, spusťte:

pip freeze

Pokud jste správně aktivovali virtuální prostředí, nezobrazí se žádný výstup. Je to proto, že jsme dosud nic neinstalovali.

Instalace Djanga

Pro vytvoření naší aplikace pro zkracování URL adres začneme instalací balíčku Django. Jelikož se jedná o balíček třetí strany, musíme jej nainstalovat pomocí Pip (Pip Installs Packages).

$ pip install django
Collecting django
  Downloading Django-3.2.1-py3-none-any.whl (7.9 MB)
     |████████████████████████████████| 7.9 MB 344 kB/s 
Collecting asgiref<4,>=3.3.2
  Using cached asgiref-3.3.4-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Installing collected packages: asgiref, sqlparse, pytz, django
Successfully installed asgiref-3.3.4 django-3.2.1 pytz-2021.1 sqlparse-0.4.1

Poznámka: Symbol $ představuje váš shell prompt.

Pro ověření správné instalace znovu zkontrolujeme nainstalované balíčky v našem virtuálním prostředí.

$ pip freeze
asgiref==3.3.4
Django==3.2.1
pytz==2021.1
sqlparse==0.4.1

Není problém, pokud se verze, které získáte, liší od těch uvedených zde. Pokud je Django ve verzi 3.x, můžete bez obav pokračovat.

Zahájení Django projektu

Po instalaci Djanga je čas vytvořit strukturu našeho zkracovače URL adres. Vzpomínáte si, co je Django projekt? Vytvoříme ho spuštěním následujícího příkazu:

django-admin startproject config

V tomto příkazu django-admin je nástroj příkazového řádku, který provádí potřebné kroky k vytvoření Django projektu. Část "startproject" je příkaz spuštěný pomocí django-admin a config je název projektu, který si vytváříme.

Je důležité zdůraznit, že config může být libovolný název. Důvod, proč používáme config, je jen z praktických důvodů. Je vhodné střídat projekty a mít stále stejné pojmenování. Nebojte se proto použít jiné názvy projektů dle libosti.

Nyní vidíte, že máte složku config/ a uvnitř mnoho souborů. Později si probereme strukturu souborů projektu. Nyní vstupte do adresáře projektu a spusťte lokální server.

cd config/

Nejdůležitějším souborem, který budete používat, je skript manage.py. Má stejnou funkcionalitu jako django-admin, ale jeho hlavní výhodou je, že umožňuje spravovat nastavení při spuštění projektu.

Nyní se podíváme, zda vše funguje správně.

python manage.py runserver

Vytvoření aplikace pro zkracování URL

Je čas vytvořit hlavní aplikaci našeho projektu. Pro tento účel použijeme soubor manage.py.

python manage.py startapp urlshortener

Tím se vytvoří aplikace Django s názvem urlshortener. Pokud spustíte strom příkaz, dostanete něco takového.

.
├── config
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── urlshortener
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

Pojďme si ujasnit různé soubory, které jsme si do této chvíle vytvořili. "config" je název našeho projektu, je to konvence. V config najdete soubor settings.py, kde definujete nastavení projektu. urls.py je celková konfigurace URL v projektu. Definuje URL cesty pro všechny aplikace v projektu.

Soubory asgi.py a wsgi.py prozatím necháme stranou. Jsou určeny pro konfiguraci aplikace v produkčním prostředí.

manage.py je Python skript, který umožňuje spouštět veškeré dostupné příkazy Django-admin.

Pokud se podíváte do složky urlshortener, což je název aplikace, kterou jsme právě vytvořili, uvidíte zvláštní složku s názvem "migrations/" a několik dalších souborů, které jsou nezbytné pro logiku každé aplikace.

apps.py obsahuje konfiguraci aplikace. Obvykle není třeba se s ním zaobírat, pokud neděláte pokročilé věci.

admin.py slouží k registraci vašich modelů, aby byly viditelné v administračním panelu Django.

models.py je klíčový soubor. V něm definujete modely, které (jednoduše řečeno) představují strukturu ukládání dat. O modelech si povíme více později.

Migrations/ je složka, kam se ukládají migrace Django. Později se na ni podíváme podrobněji.

tests.py je soubor, kde se ukládají testy. V tomto tutoriálu se testováním nebudeme zabývat.

views.py je soubor, kde jsou uloženy views. Zjednodušeně řečeno, definuje interakci uživatele s aplikací.

Instalace Django aplikace

Předtím než budeme pokračovat, otevřete soubor settings.py a upravte proměnnou INSTALLED_APPS přidáním aplikace urlshortener.

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Custom apps
    'urlshortener',
]

Toto je běžný postup při vytváření aplikací. Nezapomeňte ji vždy nainstalovat v nastavení projektu.

Principy architektury MVT

Architektura Model, View, Template je softwarový design pattern, který vývojáři v Django využívají pro tvorbu webových aplikací.

Je založena na 3 hlavních konceptech: Model (data), View (interakce uživatele s daty), Template (zobrazení dat uživateli).

Modely jsou Python třídy, které definují strukturu a chování dat. Obvykle každý model odpovídá jedné tabulce v databázi.

Views jsou jednoduše řečeno volatelné objekty, které přijímají požadavek od uživatele a generují odpověď. Mezi tím probíhá obchodní logika. Chápu, že pojem „obchodní logika“ může být nejasný, proto si ho vyjasníme. Obchodní logika je způsob, jak se data vytvářejí, ukládají a mažou, nic víc.

A konečně, šablony jsou textové dokumenty (obvykle HTML), které se zobrazují uživatelům. Jejich účelem je prezentovat data co nejjasněji. Django obsahuje vlastní mini-jazyk, nazývaný Django Template Language (DTL), který umožňuje vkládat Python kód do textových dokumentů.

Tvorba modelu zkracovače

Nyní, když máte základní přehled o architektuře MVT, se můžeme pustit do vytváření zkracovače URL v Django od začátku.

Nejprve si definujeme model zkracovače v souboru models.py.

'''
Url shortener model
'''

from django.db import models

# Create your models here.

class Shortener(models.Model):
    '''
    Creates a short url based on the long one
    
    created -> Hour and date a shortener was created 
    
    times_followed -> Times the shortened link has been followed

    long_url -> The original link

    short_url ->  shortened link https://domain/(short_url)
    ''' 
    created = models.DateTimeField(auto_now_add=True)

    times_followed = models.PositiveIntegerField(default=0)    

    long_url = models.URLField()

    short_url = models.CharField(max_length=15, unique=True, blank=True)

    class Meta:

        ordering = ["-created"]


    def __str__(self):

        return f'{self.long_url} to {self.short_url}'

Vím, je to poměrně rozsáhlá třída s mnoha neznámými prvky, ale nezoufejte. Projdeme si krok za krokem všechny klíčové části.

Popis modelu

Nejprve importujeme modul models. Tento modul obsahuje veškerou funkcionalitu, kterou potřebujeme pro tvorbu Django modelu.

Když se podíváme na model "Shortener", první věcí, které si musíme všimnout, je, že dědí od models.Model. Ve skutečnosti každý model v libovolné Django aplikaci musí být podtřídou models.Model třídy.

Následně definujeme všechna pole, která bude model v databázi obsahovat. Pole "created" je datum a čas vytvoření zkráceného odkazu, pro tento účel používáme DateTimeField. Argument auto_now_add=True zajistí, že se pole změní pouze při vytvoření instance.

Druhé pole, times_followed, odkazuje na počet použití zkrácené URL adresy. Je to PositiveIntegerField a nastavujeme výchozí hodnotu nula. To znamená, že při každém vytvoření instance, bude Django automaticky vyplňovat toto pole nulou.

Na druhé straně long_url odkazuje na URL adresu zadanou uživatelem. Jedná se o URLField, protože chceme, aby uživatel zadával pouze znaky ve tvaru: http://vasweb.cz.

Poslední pole je short_url a obsahuje zajímavé detaily. Je stanoveno, že může obsahovat maximálně 15 znaků, musí být unikátní, tzn. že se hodnoty v tomto poli nesmí opakovat. Nakonec nastavíme, že může být ponecháno prázdné, což znamená, že při práci s formuláři uživatelé nebudou muset psát svůj vlastní zkrácený kód.

Vnitřní třída Meta nám udává, jak se má třída chovat, a nastavíme, že řazení objektů zkracovače (Shortener.objects.all()) bude podle nejnověji vytvořených.

Metoda __str__ říká, jak má být model zobrazen. Pokud tedy máme objekt s long_url = "https://etechblog.cz.com/" a zkrácenou částí "123456", tak po vytisknutí uvidíme:

https://etechblog.cz.com/ to 123456

Nyní je čas najít způsob, jak ukládat krátký odkaz náhodným způsobem.

Tvorba zkracovací funkce

Vytvoříme 2 vlastní funkce. První vygeneruje náhodný kód a druhá zajistí, že se náhodné kódy v modelu Shortener nebudou opakovat. Pro tento účel vytvořte soubor utils.py v aplikaci "urlshortener".

touch utils.py

V tomto souboru použijeme funkci choice z vestavěného modulu random. Ta nám umožní snadno vybrat náhodné znaky pro vytvoření kódu.

'''
Utilities for Shortener
'''
from django.conf import settings

from random import choice

from string import ascii_letters, digits

# Try to get the value from the settings module
SIZE = getattr(settings, "MAXIMUM_URL_CHARS", 7)

AVAIABLE_CHARS = ascii_letters + digits


def create_random_code(chars=AVAIABLE_CHARS):
    """
    Creates a random string with the predetermined size
    """
    return "".join(
        [choice(chars) for _ in range(SIZE)]
    )

Jak vidíte, tato funkce vrací náhodný řetězec o délce určené v souboru nastavení, nebo ve výchozí hodnotě 7. Funkce getattr slouží k získání proměnné z modulu settings, aniž by vyvolala chybu, pokud proměnná není zadána.

Pojďme si to trochu spočítat. Pokud máme 7 míst, kde může být až 62 různých znaků, tak možné permutace jsou:

Díky tomuto rychlému výpočtu vidíme, že zkrácená část může být vyplněna až 2,5 biliony různých kódů. Takže můžeme z hlavy vypustit obavy z duplicitních náhodných URL.

I když existuje takové množství permutací, stále je zde malá šance na získání opakovaných zkrácených částí. To je problém, protože jsme pole shortened_url nastavili jako unikátní. Proto je následující funkce tak užitečná.

def create_shortened_url(model_instance):
    random_code = create_random_code()
    # Gets the model class

    model_class = model_instance.__class__

    if model_class.objects.filter(short_url=random_code).exists():
        # Run the function again
        return create_shortened_url(model_instance)

    return random_code

Pojďme se podívat, co se tu děje. Funkce přijímá jako argument instanci modelu "Shortener". Nejprve funkce vygeneruje náhodný kód pomocí funkce create_random_code. Poté získá třídu modelu a zkontroluje, zda neexistuje jiný objekt se stejnou hodnotou short_url. Pokud ano, spustí se funkce znovu, pokud je vše v pořádku, vrátí náhodný kód.

Později si tuto funkci podrobněji prohlédneme pomocí shellu.

Po vytvoření užitkové funkce ji využijeme k tvorbě náhodných kódů v modelu zkracovače.

Úprava způsobu ukládání

Na konci třídy "Shortener" upravíme metodu save modelu. Tato metoda se volá pokaždé, když se objekt ukládá do databáze, podíváme se, jak ji využít.

# Import the function used to create random codes
from .utils import create_shortened_url

# At the end of the  Shortener model
    def save(self, *args, **kwargs):

        # If the short url wasn't specified
        if not self.short_url:
            # We pass the model instance that is being saved
            self.short_url = create_shortened_url(self)

        super().save(*args, **kwargs)

Metodu save přepisujeme, což znamená, že zavádíme novou funkcionalitu do již existující metody nadřazené třídy. V podstatě tím Django říkáme, že pokaždé, když se uloží objekt "Shortener" a short_url není definována, tak se musí vyplnit náhodným kódem.

Provedení migrací

Nyní je čas provést a spustit migrace modelu Shortener. Provedeme to spuštěním následujících příkazů v kořenové složce projektu.

$ python manage.py makemigrations
Migrations for 'urlshortener':
  urlshortener/migrations/0001_initial.py
    - Create model Shortener

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, urlshortener
Running migrations:
  ......
  # Apply the URL shortener migrations
  Applying urlshortener.0001_initial... OK

Zatím se nemusíte starat o to, co migrace znamenají. Jen mějte na paměti, že po spuštění těchto dvou příkazů, Django vytvoří db.sqlite databázi na základě vámi definovaných modelů.

Vytvořme si několik objektů pomocí Django shellu.

$ python manage.py shell

>>> from urlshortener.models import Shortener
>>> s = Shortener(long_url="https://etechblog.cz.com")
>>> s.short_url
''
>>> s.save()
>>> s.short_url
'kdWFVIc'
>>> s.long_url
'https://etechblog.cz.com'
>>> print(s)
https://etechblog.cz.com to kdWFVIc

V podstatě takto budou fungovat všechny objekty zkracovače.

Tvorba Views

Jak jsme již zmínili, view je jednoduchá funkce, která přijímá požadavek a vrací odpověď. Podívejme se, jak vytvořit jednoduchý view „Ahoj světe“.

Základní odpověď šablony

V souboru "urlshortener/views.py" vytvořte funkci home_view.

'''
Shortener views
'''
from django.shortcuts import render, get_object_or_404 # We will use it later

from django.http import HttpResponse 

# Create your views here.

def home_view(request):
    return HttpResponse("Hello world")

Vrací jednoduchou zprávu "Ahoj světe". Později uvidíte, jak bude vypadat v prohlížeči. Nyní vytvořte soubor "urls.py", do kterého umístíme URL schémata aplikace.

vytvořte urls.py

Vložte následující kód.

'''
Urls for shortener app urlshortener/urls.py
'''

from django.urls import path

# Import the home view
from .views import home_view

appname = "shortener"

urlpatterns = [
    # Home view
    path("", home_view, name="home")
]

Proměnná appname deklaruje jmenný prostor aplikace urlshortener.

Rychlé vysvětlení: importujeme funkci path, která vrací prvek, který má být zahrnut do URL schémat aplikace. Atribut name je jmenný prostor cesty, který je možné volat uvnitř šablon.

Nyní si upravíme celkové URL projektu.

# config/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    
    # Shortener Urls
    path('', include('urlshortener.urls'))
]

Nyní znovu spusťte server.

python manage.py runserver

Po spuštění serveru se zobrazí jednoduchá zpráva "Ahoj světe". Je to proto, že jste do celkového projektu zahrnuli URL schémata z aplikace zkracovače URL.

Toto je pouze začátek. Nyní je čas vytvořit formulář, který umožní uživatelům vytvářet zkrácené URL adres.

Tvorba formulářů

V Django formulář je jednoduchá třída, která umožňuje získávat vstup od uživatele.

Vytvoříme soubor forms.py. Je zvykem ukládat všechny formuláře aplikace do tohoto souboru.

cd urlshortener/
touch forms.py

V tomto souboru vytvoříme třídu "ShortenerForm", která bude dědit z "ModelForm".

'''
Shortener Forms urlshortener/forms.py
'''

from django import forms

from .models import Shortener

class ShortenerForm(forms.ModelForm):
    
    long_url = forms.URLField(widget=forms.URLInput(
        attrs={"class": "form-control form-control-lg", "placeholder": "Your URL to shorten"}))
    
    class Meta:
        model = Shortener

        fields = ('long_url',)

Jedná se o modelový formulář, protože jeho účelem je vytvářet modelové objekty z uživatelského vstupu. Používáme argument widget, který nám umožňuje specifikovat atribut "class" (třída v CSS, nikoliv Python). To proto, že později stylizujeme aplikaci pomocí Bootstrapu.

Kompletace View

Po vytvoření formuláře je čas dát aplikaci finální obchodní logiku.

Otevřete soubor views.py v aplikaci zkracovače a upravte view home_view. Můžete se podívat na Github repo, abyste získali představu o struktuře projektu.

Aplikace pro zkracování URL adres má dvě view:

  • Domovský view: Zobrazuje formulář zkracovače a novou URL, pokud již byl formulář odeslán.
  • View pro přesměrování: Přesměruje na dlouhou URL a přidá 1 k počtu návštěv.
  • Začneme domácím view, který je nejsložitější. Budete muset importovat model a formulář Shortener. Budeme používat funkci, protože chceme, abyste pochopili tok dat ve view. Budeme používat i cestu pro šablonu (kterou ještě nemáme vytvořenou).

    Domovský View

    '''
    Shortener views
    '''
    from django.shortcuts import render # We will use it later
    
    from django.http import HttpResponse, Http404, HttpResponseRedirect
    
    
    # Model
    from .models import Shortener
    
    # Custom form
    
    from .forms import ShortenerForm
    
    # Create your views here.
    
    def home_view(request):
        
        template="urlshortener/home.html"
    
        
        context = {}
    
        # Empty form
        context['form'] = ShortenerForm()
    
        if request.method == 'GET':
            return render(request, template, context)
    
        elif request.method == 'POST':
    
            used_form = ShortenerForm(request.POST)
    
            if used_form.is_valid():
                
                shortened_object = used_form.save()
    
                new_url = request.build_absolute_uri('/') + shortened_object.short_url
                
                long_url = shortened_object.long_url 
                 
                context['new_url']  = new_url
                context['long_url'] = long_url
                 
                return render(request, template, context)
    
            context['errors'] = used_form.errors
    
            return render(request, template, context)
    

    View je založen na dvou podmínkách:

  • Pokud je HTTP metoda GET: Do kontextu předáváme pouze formulář Shortener použí
  • Petra Kovářová
    Autor
    Czechia

    Sleduje mobilní technologie, Android/iOS a praktické návody pro uživatele.

    Předchozí článek
    To nejlepší z affiliate marketingu – průvodce pro začátečníky
    Další článek
    Co je to Zero Trust Security? Úvodní příručka