Przewodnik tworzenia aplikacji do skracania adresów URL za pomocą Django

Najlepsza metoda, aby opanować Django lub inną umiejętność, polega na praktycznym zastosowaniu wiedzy poprzez realizację konkretnych projektów.

Django jest najpopularniejszym frameworkiem wykorzystywanym w Pythonie do tworzenia witryn internetowych. Jego bogate funkcje wbudowane oraz szeroka gama bibliotek zewnętrznych sprawiły, że stał się jednym z najbardziej cenionych frameworków webowych na świecie.

Jest szybki, stabilny i oferuje mnóstwo wbudowanych rozwiązań. Na przykład, system uwierzytelniania użytkowników umożliwia skupienie się na kluczowych funkcjonalnościach aplikacji. Możliwe jest również instalowanie dodatkowych pakietów, by realizować jeszcze bardziej zaawansowane zadania. Przykładem jest Django-allauth, który pozwala na rejestrację użytkowników za pomocą ich kont w mediach społecznościowych.

Jednak nie można pominąć faktu, że Django jest frameworkiem o tak rozbudowanej strukturze, że początki pracy z nim bywają trudne.

Dlatego dzisiaj stworzymy od podstaw w pełni funkcjonalną aplikację w Django.

Po zakończeniu tego poradnika:

  • Stworzysz aplikację do skracania adresów URL
  • Zrozumiesz działanie wzorca MVT w Django
  • Poznasz etapy tworzenia projektu

Wymagania wstępne

Poniższe wymagania nie są konieczne, ale mogą ułatwić Ci pracę z tym tutorialem. Jeśli jednak nie masz doświadczenia w żadnym z wymienionych obszarów, nie musisz się martwić. Najważniejszy jest pierwszy krok.

  • Podstawowa wiedza o komendach systemu UNIX (ls, cd, rm, touch)
  • Elementarne zrozumienie klas i funkcji w Pythonie
  • Zainstalowany Python na Twoim komputerze (może to oczywiste, ale warto wspomnieć)
  • Mile widziane, jeśli masz już jakieś doświadczenie z Django

Kompletny, działający kod znajdziesz w repozytorium Github.

Teraz, gdy wszystkie założenia są jasne, przejdźmy do sedna.

Opis projektu

W ramach tego tutoriala stworzymy narzędzie do skracania linków. Mówiąc prościej, skracacz linków to usługa, która pobiera długi adres URL i przekształca go w krótki, łatwiejszy do zapamiętania.

Na przykład, jeśli chcesz udostępnić post na Twitterze i dołączyć do niego link do swojej strony, ale zbliżasz się do limitu znaków, możesz skorzystać ze skracacza URL.

Zobaczmy to na przykładzie.

Jak widzisz, skracacz adresów URL przyjmuje długi adres URL i zwraca jego krótszą wersję. To właśnie zbudujemy dzisiaj.

Dzięki temu projektowi będziesz miał okazję przećwiczyć wzorzec MVT, zrozumiesz podstawy projektowania baz danych za pomocą modeli Django oraz nauczysz się, jak przekazywać informacje użytkownikowi za pomocą widoków, adresów URL i szablonów.

Struktura projektu w Django

Strona internetowa w Django opiera się na jednym projekcie, który składa się z wielu oddzielnych aplikacji. Każda z tych aplikacji ma własną, specyficzną funkcjonalność i może działać niezależnie.

Wyobraźmy sobie złożoną aplikację internetową, jak na przykład Stack Overflow. Jej działanie opiera się na dwóch głównych aspektach:

  • Zarządzanie użytkownikami: logowanie, wylogowanie, reputacja, uprawnienia
  • Forum: pytania, odpowiedzi, tagi, filtry

Zgodnie ze strukturą witryny Django, cały projekt nosiłby nazwę StackOverflow i składałby się z dwóch podstawowych aplikacji: aplikacji użytkowników oraz aplikacji forum.

Każda z tych aplikacji jest niezależna funkcjonalnie. Oznacza to, że każda z nich zawiera kompletny kod potrzebny do poprawnego działania.

Obejmuje to modele (strukturę bazy danych), widoki (obsługę żądań i odpowiedzi), specyficzne wzorce adresów URL, a także szablony i pliki statyczne (obrazy, CSS, JavaScript). W rezultacie, każda aplikacja Django może być ponownie wykorzystana, ponieważ jest w stanie działać samodzielnie.

