Ένας οδηγός για τη δημιουργία μιας εφαρμογής συντόμευσης διευθύνσεων URL με το Django

Ο καλύτερος τρόπος για να μάθετε το Django, ή οποιαδήποτε δεξιότητα, είναι να εφαρμόσετε τις γνώσεις που έχετε δημιουργώντας λειτουργικά έργα.

Το Django είναι το πιο χρησιμοποιούμενο πλαίσιο ανάπτυξης ιστού Python. Οι ενσωματωμένες δυνατότητες του και ο μεγάλος αριθμός πακέτων τρίτων το έχουν καταστήσει ένα από τα πιο αγαπημένα διαδικτυακά πλαίσια σε όλο τον κόσμο.

Είναι γρήγορο, αξιόπιστο και έχει πολλές ενσωματωμένες δυνατότητες. Για παράδειγμα, ένα σύστημα ελέγχου ταυτότητας οπών, που σας επιτρέπει να εστιάσετε στα κύρια χαρακτηριστικά της εφαρμογής σας. Επίσης, μπορείτε να εγκαταστήσετε εξωτερικά πακέτα για να ολοκληρώσετε ακόμη πιο σύνθετες εργασίες, όπως το Django-allauth, το οποίο σας επιτρέπει να εγγράφετε χρήστες στους λογαριασμούς κοινωνικής δικτύωσης τους.

Ας αποκαλύψουμε όμως κάποια γεγονότα. Django είναι ένα τόσο τεράστιο πλαίσιο που μερικές φορές είναι δύσκολο να ξεκινήσετε με αυτό.

Σήμερα λοιπόν θα δημιουργήσετε από την αρχή μια πλήρως λειτουργική εφαρμογή Django.

Μέχρι το τέλος αυτού του σεμιναρίου, θα:

  • Έχετε γράψει μια εφαρμογή συντόμευσης URL
  • Κατανοήστε το μοτίβο του Django MVT
  • Έχετε μάθει τη ροή εργασιών της δημιουργίας ενός έργου

Προαπαιτήσεις

Όλες οι ακόλουθες απαιτήσεις είναι προαιρετικές και θα σας βοηθήσουν να ακολουθήσετε μαζί με το σεμινάριο. Αλλά αν δεν έχετε εμπειρία με κανένα από αυτά, μην ανησυχείτε. Το πιο σημαντικό βήμα είναι το πρώτο.

  • Βασική κατανόηση εντολών UNIX (ls, cd, rm, touch)
  • Βασική κατανόηση τάξεων και συναρτήσεων Python
  • Η Python είναι εγκατεστημένη στον υπολογιστή σας (ίσως προφανές, αλλά έπρεπε να το συμπεριλάβω)
  • Θα ήταν υπέροχο αν έχετε ήδη φτιάξει κάτι με το Django

Όλος ο κώδικας εργασίας θα είναι διαθέσιμος σε αυτό Αποθετήριο Github.

Τώρα που έχετε ξεκάθαρες τις προηγούμενες έννοιες, ας μπούμε στο θέμα.

Δήλωση έργου

Σε αυτό το σεμινάριο, πρόκειται να δημιουργήσετε ένα συντομευτικό URL. Βασικά, το πρόγραμμα συντόμευσης URL είναι μια υπηρεσία που παίρνει μια μεγάλη διεύθυνση URL και τη μετατρέπει σε συμπαγή.

Για παράδειγμα, εάν θέλετε να μοιραστείτε ένα tweet και θέλετε να συμπεριλάβετε έναν σύνδεσμο προς τον ιστότοπό σας, αλλά αντιμετωπίζετε το όριο χαρακτήρων, θα μπορούσατε να χρησιμοποιήσετε ένα συντόμευση διεύθυνσης URL.

Ας το δούμε με ένα γραφικό.

Όπως μπορείτε να δείτε, το πρόγραμμα συντόμευσης URL λαμβάνει μια μεγάλη διεύθυνση URL και επιστρέφει μια σύντομη. Αυτό ακριβώς πρόκειται να χτίσετε σήμερα.

Με αυτό το έργο, θα εξασκηθείτε στη χρήση του μοτίβου MVT, θα μάθετε τα βασικά του σχεδιασμού της βάσης δεδομένων με μοντέλα Django και θα μάθετε πώς να εμφανίζετε πληροφορίες στον χρήστη μέσω προβολών, διευθύνσεων URL και προτύπων.

Δομή ενός έργου Django

Βασικά, ένας ιστότοπος Django βασίζεται σε ένα μόνο έργο και σε πολλαπλές ξεχωριστές εφαρμογές. Κάθε μία από αυτές τις εφαρμογές έχει συγκεκριμένη λειτουργικότητα και μπορεί να λειτουργήσει μόνη της.

Ας φανταστούμε μια πολύπλοκη διαδικτυακή εφαρμογή όπως Υπερχείλιση στοίβας. Η λειτουργικότητά του βασίζεται σε δύο βασικές πτυχές.

  • Διαχείριση χρηστών: Είσοδος, Αποσύνδεση, Φήμη, Δικαιώματα
  • Φόρουμ: Ερωτήσεις, απαντήσεις, ετικέτες, φίλτρα

Έτσι, ακολουθώντας τη δομή του ιστότοπου Django, το έργο θα ονομαζόταν StackOverflow που έχει δύο κύριες εφαρμογές. Η εφαρμογή των χρηστών και η εφαρμογή φόρουμ.