Podsumowując, projekt to zbiór ustawień konfiguracyjnych i aplikacji, które razem tworzą aplikację internetową. Natomiast aplikacja Django jest częścią projektu, która działa niezależnie (posiada wszystkie elementy niezbędne do działania), a jej zadaniem jest realizacja określonej funkcji.

Konfiguracja projektu Django

W tym fragmencie skonfigurujemy projekt Django. W tym celu wykorzystamy szereg narzędzi, takich jak środowisko wirtualne do zarządzania zależnościami Pythona oraz najważniejsze skrypty Django: django-admin i manage.py.

Środowisko wirtualne

Zawsze zalecane jest korzystanie z środowisk wirtualnych podczas tworzenia aplikacji w Django. To najskuteczniejsza metoda zarządzania konkretnym zestawem zależności. Jego głównym celem jest izolowanie pakietów programistycznych od tych zainstalowanych globalnie.

Utwórzmy zatem środowisko wirtualne za pomocą wbudowanego polecenia Pythona.

Uwaga: Ta metoda wymaga Pythona w wersji 3.6 lub nowszej.

python -m venv .venv

Ta komenda wykorzystuje polecenie python -m lub python –mod. W zasadzie uruchamia moduł lub bibliotekę jako skrypt. W tym przypadku venv to biblioteka, którą uruchamiamy, a .venv jest nazwą środowiska wirtualnego, które chcemy stworzyć.

Mówiąc prościej, ta komenda oznacza:

Hej Pythonie, uruchom jako skrypt wbudowaną bibliotekę venv i stwórz virtualenv o nazwie .venv

Teraz aktywujmy utworzone przed chwilą środowisko wirtualne za pomocą następującej komendy.

source .venv/bin/activate

Aby upewnić się, że w nowym środowisku wirtualnym nie masz żadnych zainstalowanych pakietów, uruchom:

pip freeze

Jeśli prawidłowo aktywowałeś środowisko wirtualne, nie powinieneś otrzymać żadnych danych wyjściowych. Dzieje się tak, ponieważ jeszcze nic nie zainstalowaliśmy.

Przejdźmy do Django

Aby stworzyć aplikację do skracania adresów URL, zaczniemy od zainstalowania pakietu Django. Django jest pakietem zewnętrznym, dlatego należy go zainstalować za 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

Uwaga: Pamiętaj, że $ to jedynie symbol wiersza poleceń.

Aby sprawdzić, czy instalacja przebiegła pomyślnie, ponownie zweryfikuj zainstalowane pakiety w naszym środowisku wirtualnym.

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

Nie przejmuj się, jeśli otrzymane wersje będą różnić się od moich. Jeśli Django działa w wersji 3.x, możesz bez problemu kontynuować.

Rozpoczęcie projektu Django

Po instalacji Django nadszedł czas na stworzenie struktury serwisu skracającego adresy URL. Pamiętasz, czym jest projekt Django? Utwórzmy go, uruchamiając następujące polecenie.

django-admin startproject config

Wyjaśniając to polecenie: django-admin to narzędzie wiersza poleceń, które realizuje wszystkie zadania potrzebne do utworzenia projektu Django. „startproject” to polecenie wykonywane przez narzędzie Django-admin, a config to nazwa projektu, który zamierzamy utworzyć.

Warto podkreślić, że config może mieć dowolną nazwę. Powodem, dla którego używam config jako nazwy tego projektu, jest po prostu wygoda. Miło jest móc przełączać się między projektami przy zachowaniu tej samej konwencji nazewnictwa. Nie wahaj się więc stosować innych nazw, gdy tylko masz taką ochotę.

Jak widzisz, teraz masz folder config/, a w nim znajduje się wiele plików. Strukturę plików projektu omówimy później. Na razie przejdźmy do katalogu projektu i uruchommy lokalny serwer.

cd config/

Najważniejszym plikiem, z którego będziesz korzystać, jest skrypt manage.py. Ma on te same funkcje co django-admin, ale jego główną zaletą jest możliwość zarządzania ustawieniami podczas uruchamiania projektu.

Teraz sprawdźmy, czy wszystko działa prawidłowo.

python manage.py runserver

Tworzenie aplikacji do skracania adresów URL