Κάθε μία από αυτές τις εφαρμογές έχει αυτόνομη λειτουργικότητα. Αυτό σημαίνει ότι και οι δύο περιέχουν όλο τον κώδικα που χρειάζονται για να λειτουργήσουν σωστά.

Αυτό περιλαμβάνει μοντέλα (δομή βάσης δεδομένων), προβολές (αιτήματα και απαντήσεις), συγκεκριμένα μοτίβα διευθύνσεων URL και φυσικά πρότυπα και στατικά αρχεία (εικόνες, CSS, JavaScript). Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή Django θα μπορούσε να επαναχρησιμοποιηθεί, καθώς μπορεί να λειτουργήσει μόνη της.

Συντόμευση, ένα έργο αναφέρεται σε ένα σύνολο διαμορφώσεων και εφαρμογών που προορίζονται για τη δημιουργία μιας εφαρμογής Ιστού. Από την άλλη πλευρά, μια εφαρμογή Django είναι μέρος ενός έργου, το οποίο είναι αυτόνομο (έχει όλα όσα χρειάζεται για να λειτουργήσει) και σκοπός του είναι να εκτελέσει μια συγκεκριμένη λειτουργία.

Ρυθμίστε ένα έργο Django

Σε αυτήν την ενότητα, πρόκειται να δημιουργήσετε ένα έργο Django. Για αυτόν τον σκοπό, πρόκειται να χρησιμοποιήσετε διαφορετικά εργαλεία όπως ένα εικονικό περιβάλλον για να οργανώσετε τις εξαρτήσεις Python και τα πιο σημαντικά σενάρια Django. Django-admin and manager.py

Εικονικό περιβάλλον

Συνιστώ πάντα να συνεργάζεστε εικονικά περιβάλλοντα κατά τη δημιουργία εφαρμογών με το Django. Είναι ο πιο αποτελεσματικός τρόπος διατήρησης ενός συγκεκριμένου συνόλου εξαρτήσεων. Αλλά ο κύριος σκοπός του είναι να απομονώσει τα αναπτυξιακά πακέτα από τα παγκόσμια.

Ας δημιουργήσουμε λοιπόν ένα εικονικό περιβάλλον με python την ενσωματωμένη εντολή φόρμας.

Σημείωση: Αυτή η μέθοδος απαιτεί Python 3.6 ή νεότερες εκδόσεις για να λειτουργήσει.

python -m venv .venv

Αυτή η εντολή χρησιμοποιεί την εντολή python -m ή python –mod. Ουσιαστικά εκτελεί μια ενότητα ή μια βιβλιοθήκη, ως σενάριο. Σύμφωνα με το νόημα αυτής της εντολής, το venv είναι η βιβλιοθήκη που εκτελούμε και το .venv αναφέρεται στο όνομα του εικονικού περιβάλλοντος που θέλουμε να δημιουργήσουμε.

Έτσι σε απλή γλώσσα, αυτή η εντολή σημαίνει.

Hey Python, εκτελέστε ως σενάριο την ενσωματωμένη βιβλιοθήκη venv και δημιουργήστε ένα όνομα virtualenv .venv

Τώρα, ήρθε η ώρα να ενεργοποιήσουμε το εικονικό περιβάλλον που μόλις δημιουργήσαμε, με την παρακάτω εντολή.

source .venv/bin/activate

Για να επιβεβαιώσετε ότι έχετε μηδενικά πακέτα εγκατεστημένα στο νέο venv, εκτελείτε.

pip freeze

Εάν ενεργοποιήσατε σωστά το εικονικό περιβάλλον, δεν θα λάβετε καμία έξοδο. Αυτό συμβαίνει γιατί δεν έχουμε εγκαταστήσει τίποτα ακόμα.

Ας μπούμε στο Django

Για να δημιουργήσουμε την εφαρμογή συντόμευσης URL, θα ξεκινήσουμε εγκαθιστώντας το πακέτο Django. Το Django είναι ένα πακέτο τρίτου κατασκευαστή, επομένως πρέπει να το εγκαταστήσουμε με το Pip (πακέτα εγκατάστασης Pip).

$ 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

Σημείωση: Να θυμάστε ότι το $ δεν είναι παρά το σύμβολο του κελύφους σας.

Για να ελέγξουμε αν η εγκατάσταση έγινε σωστά, ελέγχουμε ξανά τα εγκατεστημένα πακέτα του venv μας.

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

Μην ανησυχείτε αν οι εκδόσεις που λαμβάνετε είναι διαφορετικές από τις δικές μου. Εάν το Django συνεχίσει στην έκδοση 3.x, μπορείτε να συνεχίσετε χωρίς κανένα πρόβλημα.

Ξεκινώντας ένα έργο Django

Αφού εγκαταστήσετε το Django, ήρθε η ώρα να δημιουργήσετε τη δομή του ιστότοπου συντόμευσης διευθύνσεων URL. Θυμάστε τι είναι ένα έργο Django; Ας δημιουργήσουμε ένα εκτελώντας την παρακάτω εντολή.

django-admin startproject config

Εξηγώντας τα πάντα σχετικά με αυτήν την εντολή, το django-admin είναι ένα βοηθητικό πρόγραμμα γραμμής εντολών που εκτελεί όλες τις απαραίτητες εργασίες για τη δημιουργία ενός έργου Django. Το τμήμα “startproject” είναι η εντολή που εκτελείται από το βοηθητικό πρόγραμμα Django-admin και το config είναι το όνομα του έργου που πρόκειται να δημιουργήσουμε.

  Πώς να φτιάξετε ένα αόρατο όνομα διαφωνίας

Είναι σημαντικό να τονίσουμε ότι το config μπορεί να είναι οποιοδήποτε όνομα θέλετε. Ο λόγος που χρησιμοποιώ το config ως όνομα αυτού του έργου είναι απλώς λόγω ευκολίας. Είναι ωραίο να κάνετε εναλλαγή μεταξύ έργων και να έχετε την ίδια σύμβαση ονομασίας. Επομένως, μην φοβάστε να χρησιμοποιήσετε άλλα ονόματα έργων όποτε θέλετε.

Όπως μπορείτε να παρατηρήσετε τώρα έχετε ένα φάκελο config/ και μέσα, υπάρχουν πολλά αρχεία. Αργότερα θα δούμε τη δομή του αρχείου του έργου. Προς το παρόν, ας μπούμε στον κατάλογο του έργου και ας τρέξουμε τον τοπικό διακομιστή.

cd config/

Το πιο σημαντικό αρχείο που θα χρησιμοποιήσετε είναι το σενάριο manager.py. Έχει την ίδια λειτουργικότητα με το django-admin, αλλά το κύριο πλεονέκτημα της χρήσης του είναι ότι σας επιτρέπει να διαχειρίζεστε τις ρυθμίσεις κατά την εκτέλεση του έργου.

Τώρα ας δούμε αν όλα λειτουργούν σωστά.

python manage.py runserver

Δημιουργία της εφαρμογής συντόμευσης URL

Ήρθε η ώρα να δημιουργήσετε την κύρια εφαρμογή του έργου. Θα χρησιμοποιήσετε το αρχείο manager.py για να ολοκληρώσετε αυτήν την εργασία.

python manage.py startapp urlshortener

Αυτό δημιουργεί μια εφαρμογή Django, με το όνομα urlshortener. Εάν τρέχετε το δέντρο εντολή, θα πάρετε κάτι σαν αυτό.

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

Ας διευκρινίσουμε τα διάφορα αρχεία που δημιουργήθηκαν μέχρι αυτή τη στιγμή. “config” είναι το όνομα του έργου μας και ονομάζεται έτσι μόνο για τη σύμβαση. Μέσα στο config, λαμβάνετε settings.py, είναι το αρχείο όπου ορίζετε όλες τις ρυθμίσεις του έργου σας. Το urls.py είναι η συνολική διαμόρφωση των διευθύνσεων URL μέσα στο έργο. Καθορίζει τις διαδρομές URL όλων των εφαρμογών εντός του έργου.

Μην ανησυχείτε πολύ για τα αρχεία asgi.py και wsgi.py. Αυτά είναι αρχεία που σας επιτρέπουν να διαμορφώσετε την εφαρμογή σας κατά την ανάπτυξη.

Το manager.py είναι το σενάριο python που σας επιτρέπει να εκτελέσετε όλες τις διαθέσιμες εντολές του Django-διαχειρ.

Ρίχνοντας μια ματιά στο urlshortener που είναι το όνομα της εφαρμογής που μόλις δημιουργήσατε, μπορεί να παρατηρήσετε ότι υπάρχει ένας περίεργος φάκελος που ονομάζεται “migrations/” και ορισμένα άλλα αρχεία που είναι ζωτικής σημασίας για τη λογική οποιασδήποτε εφαρμογής.

Το apps.py είναι το μέρος όπου υπάρχει η διαμόρφωση της εφαρμογής. Συνήθως, δεν ασχολείστε με αυτό, εκτός από το ότι κάνετε αρκετά εκ των προτέρων πράγματα.

Το admin.py είναι το σημείο όπου καταχωρείτε τα μοντέλα σας για να τα κάνετε ορατά μέσα στον πίνακα διαχείρισης του Django.

Το models.py είναι το πιο σημαντικό. Μέσα σε αυτήν την ενότητα, πρέπει να ορίσετε τα μοντέλα, τα οποία (αόριστα λέγοντας) είναι ο τρόπος αποθήκευσης των δεδομένων. Θα ακούσετε περισσότερα για τα μοντέλα αργότερα.

migrations/ είναι ο φάκελος όπου αποθηκεύονται οι μετεγκαταστάσεις του Django. Θα ρίξουμε μια εις βάθος ματιά αργότερα.

Το tests.py είναι το αρχείο όπου αποθηκεύονται οι δοκιμές. Δεν θα καλύψουμε τη δοκιμή σε αυτό το σεμινάριο.

Το views.py είναι το αρχείο που αποθηκεύει προβολές. Βασικά, ορίζει πώς ο χρήστης θα αλληλεπιδράσει με όλες τις πτυχές της εφαρμογής σας.

Εγκατάσταση εφαρμογής Django

Πριν συνεχίσετε, ανοίξτε το αρχείο settings.py και τροποποιήστε τη μεταβλητή INSTALLED_APPS προσθέτοντας την εφαρμογή 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',
]

Αυτή είναι μια διαδικασία ρουτίνας όταν δημιουργείτε μια εφαρμογή. Έτσι, κάθε φορά που το κάνετε, μην ξεχνάτε να το εγκαταστήσετε στις ρυθμίσεις του έργου.

Κατανόηση του μοτίβου MVT

Το μοτίβο Model, View, Template είναι το μοτίβο σχεδιασμού λογισμικού που χρησιμοποιούν οι προγραμματιστές της Django για τη δημιουργία εφαρμογών web.