Czas utworzyć główną aplikację projektu. W tym celu użyjemy pliku manage.py.

python manage.py startapp urlshortener

Spowoduje to utworzenie aplikacji Django o nazwie urlshortener. Jeśli uruchomisz polecenie tree, otrzymasz coś takiego:

.
├── 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

Wyjaśnijmy funkcje poszczególnych plików. „config” to nazwa naszego projektu i została tak nazwana zgodnie z przyjętą konwencją. Wewnątrz folderu config znajduje się plik settings.py, w którym ustawiamy wszystkie parametry konfiguracyjne projektu. urls.py to globalna konfiguracja adresów URL w projekcie. Definiuje ona ścieżki URL wszystkich aplikacji w projekcie.

Pliki asgi.py i wsgi.py nie powinny Cię na razie zbytnio absorbować. Służą one do konfigurowania aplikacji podczas wdrażania.

Manage.py to skrypt Pythona, który umożliwia uruchamianie wszystkich dostępnych poleceń Administratora Django.

Wchodząc do folderu urlshortener, czyli nazwy naszej nowo utworzonej aplikacji, zauważysz, że istnieje tajemniczy folder „migracje/” oraz kilka innych plików kluczowych dla logiki aplikacji.

apps.py to miejsce, gdzie znajduje się konfiguracja aplikacji. Zazwyczaj nie ma potrzeby modyfikowania tego pliku, chyba że zajmujesz się bardzo zaawansowanymi aspektami.

admin.py to miejsce, gdzie rejestrujemy modele, aby były widoczne w panelu administracyjnym Django.

Models.py jest bardzo istotny. W tym module definiujemy modele, które (upraszczając) są sposobem przechowywania danych. Więcej o modelach powiemy sobie później.

migracje/ to folder, w którym przechowywane są migracje Django. Przyjrzymy się temu dokładniej w dalszej części.

testing.py to plik, gdzie umieszczamy testy. W tym poradniku nie będziemy omawiać zagadnień testowania.

views.py to plik, w którym przechowujemy widoki. Określają one sposób interakcji użytkownika z różnymi aspektami aplikacji.

Instalacja aplikacji Django

Zanim przejdziemy dalej, otwórz plik settings.py i zmodyfikuj zmienną INSTALLED_APPS, dodając do niej aplikację 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',
]

To standardowa procedura podczas tworzenia aplikacji. Zawsze, gdy tworzysz nową aplikację, nie zapomnij jej zainstalować w ustawieniach projektu.

Zrozumienie wzorca MVT

Wzorzec Model, Widok, Szablon (Model, View, Template) to wzorzec projektowania oprogramowania, który programiści Django wykorzystują do tworzenia aplikacji internetowych.

Opiera się na trzech głównych koncepcjach: Model (dane), Widok (interakcja użytkownika z danymi) oraz Szablon (sposób prezentacji danych użytkownikowi).

Modele to klasy Pythona, które określają wszystkie pola i zachowanie danych, które chcemy przechowywać. Zazwyczaj każdy model odpowiada unikalnej tabeli w bazie danych.

Widoki w najprostszym ujęciu to obiekty wywoływalne, które przyjmują żądanie od użytkownika i generują odpowiedź. Pomiędzy tymi operacjami odbywa się cała logika biznesowa. Wiem, że termin „logika biznesowa” jest dość mglisty, więc pozwól, że wyjaśnię, o co dokładnie chodzi. Logika biznesowa to sposób tworzenia, przechowywania i usuwania danych, nic więcej.

Na koniec szablony to dokumenty tekstowe (zwykle HTML), które są wyświetlane użytkownikom. Ich celem jest prezentacja danych w jak najbardziej przejrzysty sposób. Django zawiera mini-język o nazwie Język Szablonów Django (DTL), który umożliwia włączenie części możliwości Pythona do dokumentów tekstowych.

Tworzenie modelu skracacza

Po szybkim omówieniu wzorca MVT, przejdźmy do tworzenia skracacza adresów URL w Django od podstaw.

Na początek zdefiniujmy model skracacza w pliku 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}'

Wiem, że to spora klasa, w której dzieje się wiele rzeczy, ale nie panikuj. Omówię krok po kroku każdy ważny element.

Wyjaśnienie modelu