Βασίζεται σε 3 βασικές έννοιες. Μοντέλο (δεδομένα), Προβολή (Αλληλεπίδραση χρήστη με δεδομένα), Πρότυπο (Πώς βλέπουν τα δεδομένα οι χρήστες).

Τα μοντέλα είναι κλάσεις Python, οι οποίες ορίζουν όλα τα πεδία και τη συμπεριφορά των δεδομένων που θέλετε να αποθηκεύσετε. Κανονικά κάθε μοντέλο αναφέρεται σε έναν μοναδικό πίνακα στη βάση δεδομένων

Οι προβολές στην απλούστερη έκφρασή τους είναι καλέσιμα που λαμβάνουν ένα αίτημα από τον χρήστη και δημιουργούν μια απάντηση. Μεταξύ αυτής της διαδικασίας εμφανίζεται η επιχειρηματική λογική. Γνωρίζω ότι η «επιχειρηματική λογική» είναι μια αρκετά σκοτεινή έννοια, οπότε επιτρέψτε μου να εξηγήσω τι ακριβώς είναι. Η επιχειρηματική λογική είναι ο τρόπος με τον οποίο δημιουργούνται, αποθηκεύονται και διαγράφονται τα δεδομένα, αυτό είναι όλο.

Τέλος, τα πρότυπα είναι έγγραφα κειμένου (Συνήθως Html) που εμφανίζονται στους χρήστες. Σκοπός του είναι να παρουσιάζει όσο το δυνατόν πιο καθαρά δεδομένα. Το Django ενσωματώνει μια μίνι-γλώσσα που ονομάζεται Γλώσσα προτύπου Django (DTL) που σας επιτρέπει να ενσωματώσετε μέρος της δύναμης του python σε έγγραφα κειμένου.

Δημιουργήστε το μοντέλο Shortener

Αφού καταλάβετε γρήγορα το μοτίβο MVT, ας ξεκινήσουμε τη δημιουργία του συντόμευσης διεύθυνσης URL Django από την αρχή.

Πρώτα απ ‘όλα, ας ορίσουμε το μοντέλο συντόμευσης μέσα στο αρχείο 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}'

Ξέρω. Είναι μια αρκετά τεράστια τάξη, με πολλά περίεργα πράγματα που συμβαίνουν, αλλά μην απελπίζεστε. Θα πάω βήμα βήμα σε κάθε σημαντικό πράγμα.

Εξήγηση μοντέλου

Πρώτα απ ‘όλα, εισάγουμε τη μονάδα μοντέλων. Αυτή η ενότητα περιέχει όλες τις λειτουργίες που χρειαζόμαστε για να δημιουργήσουμε ένα μοντέλο Django.

Ρίχνοντας μια ματιά στο μοντέλο “Shortener”, το πρώτο πράγμα που πρέπει να σημειώσετε είναι ότι επεκτείνει τα μοντέλα.Μοντέλο. Στην πραγματικότητα, οποιοδήποτε μοντέλο σε οποιαδήποτε εφαρμογή Django πρέπει να είναι υποκατηγορία του μοντέλα.Μοντέλο τάξη.

Στη συνέχεια ορίζουμε όλα τα πεδία που θα έχει το μοντέλο στη βάση δεδομένων. Το πεδίο “δημιουργήθηκε” είναι η ημερομηνία και η ώρα δημιουργίας του συντομευμένου συνδέσμου, επομένως χρησιμοποιούμε το DateTimeField για να δημιουργήσουμε αυτού του είδους τη λειτουργικότητα. Χρησιμοποιούμε το όρισμα auto_now_add=True επειδή θέλουμε το πεδίο να τροποποιείται μόνο όταν δημιουργείται η παρουσία.

Το δεύτερο πεδίο times_followed αναφέρεται στις φορές που έχει χρησιμοποιηθεί η συντομευμένη διεύθυνση URL. Είναι ένα PositiveIntegerField και ορίζουμε μια προεπιλογή μηδέν. Αυτό σημαίνει ότι κάθε φορά που ένα στιγμιότυπο δημιουργεί το πεδίο time_followed, ο Django θα συμπληρώνει αυτό το πεδίο με 0.

Από την άλλη πλευρά, το long_url αναφέρεται στη διεύθυνση URL που εισάγει ο χρήστης. Είναι ένα URLField, γιατί θέλουμε ο χρήστης να εισάγει μόνο χαρακτήρες της φόρμας: http://yoursite.com.

Το τελευταίο πεδίο είναι short_url και έχει ενδιαφέρουσες λεπτομέρειες. Καθορίζουμε ότι μπορεί να έχει μόνο 15 χαρακτήρες, πρέπει να είναι μοναδικό, πράγμα που σημαίνει ότι δεν μπορούν να υπάρχουν επαναλαμβανόμενα στοιχεία σε αυτό το πεδίο. Τέλος, υποδεικνύουμε ότι μπορεί να μείνει κενό, πράγμα που σημαίνει ότι όταν εργάζονται με φόρμες οι χρήστες δεν θα χρειαστεί να γράψουν τον δικό τους κωδικό συντόμευσης.

  Πώς να προσθέσετε και να αφαιρέσετε άτομα σε ομαδικό κείμενο στο iPhone

Η εσωτερική κλάση Meta, μας λέει πώς πρέπει να συμπεριφέρεται η κλάση και ορίζουμε ότι η σειρά (καλώντας το Shortener.objects.all()) των αντικειμένων συντόμευσης θα διακρίνεται από τα πιο πρόσφατα.

Η μέθοδος __str__ λέει πώς πρέπει να εκτυπωθεί το μοντέλο. Αν λοιπόν έχουμε ένα αντικείμενο με long_url = “https://grtechpc.org.com/” και συντομευμένο μέρος “123456”, και το εκτυπώνουμε.

https://grtechpc.org.com/ to 123456

Τώρα ήρθε η ώρα να αναζητήσετε έναν τρόπο αποθήκευσης του σύντομου συνδέσμου με τυχαίο τρόπο.

Δημιουργία λειτουργικότητας συντόμευσης

Θα δημιουργήσουμε 2 προσαρμοσμένες συναρτήσεις. Το πρώτο θα δημιουργήσει έναν τυχαίο κωδικό και το δεύτερο θα αποτρέψει τη λήψη επαναλαμβανόμενων τυχαίων κωδικών από το μοντέλο Shortener. Για να το κάνετε αυτό, δημιουργήστε ένα αρχείο utils.py μέσα στην εφαρμογή “urlshortener”.

touch utils.py

Μέσα σε αυτό το αρχείο, θα χρησιμοποιήσουμε τη συνάρτηση επιλογής από την τυχαία ενσωματωμένη μονάδα. Αυτό διευκολύνει το έργο της επιλογής τυχαίων χαρακτήρων για τη δημιουργία του κώδικα.

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

Όπως μπορείτε να δείτε αυτή η συνάρτηση επιστρέφει μια τυχαία συμβολοσειρά του μήκους που καθορίζεται στο αρχείο ρυθμίσεων ή 7 από προεπιλογή. Χρησιμοποιείτε τη συνάρτηση getattr για να λάβετε μια μεταβλητή από τη λειτουργική μονάδα ρυθμίσεων, αλλά χωρίς να κάνετε σφάλμα εάν η μεταβλητή δεν έχει καθοριστεί.

Ας κάνουμε μαθηματικά. Εάν έχουμε 7 μέρη όπου μπορούν να υπάρχουν έως και 62 διαθέσιμοι χαρακτήρες για κάθε μέρος, το δυνατό μεταθέσεις είναι:

Έτσι, με βάση αυτούς τους γρήγορους υπολογισμούς, το συντομευμένο τμήμα μπορεί να συμπληρωθεί έως και 2,5 τρισεκατομμύρια διαφορετικούς κωδικούς. Έτσι μπορούμε να ξεχάσουμε να βγούμε από τυχαία συντομευμένα URL.

Αν και μπορεί να υπάρχουν τόσες πολλές μεταθέσεις, υπάρχει μια μικρή πιθανότητα να λάβετε επαναλαμβανόμενα βραχυπρόθεσμα μέρη. Αυτό είναι ένα πρόβλημα, καθώς ρυθμίσαμε το πεδίο shortened_url να είναι μοναδικό. Γι’ αυτό η παρακάτω λειτουργία είναι τόσο χρήσιμη.

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

Ας δούμε τι συμβαίνει εδώ. Η συνάρτηση παίρνει ως όρισμα ένα παράδειγμα μοντέλου “Shortener”. Πρώτον, η συνάρτηση δημιουργεί έναν τυχαίο κώδικα χρησιμοποιώντας το create_random_code. Στη συνέχεια, παίρνει την κλάση μοντέλου και ελέγχει αν υπάρχει κάποιο άλλο αντικείμενο που έχει το ίδιο short_url. Εάν το κάνει, εκτελείται μόνο του άλλη μια φορά, αλλά αν όλα είναι καλά, επιστρέφει τον random_code.

Αργότερα θα αλληλεπιδράσετε με το κέλυφος, για να ρίξετε μια ματιά σε αυτή τη λειτουργία από κοντά.

Αφού δημιουργήσουμε τη συνάρτηση βοηθητικού προγράμματος, ας τη χρησιμοποιήσουμε για να δημιουργήσουμε τυχαίους κωδικούς στο μοντέλο συντόμευσης.

Τροποποίηση της μεθόδου αποθήκευσης

Στο τέλος της κλάσης “Shortener”, πρόκειται να τροποποιήσετε τη μέθοδο αποθήκευσης μοντέλου. Η μέθοδος αποθήκευσης καλείται κάθε φορά που ένα αντικείμενο αποθηκεύεται στη βάση δεδομένων, οπότε θα δούμε πώς να το χρησιμοποιήσουμε εδώ.

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

Η μέθοδος αποθήκευσης αντικαθίσταται, πράγμα που σημαίνει ότι εισάγετε νέα λειτουργικότητα σε μια προϋπάρχουσα γονική μέθοδο. Βασικά λέει στον Django ότι κάθε φορά που αποθηκεύεται ένα αντικείμενο “Shortener” και δεν καθορίζεται το short_url, πρέπει να συμπληρώνεται με έναν τυχαίο κωδικό.

Εκτελούμενες μεταναστεύσεις

Τώρα ήρθε η ώρα να κάνετε και να εκτελέσετε τις μετεγκαταστάσεις του μοντέλου Shortener. Για να το κάνετε αυτό, εκτελέστε τις ακόλουθες εντολές στον ριζικό φάκελο του έργου.

$ 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

Προς το παρόν, δεν χρειάζεται να ανησυχείτε για το τι είναι οι μεταναστεύσεις. Απλώς έχετε κατά νου ότι όταν εκτελείτε αυτές τις δύο εντολές, το Django δημιουργεί ένα Βάση δεδομένων db.sqlite αρχείο, με βάση τα μοντέλα που έχετε ορίσει.