Na początku importujemy moduł models. Ten moduł zawiera wszystkie funkcje potrzebne do utworzenia modelu Django.

Przyglądając się modelowi „Shortener”, pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że rozszerza on models.Model. W istocie, każdy model w dowolnej aplikacji Django musi być podklasą klasy models.Model.

Następnie definiujemy wszystkie pola, które model będzie miał w bazie danych. Pole „created” to data i godzina utworzenia skróconego linku, dlatego do tego celu używamy pola DateTimeField. Używamy argumentu auto_now_add=True, ponieważ chcemy, aby to pole było zmieniane tylko podczas tworzenia instancji.

Drugie pole, times_followed, odnosi się do tego, ile razy skrócony adres URL został użyty. Jest to pole PositiveIntegerField, a jego domyślna wartość ustawiona jest na zero. Oznacza to, że za każdym razem, gdy tworzona jest instancja, Django automatycznie ustawia wartość tego pola na 0.

Z kolei long_url odnosi się do adresu URL wprowadzonego przez użytkownika. Jest to pole URLField, ponieważ chcemy, by użytkownik wprowadzał tylko poprawne adresy URL w formacie: http://twojadomena.com.

Ostatnie pole, short_url, zawiera kilka interesujących aspektów. Określamy, że może mieć maksymalnie 15 znaków, musi być unikalne, co oznacza, że w tym polu nie mogą występować powtórzenia. Na koniec zaznaczamy, że można je pozostawić puste, co oznacza, że podczas korzystania z formularzy użytkownicy nie będą musieli sami tworzyć skróconego kodu.

Wewnętrzna klasa Meta informuje, jak ma się zachowywać ta klasa. Ustalamy, że kolejność (wywołanie Shortener.objects.all()) obiektów skracających będzie oparta o ich datę utworzenia, od najnowszych do najstarszych.

Metoda __str__ określa, jak model ma być wyświetlany. Czyli, jeśli mamy obiekt z long_url = “https://blog.example.com/” i skróconą częścią “123456” i go wypiszemy:

https://blog.example.com/ to 123456

Teraz nadszedł czas, by znaleźć sposób na generowanie losowego skrótu.

Tworzenie mechanizmu skracania

Stworzymy 2 funkcje, które pomogą w naszym zadaniu. Pierwsza wygeneruje losowy kod, a druga zapobiegnie powstawaniu powtarzających się losowych kodów w modelu Shortener. W tym celu stwórzmy plik utils.py w aplikacji „urlshortener”.

touch utils.py

W tym pliku użyjemy funkcji choice z wbudowanego modułu random. Ułatwi nam to wybieranie losowych znaków do stworzenia kodu.

'''
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 widać, ta funkcja zwraca losowy ciąg o długości określonej w pliku ustawień, domyślnie 7. Używamy funkcji getattr, aby pobrać zmienną z modułu ustawień, ale bez generowania błędu, jeśli ta zmienna nie jest zdefiniowana.

Zróbmy szybkie obliczenia. Jeśli mamy 7 miejsc, w których może być maksymalnie 62 dostępnych znaków w każdym miejscu, to możliwych permutacji jest:

Zatem, na podstawie tych szybkich obliczeń, skrót URL może mieć do 2,5 biliona różnych kodów. Możemy więc zapomnieć o problemie wyczerpania losowych skróconych adresów URL.

Chociaż istnieje tak wiele permutacji, istnieje niewielkie prawdopodobieństwo uzyskania powtarzających się skrótów. Jest to problem, ponieważ ustawiliśmy pole short_url jako unikatowe. Z tego powodu tak przydatna jest poniższa funkcja.

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

Zobaczmy, co tu się dzieje. Funkcja przyjmuje jako argument instancję modelu „Shortener”. Najpierw generowany jest losowy kod za pomocą metody create_random_code. Następnie pobierana jest klasa modelu i sprawdzane jest, czy istnieje już inny obiekt z takim samym short_url. Jeśli tak, funkcja uruchamia się ponownie, ale jeśli wszystko jest w porządku, zwraca wygenerowany kod.

Później przetestujemy tę funkcję, korzystając z powłoki Django.

Po utworzeniu pomocniczych funkcji użyjmy ich do tworzenia losowych kodów w modelu skracacza.

Modyfikacja metody zapisywania

Na koniec klasy „Shortener” zmodyfikujemy metodę save modelu. Metoda save jest wywoływana za każdym razem, gdy obiekt jest zapisywany w bazie danych, więc zobaczymy, jak jej użyć.

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

Metoda save jest nadpisywana, co oznacza, że wprowadzamy nową funkcjonalność do wcześniej istniejącej metody nadrzędnej. W zasadzie mówimy Django, że za każdym razem, gdy zapisywany jest obiekt „Shortener” i short_url nie jest określony, musi być on wypełniony losowym kodem.

Uruchomienie migracji

Teraz czas wykonać i uruchomić migracje dla modelu Shortener. W tym celu uruchom następujące komendy w głównym folderze 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

Na razie nie musisz się martwić, czym są migracje. Pamiętaj tylko, że uruchomienie tych dwóch komend sprawi, że Django utworzy plik bazy danych db.sqlite w oparciu o zdefiniowane modele.

Utwórzmy kilka obiektów za pomocą powłoki Django.

$ python manage.py shell

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

Tak mniej więcej będą działać wszystkie obiekty skracające.

Pisanie widoków

Jak wspominałem wcześniej, widok to po prostu funkcja, która przyjmuje żądanie i zwraca odpowiedź. Stwórzmy zatem widok hello world.

Podstawowa odpowiedź szablonu

W pliku „urlshortener/views.py” utwórz funkcję 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")

Zwraca on prosty komunikat „Hello world”. Później zobaczysz, jak to wygląda w przeglądarce. Teraz utwórzmy plik „urls.py”, który będzie zawierał wszystkie wzorce adresów URL aplikacji.

touch urls.py

Dodaj następujący kod:

'''
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")
]