Ας δημιουργήσουμε μερικά αντικείμενα με το κέλυφος Django.

$ python manage.py shell

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

Κάπως έτσι θα λειτουργούν όλα τα αντικείμενα συντόμευσης.

Γράψιμο απόψεων

Όπως είπα προηγουμένως, μια προβολή είναι μια απλή συνάρτηση που δέχεται ένα αίτημα και επιστρέφει μια απάντηση. Ας δούμε λοιπόν πώς να δημιουργήσουμε μια κοσμοθεωρία hello.

Βασική απόκριση προτύπου

Μέσα στο αρχείο “urlshortener/views.py” δημιουργήστε μια συνάρτηση 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")

Επιστρέφει ένα απλό μήνυμα “Hello world”. Αργότερα θα δείτε πώς φαίνεται στο πρόγραμμα περιήγησης. Τώρα δημιουργήστε ένα “urls.py”, εκεί θα υπάρχουν όλα τα μοτίβα URL της εφαρμογής.

αγγίξτε urls.py

Προσθέστε τον παρακάτω κώδικα.

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

Η μεταβλητή appname δηλώνει (όπως υποδηλώνει το όνομά της) το διάστημα ονομάτων της εφαρμογής urlshortener.

Γρήγορα εξηγώντας ότι εισάγουμε το λειτουργία διαδρομής, το οποίο επιστρέφει ένα στοιχείο για συμπερίληψη στα μοτίβα url της εφαρμογής. Το χαρακτηριστικό name είναι ο χώρος ονομάτων της διαδρομής, ο οποίος μπορεί να κληθεί μέσα σε πρότυπα εάν είναι απαραίτητο.

Τώρα, ας τροποποιήσουμε τις συνολικές διευθύνσεις URL του έργου.

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

Τώρα ας τρέξουμε ξανά τον διακομιστή.

python manage.py runserver

Εάν εκτελείτε τον διακομιστή, θα λάβετε ένα απλό μήνυμα “Hello world”. Αυτό συμβαίνει επειδή συμπεριλαμβάνετε τα μοτίβα url από την εφαρμογή συντόμευσης διευθύνσεων URL στο συνολικό έργο.

Αυτό είναι απλώς ένα σημείο εκκίνησης. Τώρα ήρθε η ώρα να δημιουργήσετε μια φόρμα για να αφήσετε τον χρήστη να δημιουργήσει μόνος του Συντομευμένες διευθύνσεις URL.

Δημιουργία φορμών

Στο Django, α μορφή είναι μια απλή κλάση που επιτρέπει τη λήψη πληροφοριών από τον χρήστη.

Πρόκειται να δημιουργήσετε ένα αρχείο forms.py. Είναι μια σύμβαση για την αποθήκευση όλων των μορφών της εφαρμογής σε αυτό το αρχείο.

cd urlshortener/
touch forms.py

Μέσα σε αυτό το αρχείο πρόκειται να δημιουργήσετε μια κλάση “ShortenerForm” που εκτείνεται από το “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',)

Είναι μια φόρμα μοντέλου αφού σκοπός της είναι να δημιουργήσει ένα αντικείμενο μοντέλου από την είσοδο του χρήστη. Χρησιμοποιούμε επίσης το όρισμα του γραφικού στοιχείου, το οποίο μας επιτρέπει να καθορίσουμε το χαρακτηριστικό “class” (κλάση σε CSS, όχι python). Αυτό συμβαίνει επειδή θα διαμορφώσουμε αργότερα την εφαρμογή με bootstrap.

Τελειώνοντας τις απόψεις

Μετά τη δημιουργία των εντύπων είναι καιρός να δημιουργηθεί η τελική επιχειρηματική λογική της εφαρμογής.

  Πώς να εμφανίσετε το ποσοστό της μπαταρίας στο iPhone σας

Μεταβείτε στο αρχείο views.py μέσα στην εφαρμογή συντόμευσης και τροποποιήστε την προβολή home_view. Μπορείτε να ελέγξετε το Αποθετήριο Github αυτή τη στιγμή για να πάρετε μια ιδέα για το πώς φαίνεται η δομή του έργου.