Zmienna appname deklaruje (jak sama nazwa wskazuje) przestrzeń nazw aplikacji urlshortener.

Wyjaśniając w skrócie, importujemy plik funkcję path, która zwraca element do uwzględnienia we wzorcach adresów URL aplikacji. Atrybut name to przestrzeń nazw ścieżki, którą można w razie potrzeby wywołać wewnątrz szablonów.

Teraz zmodyfikujmy ogólne adresy 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'))
]

Teraz ponownie uruchom serwer.

python manage.py runserver

Po uruchomieniu serwera zobaczysz prosty komunikat „Hello world”. Dzieje się tak, ponieważ dołączamy wzorce adresów URL z aplikacji skracającej do całego projektu.

To dopiero początek. Teraz stworzymy formularz, który umożliwi użytkownikowi samodzielne generowanie skróconych adresów URL.

Tworzenie formularzy

W Django, formularz to po prostu klasa, która umożliwia pobieranie danych od użytkownika.

Utworzymy plik forms.py. Zgodnie z konwencją, wszystkie formularze aplikacji przechowujemy w tym pliku.

cd urlshortener/
touch forms.py

W tym pliku stworzymy klasę „ShortenerForm”, która będzie rozszerzać „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',)

Jest to formularz modelu, ponieważ jego zadaniem jest stworzenie obiektu modelu na podstawie danych wprowadzonych przez użytkownika. Wykorzystujemy także argument widget, który umożliwia nam określenie atrybutu „class” (klasa w CSS, a nie w Pythonie). Zrobimy to, ponieważ później będziemy stylizować aplikację za pomocą Bootstrapa.

Ukończenie widoków

Po zbudowaniu formularzy nadszedł czas na stworzenie ostatecznej logiki biznesowej naszej aplikacji.

Przejdź do pliku views.py w aplikacji skracającej i zmodyfikuj widok home_view. Możesz też zerknąć na repozytorium Github w tym momencie, aby zorientować się w strukturze projektu.

Aplikacja do skracania adresów URL ma dwa widoki:

  • Widok strony głównej: wyświetla formularz i nowy adres URL, jeśli formularz został już przesłany.
  • Widok przekierowania: przekierowuje użytkownika do długiego adresu URL i dodaje 1 do licznika kliknięć.
  • Zacznijmy od widoku strony głównej, który jest najbardziej złożony. Będziesz musiał zaimportować model i formularz Shortener. Nadal będziemy korzystać z funkcji, abyś mógł zrozumieć przepływ danych w widoku. Będziesz także używać ścieżki do szablonu (który jeszcze nie został utworzony).

    Widok strony głównej

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

    newsblog.pl