Υπάρχουν δύο προβολές για την εφαρμογή συντόμευσης διευθύνσεων URL:

  • Αρχική προβολή: Εμφανίζει τη φόρμα συντόμευσης και τη νέα διεύθυνση URL εάν η φόρμα έχει ήδη υποβληθεί.
  • Προβολή ανακατεύθυνσης: Αυτό ανακατευθύνει στη μεγάλη διεύθυνση URL και προσθέτει 1 στους χρόνους που ακολουθούνται.
  • Ας ξεκινήσουμε με την άποψη του σπιτιού που είναι και η πιο περίπλοκη. Θα χρειαστεί να εισαγάγετε το μοντέλο και τη φόρμα Shortener. Εξακολουθείτε να χρησιμοποιείτε μια συνάρτηση, καθώς θέλω να κατανοήσετε όλη τη ροή δεδομένων της προβολής. Επίσης, θα χρησιμοποιείτε τη διαδρομή για ένα πρότυπο (το οποίο δεν έχει δημιουργηθεί ακόμα).

    Προβολή σπιτιού

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

    Η προβολή βασίζεται σε δύο προϋποθέσεις:

  • Όταν η μέθοδος HTTP ισούται με GET: Περνάμε μόνο ως περιβάλλον, η φόρμα Shortener χρησιμοποιείται για τη δημιουργία αντικειμένων Shortener.
  • Όταν η μέθοδος HTTP ισούται με POST: Εξακολουθούμε να περνάμε τη φόρμα στο περιβάλλον, καθώς θέλουμε ο χρήστης να μπορεί να εισάγει άλλη διεύθυνση URL. Αλλά περνάμε το αίτημα Post σε μια άλλη φόρμα που ονομάζεται used_form.
  • Ένας δύσκολος τρόπος για να λάβετε δυναμικά το πλήρες URL του ιστότοπου είναι χρησιμοποιώντας τη μέθοδο αντικειμένου αιτήματος build_absolute_uri .

    >>> print(request.build_absolute_uri('/'))
    'https://localhost:8080/'

    Ως ασφαλής τρόπος επεξεργασίας ενός λανθασμένου αιτήματος (Ο χρήστης δεν εισήγαγε έγκυρη διεύθυνση URL), λαμβάνουμε τα σφάλματα της φόρμας, τα περνάμε ως περιβάλλον και αποδίδουμε το πρότυπο ως κανονικό. Αργότερα θα δείτε πώς να εφαρμόσετε την εμφάνιση σφαλμάτων στο πρότυπο.

    Ανακατεύθυνση προβολής

    Το redirect_url_view , είναι λίγο πιο απλό. Είναι μια λεπτομερής προβολή που σημαίνει ότι η προβολή λειτουργεί μόνο με ένα αντικείμενο.

    Αυτή η συνάρτηση λαμβάνει ως παραμέτρους, το αίτημα του χρήστη και το shortened_part του URL. Δεν είναι απαραίτητο να διεκδικήσουμε τον τύπο του αιτήματος που λαμβάνουμε, καθώς δεν εργαζόμαστε με φόρμες σε αυτήν την προβολή.

    def redirect_url_view(request, shortened_part):
    
        try:
            shortener = Shortener.objects.get(short_url=shortened_part)
    
            shortener.times_followed += 1        
    
            shortener.save()
            
            return HttpResponseRedirect(shortener.long_url)
            
        except:
            raise Http404('Sorry this link is broken :(')

    Προστατεύουμε την προβολή με μια δήλωση try/except, σε περίπτωση που το συντομευμένο τμήμα δεν βρεθεί στη βάση δεδομένων. Εάν βρεθεί το αντικείμενο, προσθέτει 1 στο πεδίο time_followed και ανακατευθύνει με τη συνάρτηση HttpResponseRedirect στη διεύθυνση URL του ιστότοπου που αντιστοιχεί στον τυχαίο κώδικα.

    Ενημέρωση διευθύνσεων URL

    Αφού δημιουργήσετε τις δύο προβολές της εφαρμογής, ήρθε η ώρα να δημιουργήσετε τα τελικά μοτίβα URL συμπεριλαμβάνοντας τη διαδρομή προς το redirect_url_view.

    Όπως πάντα, ξεκινάτε εισάγοντας τις προβολές και, στη συνέχεια, δημιουργώντας μια συνάρτηση διαδρομής και περνώντας ως ορίσματα:

    • Η διαδρομή URL
    • Η θέα προς το μονοπάτι
    • Το όνομα του μονοπατιού
    '''
    Urls for shortener app urlshortener/urls.py
    '''
    
    from django.urls import path
    
    # Import the home view
    from .views import home_view, redirect_url_view
    
    appname = "shortener"
    
    urlpatterns = [
        # Home view
        path('', home_view, name="home"),
        path('<str:shortened_part>', redirect_url_view, name="redirect"),
    ]
    

    Με αυτήν τη ρύθμιση URL, η δρομολόγηση της εφαρμογής μοιάζει με αυτό.

    • localhost:8000/: Αρχική προβολή
    • localhost:8000/URL-code: Ανακατεύθυνση στη μεγάλη διεύθυνση URL

    Δημιουργία προτύπων

    Είσαι σχεδόν εκεί. Το μόνο πράγμα που σας χωρίζει από την κατασκευή αυτής της εφαρμογής είναι η διεπαφή χρήστη. Για αυτό, χρησιμοποιούμε πρότυπα Django.

    Τα πρότυπα χρησιμοποιούνται για την απόδοση μιας καθαρής διεπαφής στον χρήστη της εφαρμογής. Αυτά τα αρχεία δημιουργούνται μέσα στην εφαρμογή σε μια δομή διπλού φακέλου με τη μορφή: “πρότυπα/όνομα εφαρμογής”

    # urlshortener directory
    mkdir -p templates/urlshortener/

    Σημείωση: Η δομή του διπλού φακέλου και η γλώσσα του προτύπου Django δεν εμπίπτουν στο πεδίο εφαρμογής αυτού του σεμιναρίου, αλλά μπορείτε να διαβάσετε σχετικά με αυτά στο επίσημη τεκμηρίωση.

    Πρότυπο βάσης

    Το Django επιτρέπει την κληρονομικότητα προτύπων. Αυτό σημαίνει ότι μπορούμε να έχουμε ένα βασικό πρότυπο και να το επεκτείνουμε με σκοπό να ακολουθήσουμε την αρχή DRY (Don’t repeat yourself).

    cd templates/urlshortener
    touch base.html

    Το αρχείο base.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>Django Url shortener</title>
    
        <link
          href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
          rel="stylesheet"
          integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0"
          crossorigin="anonymous"
        />
    
        <link
          rel="stylesheet"
          href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css"
          integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w=="
          crossorigin="anonymous"
        />
      </head>
      <body>
       
        {% block body %} 
       
       
        
        {% endblock body %}
        
        <script
          src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
          integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8"
          crossorigin="anonymous"
        ></script>
      </body>
    </html>
    

    Θα χρησιμοποιήσουμε το bootstrap CDN, για να φτιάξουμε μια γρήγορη και όμορφη διεπαφή χωρίς να χρειαζόμαστε αρχεία CSS ή javascript.

    Εάν θέλετε να μάθετε σε βάθος για τις ετικέτες DTL, μπορείτε να το κάνετε με το επίσημα έγγραφα.

    Πρότυπο για το σπίτι

    Το αρχικό πρότυπο, εγγενές από το αρχείο base.html. Αυτό σημαίνει ότι αυτό το πρότυπο περιλαμβάνει όλο το HTML από το γονικό αρχείο.

    {% extends 'urlshortener/base.html' %} 
    
    {% block body %}
    
    <div class="container">
      <div class="card mt-5">
        <div class="card-header text-center py-3">
          <h1>URL Shortner Application <i class="fas fa-link px-2"></i></h1>
        </div>
        <div class="px-3 py-4">
          <form action="" method="POST">
            {% csrf_token %}
            <div class="row g-1">
              <div class="col-10">{{form.long_url}}</div>
              <div class="col-2">
                <button class="btn btn-success btn-lg w-100" type="submit">
                  Shorten
                </button>
              </div>
            </div>
          </form>
        </div>
      </div>
      {% if errors %}
      <div class="alert alert-danger mt-4" role="alert">
        <p>{{errors}}</p>
      </div>
      {% endif %}
    
      {% if new_url %}
    
      <div class="mx-auto text-center mt-5">
        <h2 class="text-danger">Your shortened Url</h2>
        <p>You can copy the Link below and share it with your friends</p>
        <p class="">{{new_url}}</p>
        <p><span class="text-danger">Previous URL:</span> {{long_url}}</p>
      </div>
      {% endif %}
    </div>
    {% endblock body %}

    Θα εξηγήσω γρήγορα τη ροή δεδομένων αυτού του προτύπου:

    • Εμφανίζεται η φόρμα Shortener. Μεσα στην διακριτικό crsf έχει οριστεί (Λόγοι ασφαλείας) και εμφανίζεται μόνο το μακρύ πεδίο URL της φόρμας. Θυμηθείτε ότι αυτό το πεδίο έχει την κλάση CSS, “form-control form-control-lg”, επειδή το έχουμε ορίσει στη φόρμα.
    • Εάν εντοπιστούν σφάλματα, τότε δείξτε τα
    • Εάν η λειτουργία POST επιτύχει τότε, εμφανίζεται η νέα διεύθυνση URL.

    Τελική εφαρμογή

    Συγχαρητήρια! 🎉. Έχετε δημιουργήσει μια πλήρη λειτουργική εφαρμογή συντόμευσης διευθύνσεων URL με το Django.

    Ακολουθούν μερικά στιγμιότυπα οθόνης για το πώς φαίνεται η εφαρμογή.

    Λάβετε μόνο:

    Σφάλμα συντόμευσης διεύθυνσης URL:

    Επιτυχής συντομευμένη διεύθυνση URL:

    Διεύθυνση URL ανακατεύθυνσης:

    Πώς σας φαίνεται να εκθέσετε μια επίδειξη αυτής της εφαρμογής συντόμευσης διευθύνσεων URL σε κάποιον; Ελέγξτε πώς να εκθέσετε μια εφαρμογή Django Demo στο διαδίκτυο.

    Πρόκληση 🔥

    Εάν αισθάνεστε άνετα με τις δεξιότητές σας στο Django, γιατί να μην εξασκηθείτε με μια πρόκληση;.

    Κλωνοποιήστε τον κώδικα αυτής της εφαρμογής και δημιουργήστε ένα σύστημα ελέγχου ταυτότητας, όπου μόνο οι εγγεγραμμένοι χρήστες μπορούν να συντομεύσουν τις διευθύνσεις URL τους.

    Όταν τελειώσετε, στείλτε ένα αίτημα έλξης και κάντε ping Κελάδημα για να παρουσιάσετε τα επιτεύγματά σας.

    Τυλίγοντας

    Φτάσατε στο τέλος αυτού του σεμιναρίου. Είτε το πιστεύετε είτε όχι, μόλις εξετάσατε όλες τις κύριες πτυχές της δημιουργίας ενός έργου Django. Ελπίζω να σας φάνηκε εξαιρετικά χρήσιμο.

    Σε αυτό το σεμινάριο μπορείτε:

    • Μάθετε για τη ροή εργασιών της δημιουργίας μιας εφαρμογής Django.
    • Κατασκεύασε ένα έργο βιογραφικού
    • Κατανόησε τις διαφορές και τη δομή των έργων Django και των εφαρμογών Django.
    • Ανακάλυψε το μοτίβο MVT.
    • Δημιουργήθηκαν προβολές βάσης συναρτήσεων
    • Χρησιμοποίησε το Django ORM (Object Relational Mapper) για να δημιουργήσει απλά μοντέλα

    Αυτό είναι όλο, υπάρχουν πολλά να καλύψουμε με το Πλαίσιο ιστού Djangoοπότε μείνετε σε επαφή για περισσότερα καταπληκτικά σεμινάρια.