Βέλτιστη πρακτική για τη δομή καταλόγου εργασίας του έργου Django. Συμπαγής διακομιστής για εφαρμογές Django

Αυτή η σημείωση αποτελεί συνέχεια του άρθρου σχετικά με τη σύνταξη ενός bot telegram, στο οποίο θα προσπαθήσω να καλύψω όσο το δυνατόν περισσότερες λεπτομέρειες το θέμα της ανάπτυξης μιας πλήρους, αν και μικρής, εφαρμογής Django σε περιβάλλον παραγωγής σε Linux OS, Ubuntu 14,04 LTS. Μέχρι το τέλος του άρθρου, θα έχουμε ένα πλήρες bot τηλεγραφήματος που θα περιστρέφεται στον Ιστό και θα λαμβάνει εντολές από τους χρήστες αυτού του messenger.

Τι θα μάθετε αφού διαβάσετε τη σημείωση:

  • Επεκτείνουν Εφαρμογή Django(και οποιαδήποτε WSGIεφαρμογή) που φιλοξενείται από την Digital Ocean σε περιβάλλον Linux
  • Εργαστείτε με διακομιστές ιστού nginx και gunicorn
  • Διαχειριστείτε τις διαδικασίες χρησιμοποιώντας το βοηθητικό πρόγραμμα εποπτείας
  • Διαμορφώστε το virtualenv χρησιμοποιώντας το pyenv
  • Αυτόματη εκκίνηση της εφαρμογής Ιστού ακόμα και μετά την επανεκκίνηση του διακομιστή

Τον Σεπτέμβριο του 2015, πραγματοποιήσαμε μια συνάντηση Python στο Αλμάτι, όπου μίλησα με τον . Κατά τη διάρκεια της ομιλίας, περιέγραψα εν συντομία το οικοσύστημα ιστού Python και έδωσα μια σύντομη επισκόπηση των δημοφιλών εργαλείων. Δυστυχώς, η μορφή της συνάντησης δεν περιλάμβανε λεπτομερής ανάλυσηθέματα, επομένως όσοι είναι νέοι στον τομέα πρέπει συνήθως να σκάψουν περαιτέρω μόνοι τους. Σήμερα θα προσπαθήσω να καλύψω αυτό το κενό και να εμβαθύνω λίγο στο «καυτό» θέμα της ανάπτυξης διαδικτυακών εφαρμογών στην Python. Παρά το γεγονός ότι το άρθρο θα επικεντρωθεί σε μια εφαρμογή Django, οι περιγραφόμενες συνταγές θα είναι επίσης σχετικές με άλλα έργα ιστού που έχουν αναπτυχθεί στην Python χρησιμοποιώντας πλαίσια συμβατά με WSGI (Flask, Bottle, Pyramid, Falcon, web2py κ.λπ.).

Σε αυτό το σημείωμα θα αναπτύξω σε εικονική φιλοξενίααπό την Digital Ocean. Εάν εγγραφείτε χρησιμοποιώντας αυτόν τον σύνδεσμο, μετά την επιβεβαίωση των στοιχείων πληρωμής σας, ο λογαριασμός σας θα αναπληρωθεί αμέσως με $10, τα οποία μπορείτε να ξοδέψετε για τη δημιουργία μικρών σταγονιδίων (εικονικούς διακομιστές) και την εξάσκηση στην ανάπτυξη έργων ιστού στην Python. Θα πω αμέσως ότι δεν χρειάζεται να κάνετε τα πάντα σε ένα απομακρυσμένο μηχάνημα και γενικά να χρησιμοποιήσετε έναν πάροχο φιλοξενίας, μπορείτε να τα βγάλετε πέρα ​​με μια τοπική εικονική μηχανή, για παράδειγμα, χρησιμοποιώντας το VirtualBox (αλλά σε αυτήν την περίπτωση θα είναι αδύνατο. για να εγκαταστήσετε ένα webhook).

Δημιουργία εικονικού διακομιστή

Όπως ανέφερα προηγουμένως, θα εκτελέσουμε την ανάπτυξη σε έναν από τους εικονικούς διακομιστές DigitalOcean με το ισχυρό API του :)

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

Επιλέγουμε τη χαμηλότερη χρέωση για 5 $ το μήνα με λειτουργικό σύστημα Ubuntu 14.04.4 LTS στη μελλοντική εικονική μηχανή.

Σχεδόν πάντα επιλέγω τη Φρανκφούρτη ως κέντρο δεδομένων, αφού έχω το πιο κοντινό το καλύτερο ping. Αφού συμπληρώσετε όλα τα απαιτούμενα πεδία, κάντε κλικ στο κουμπί "Δημιουργία". Το σταγονίδιο δημιουργείται εντός 60 δευτερολέπτων, μετά από το οποίο αποστέλλονται στο email όλες οι πληροφορίες σχετικά με τη νέα εικονική μηχανή που είναι απαραίτητες για πρόσβαση: διεύθυνση IP, σύνδεση και κωδικός πρόσβασης.

Συντονισμός διακομιστή

Ενημέρωση πακέτων:

# apt-get ενημέρωση # apt-get -y αναβάθμιση

# adduser django # adduser django sudo

Συνδεθείτε με νέο χρήστη τζάνγκοστον διακομιστή και όλες οι άλλες εντολές εκτελούνται κάτω από αυτόν τον χρήστη.
Εγκαθιστούμε το απαραίτητο οπλοστάσιο για τη δημιουργία ενός εικονικού περιβάλλοντος μέσω του Pyenv και τη δημιουργία της πιο πρόσφατης έκδοσης της Python (2.7.11).

$ sudo apt-get install -y build-essential $ sudo apt-get install -y python-dev libreadline-dev libbz2-dev libssl-dev libsqlite3-dev libxslt1-dev libxml2-dev $ sudo apt-get install -y git

Μετά από αυτό εγκαθιστούμε το ίδιο το Pyenv. Μπορείτε να διαβάσετε περισσότερα σχετικά με το τι είναι το Pyenv και πώς να το ρυθμίσετε:
Εγκαταστήστε την πιο πρόσφατη έκδοση της Python (Python 2.7.11):

$ pyenv install 2.7.11 Λήψη Python-2.7.11.tgz... -> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz Εγκατάσταση Python-2.7.11 ... Εγκατεστημένο το Python-2.7.11 στο /home/django/.pyenv/versions/2.7.11

Η εντολή θα χρειαστεί λίγο χρόνο για να ολοκληρωθεί (το σενάριο θα κατεβάσει την Python και θα το μεταγλωττίσει από την πηγή). Με την εγκατάσταση ενός ξεχωριστού διερμηνέα Python, δεν επηρεάζουμε με κανέναν τρόπο τη λειτουργία του συστήματος, επιπλέον, η τελευταία έκδοση LTS του Ubuntu (14.04) χρησιμοποιεί την έκδοση 2.7.6, η οποία έχει μια σειρά από σοβαρά τρωτά σημεία, συμπεριλαμβανομένου ενός σφάλματος με. SSL, και επίσης στερείται υποστήριξης για το TLS 1.2

Κλωνοποιούμε το αποθετήριο με το έργο Django:

$ cd ~ $ git κλώνος https://github.com/adilkhash/planetpython_telegrambot.git $ cd planetpython_telegrambot/

$ pyenv virtualenv 2.7.11 telegram_bot $ pyenv τοπικό telegram_bot

Εγκαθιστούμε εξαρτήσεις χρησιμοποιώντας τον διαχειριστή πακέτων pip.

Pip install -r απαιτήσεις.txt

Η εφαρμογή Django που γράφτηκε στο πρώτο μέρος έχει υποστεί μικρές αλλαγές. Συγκεκριμένα, μετέφερα τα μεταβλητά μέρη του κώδικα σε ένα ειδικό αρχείο .env χρησιμοποιώντας τη βιβλιοθήκη django-environ. Μπορείτε να δείτε τις αλλαγές χρησιμοποιώντας αυτόν τον σύνδεσμο.

Δημιουργήστε ένα αρχείο .env από το πρότυπο και συμπληρώστε τις απαραίτητες ρυθμίσεις.

$ cd blog_telegram && mv .env-template .env && vi .env

Συγκεκριμένα, πρέπει να αλλάξετε τη λειτουργία DEBUG σε False, να καταχωρίσετε ένα διακριτικό για το bot του Telegram και να καθορίσετε έναν επιπλέον κεντρικό υπολογιστή διαχωρισμένο με κόμματα στο ALLOWED_HOSTS. Στην περίπτωσή μου, το ALLOWED_HOSTS μοιάζει με αυτό:

ALLOWED_HOSTS=127.0.0.1,bot.site

Δηλαδή, δημιούργησα έναν επιπλέον υποτομέα στον οποίο θα τρέχει το bot του Telegram.

Ρύθμιση πιστοποιητικού SSL

Στο προηγούμενο άρθρο, έγραψα ότι κατά τη χρήση της κλήσης setWehook API, ο κεντρικός υπολογιστής πρέπει να έχει έγκυρο πιστοποιητικό SSL (το Telegram επιτρέπει επίσης τη χρήση αυτο-υπογεγραμμένων πιστοποιητικών). Θα δημιουργήσουμε το πιστοποιητικό μέσω της δωρεάν υπηρεσίας έκδοσης πιστοποιητικών SSL Let's Encrypt.

$ cd ~ && git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt/ $ ./letsencrypt-auto certonly --standalone -d bot.site

Θα χρειαστεί να καθορίσετε ορισμένες ρυθμίσεις και να συμφωνήσετε με τους όρους παροχής υπηρεσιών. Μετά την επιτυχή εκτέλεση των εντολών, τα πιστοποιητικά θα βρίσκονται στο /etc/letsencrypt/live/bot.site/

Ρύθμιση του Nginx

Τώρα ήρθε η ώρα να εγκαταστήσετε το δημοφιλές HTTP διακομιστής nginxτο οποίο στην περίπτωσή μας θα λειτουργεί ως διακομιστής μεσολάβησης (λαμβάνετε αιτήματα από πελάτες και τα προωθείτε περαιτέρω ακολουθώντας τις οδηγίες στο αρχείο διαμόρφωσης).

$ sudo apt-get install -y nginx $ cd /etc/nginx/sites-available/ $ sudo nano telegram_bot.conf

Συμπληρώνω νέο αρχείο telegram_bot.conf με το ακόλουθο περιεχόμενο:

Διακομιστής ( ακρόαση 80; ακρόαση 443 ssl; όνομα διακομιστή bot..site/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/bot..pem; τοποθεσία / ( κεντρικός υπολογιστής proxy_set_header $http_host; proxy_redirect off; proxy_Forward_ proxy_add_x_forwarded_for;

ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Μην ξεχάσετε να αντικαταστήσετε τον κεντρικό υπολογιστή bot.siteμόνος σου.

Καταχωρούμε τη νέα μας διαμόρφωση στις ρυθμίσεις του nginx και την επανεκκινούμε για να τεθούν σε ισχύ οι αλλαγές:

$ cd /etc/nginx/sites-enabled/ $ sudo ln -s ../sites-available/telegram_bot.conf telegram_bot.conf $ sudo υπηρεσία nginx επανεκκίνηση

Τι κάναμε μόλις;

  • Έχουμε καταχωρίσει ένα έγκυρο πιστοποιητικό SSL για τον ιστότοπό μας
  • Όλα τα αιτήματα που φτάνουν στον κεντρικό υπολογιστή θα αποστέλλονται με μεσολάβηση στη μελλοντική μας εφαρμογή Django, η οποία με τη σειρά της θα πρέπει να εκτελείται στη θύρα 8001.
  • Μεταδίδουμε πρόσθετες κεφαλίδες HTTP σε κάθε αίτημα (κεντρικός υπολογιστής, διεύθυνση IP πελάτη, σχήμα https/http και ούτω καθεξής). Μπορείτε να διαβάσετε περισσότερα σχετικά με τις ρυθμίσεις nginx.

Για να ελέγξετε την επιτυχία των ρυθμίσεών μας, μπορείτε να εκτελέσετε την εφαρμογή django μέσω του δοκιμαστικού διακομιστή με την εντολή runserver στη θύρα 8001 και να μεταβείτε στον ιστότοπο:

$ cd ~/planetpython_telegrambot/ $ python manager.py runserver 8001

Ανοίξτε το πρόγραμμα περιήγησης και δείτε (το άνοιξα αμέσως μέσω https):

Το URL Not Found είναι ένα φυσιολογικό φαινόμενο, καθώς έχουμε μόνο 1 έγκυρη διεύθυνση URL για άμεση εργασία με το Telegram - /planet/bot/ / (χωρίς να υπολογίζονται οι ρυθμίσεις διαχειριστή του Django).

Ρύθμιση του Gunicorn μέσω του Supervisor

Ήρθε η ώρα να ξεκινήσετε τη ρύθμιση ενός διακομιστή HTTP έτοιμου για παραγωγή Gunicorn, το οποίο, παρεμπιπτόντως, είναι εξ ολοκλήρου γραμμένο σε Python και έχει αποδειχθεί καλά σε πραγματική μάχη (παρεμπιπτόντως, σε όλα τα "ζωντανά" έργα χρησιμοποιώ αυτόν τον συγκεκριμένο συνδυασμό: nginx+gunicorn)

Τι είναι ο Επόπτης;

ΕπόπτηςΑυτό είναι ένα βοηθητικό πρόγραμμα διαχείρισης διεργασιών. "Παρακολουθεί την υγεία" των διεργασιών του δαίμονα σας και, αν πέσουν, προσπαθεί να τις αυξήσει ξανά. Εάν το Gunicorn «πέσει» κατά τη λειτουργία (σφάλμα συστήματος, λάθος φάση σελήνης, κ.λπ.), ο Επόπτης προσπαθεί να το «σηκώσει» ξανά, έτσι ώστε η απόδοση του ιστότοπου να μην υποφέρει. Παρεμπιπτόντως, σκοπεύω να γράψω μια σύντομη σημείωση σχετικά με αυτό το βοηθητικό πρόγραμμα, ούτως ειπείν Supervisor Advanced Usage. Αξίζει να σημειωθεί ότι όλες οι διεργασίες που εκτελούνται στο Supervisor πρέπει να εκτελούνται σε λειτουργία προσκηνίου, έτσι ώστε το βοηθητικό πρόγραμμα να καταλάβει πότε κάτι δεν πηγαίνει σύμφωνα με το σχέδιο.

Αρχικά, ας δημιουργήσουμε ένα αρχείο διαμόρφωσης για να τρέξουμε το Gunicorn μέσα στο Supervisor. Το περιεχόμενό του μοιάζει με αυτό:

Command=/home/django/.pyenv/versions/telegram_bot/bin/gunicorn blog_telegram.wsgi:application -b 127.0.0.1:8001 -w 1 --timeout=60 --graceful-timeout=60 --max-requests= Κατάλογος 1024=/home/django/planetpython_telegrambot/ user=django redirect_stderr=True stdout_logfile=/tmp/gunicorn.log stderr_logfile=/tmp/gunicorn_err.log autostart=true priority9 autorestart=true priority9 stopwa0itec

Αποθηκεύστε το αρχείο με το όνομα gunicorn.conf ( ~/planetpython_telegrambot/gunicorn.conf). Παρεμπιπτόντως, το Gunicorn περιλαμβάνεται στις εξαρτήσεις του έργου μας ( απαιτήσεις.txt) και αφού το έχουμε ήδη εγκαταστήσει στο περιβάλλον μας, μπορείτε να μάθετε τη διαδρομή του εκτελέσιμου αρχείου εκτελώντας την εντολή μέσα στο ενεργοποιημένο εικονικό περιβάλλον (η ενεργοποίηση γίνεται αυτόματα όταν μεταβείτε στον κατάλογο της εφαρμογής web λόγω της παρουσίας του αρχείου εκεί .python-έκδοσηδημιουργήθηκε μέσω pyenv local):

$pyenv ποιος gunicorn

Περιεχόμενα του αρχείου διαμόρφωσης για τον επόπτη:

File=/tmp/telgram_bot_supervisord.sock logfile=/tmp/telgram_bot_supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/tmp/telgram_bot_supervisord.pid nodaemon.pprovisor _factory = διεπαφή supervisor.rpc : make_main_rpcinterface serverurl=unix:///tmp/telgram_bot_supervisord.sock αρχεία = /home/django/planetpython_telegrambot/gunicorn.conf

Αποθήκευση σε ~/planetpython_telegrambot/supervisord.conf

$superd

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

$ supervisorctl gunicorn RUNNING pid 20901, uptime 0:04:18 επόπτης>

Για να λάβετε βοήθεια, μπορείτε να εκτελέσετε την εντολή βοήθειας. Και για να λάβετε πληροφορίες σχετικά με την εντολή - βοήθεια . Για παράδειγμα:

Επόπτης> βοήθεια διακοπής διακοπής Διακοπή διακοπής διαδικασίας:* Διακοπή όλων των διεργασιών σε ομαδική διακοπή Διακοπή πολλαπλών διεργασιών ή ομάδες διακοπής όλων Διακοπή όλων των διεργασιών επόπτης>

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

Αυτόματη εκκίνηση της εφαρμογής web κατά την επανεκκίνηση

Τι συμβαίνει εάν ο εικονικός διακομιστής μας επανεκκινήσει ξαφνικά; (αστοχία στο κέντρο δεδομένων, προβλήματα στο μηχάνημα κεντρικού υπολογιστή, λανθασμένος διαχειριστής μπερδεμένος κ.λπ.). Σε περίπτωση τέτοιου σεναρίου, τώρα η εφαρμογή μας δεν θα ξεκινήσει αυτόματα. Για να διορθωθεί αυτό, πρέπει να καταβάλουμε λίγη περισσότερη προσπάθεια για να γράψουμε ένα μικρό σενάριο, το οποίο θα τοποθετήσουμε με επιτυχία στον μηχανισμό εκκίνησης του Ubuntu OS (διανομές τύπου Debian).

Έχετε ακούσει ποτέ για τα λεγόμενα upstart αρχεία; Είναι η συγγραφή ενός από αυτά που θα κάνουμε τώρα. Παρεμπιπτόντως, το Upstart θεωρείται επί του παρόντος ξεπερασμένο και σχεδιάζεται μια πλήρης μετάβαση στο systemd σε νέες εκδόσεις λειτουργικού συστήματος που βασίζεται σε Linux.

Περιγραφή "Επιβλέπων Telegram bot django app starting handler" start on runlevel stop σε runlevel [!2345] respawn setuid django setgid django chdir /home/django/planetpython_telegrambot/ exec /home/django/.pyenv/versions/telegram_bot/bin/supervis

Το αρχείο πρέπει να τοποθετηθεί /etc/init/(στην περίπτωσή μου του έδωσα το όνομα telegram_bot.conf). Εάν προηγουμένως όλες οι εκκινήσεις δεν προκαλούσαν προβλήματα, τότε μετά την επανεκκίνηση του συστήματος, η εφαρμογή θα ξεκινήσει αυτόματα:

$ sudo shutdown -r τώρα

Τώρα πρέπει να καταχωρήσουμε τη διεύθυνση URL μας στην πλευρά του Telegram χρησιμοποιώντας την κλήση του setWebhook API:

Εισαγωγή telepot bot_token = "BOT_TOKEN" bot = telepot.Bot(bot_token) bot.setWebhook("https://bot..format(bot_token=bot_token))

Αυτό ολοκληρώνει τη ρύθμιση του bot. Αποστολή εντολών στο bot μας @PythonPlanetBotκαι παίρνουμε επαρκείς απαντήσεις :)

  • καταγραφή αιτημάτων από χρήστες σε ένα αρχείο
  • μετακίνησε τις μεταβλητές ρυθμίσεις (λειτουργία εντοπισμού σφαλμάτων, διακριτικό bot, μυστικό κλειδί) σε μεταβλητές περιβάλλοντος μέσω αρχείων .env χρησιμοποιώντας django-environ
  • προστέθηκαν πρότυπα αρχείων διαμόρφωσης για Gunicorn, nginx και επόπτη

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

Ποια είναι η καλύτερη βολικό τρόπονα οργανωθούν όλοι αυτοί οι κατάλογοι στη μηχανή ανάπτυξης; Πώς τους ονομάζετε και πώς συνδέεστε και αναπτύσσετε στον διακομιστή;

  • έργα (όλα τα έργα στα οποία εργάζεστε)
  • αρχεία πηγής (η ίδια η εφαρμογή)
  • αντίγραφο εργασίας του αποθετηρίου (χρησιμοποιώ git)
  • εικονικό περιβάλλον (προτιμώ να το τοποθετήσω δίπλα στο έργο)
  • στατική ρίζα (για μεταγλωττισμένα στατικά αρχεία)
  • ρίζα πολυμέσων (για ληφθέντα αρχεία πολυμέσων)
  • ΔΙΑΒΑΣΤΕ
  • ΑΔΕΙΕΣ
  • τεκμηρίωση
  • σκίτσα
  • (παράδειγμα έργου που χρησιμοποιεί την εφαρμογή που παρέχεται από αυτό το έργο)
  • (σε περίπτωση χρήσης sqlite)
  • όλα όσα συνήθως χρειάζεστε για να εργαστείτε με επιτυχία σε ένα έργο

Προβλήματα που θέλω να λύσω:

4 απαντήσεις

Υπάρχουν δύο τύποι έργων Django που έχω στον κατάλογό μου ~/projects/, και τα δύο έχουν ελαφρώς διαφορετική δομή:

  • Ιστότοποι εκτός σύνδεσης
  • Συνδεδεμένες εφαρμογές

Ιστότοπος εκτός σύνδεσης

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

~/projects/project_name/ docs/ # documentation scripts/ manager.py # εγκατεστημένο στο PATH μέσω setup.py project_name/ # project dir (αυτό που δημιουργεί το django-admin.py) apps/ # project-specific applications accounts/ # most συχνή εφαρμογή, με προσαρμοσμένο μοντέλο χρήστη __init__.py ... ρυθμίσεις/ # ρυθμίσεις για διαφορετικά περιβάλλοντα, δείτε παρακάτω __init__.py production.py development.py ... __init__.py # περιέχει την έκδοση έργου urls.py wsgi.py static/ # Πρότυπα στατικών αρχείων για συγκεκριμένους ιστότοπους/ # Δοκιμές προτύπων για συγκεκριμένους ιστότοπους/ # δοκιμές για συγκεκριμένους ιστότοπους (κυρίως σε πρόγραμμα περιήγησης) tmp/ # εξαιρούνται από το git setup.py απαιτήσεις.txt απαιτήσεις_dev.txt pytest.ini ...

Ρυθμίσεις

Οι κύριες ρυθμίσεις είναι αυτές της παραγωγής. Άλλα αρχεία (π.χ. staging.py, development.py) απλώς εισάγουν τα πάντα από το production.py και παρακάμπτουν μόνο τις απαραίτητες μεταβλητές.

Υπάρχουν ξεχωριστά αρχεία ρυθμίσεων για κάθε περιβάλλον, π.χ. παραγωγή, ανάπτυξη. Έχω κάποια έργα που έχω δοκιμάσει (για δοκιμαστή), (ως έλεγχος πριν την τελική ανάπτυξη) και heroku (για ανάπτυξη σε heroku).

Απαιτήσεις

Μάλλον ορίζω τις απαιτήσεις απευθείας στο setup.py. Μόνο όσες χρειάζονται για το περιβάλλον ανάπτυξης/δοκιμών έχω απαιτήσεις_dev.txt .

Ορισμένες υπηρεσίες (π.χ. heroku) απαιτούν απαιτήσεις.txt στον ριζικό κατάλογο.

setup.py

Χρήσιμο κατά την ανάπτυξη ενός έργου με χρήση setuptools. Προσθέτει το manager.py στο PATH ώστε να μπορώ να εκτελέσω το manager.py απευθείας (οπουδήποτε).

Αιτήσεις για συγκεκριμένα έργα

Χρησιμοποίησα αυτές τις εφαρμογές στον κατάλογο project_name/apps/ και τις εισήγαγα χρησιμοποιώντας σχετική εισαγωγή.

Πρότυπα/στατικά/τοπικά/δοκιμαστικά αρχεία

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

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

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

Κατάλογος Tmp

Υπάρχει ένας προσωρινός κατάλογος στη ρίζα του έργου που εξαιρείται από το VCS. Χρησιμοποιήθηκε για την αποθήκευση πολυμέσων/στατικών αρχείων και μιας βάσης δεδομένων sqlite κατά την ανάπτυξη. Όλα στο tmp μπορούν να διαγραφούν ανά πάσα στιγμή χωρίς κανένα πρόβλημα.

Virtualenv

Προτιμώ το virtualenvwrapper και βάζω όλα τα venvs στον κατάλογο ~/.venvs, αλλά μπορείτε να το τοποθετήσετε μέσα στο tmp/ για να το διατηρήσετε μαζί.

Πρότυπο έργου

Δημιούργησα ένα πρότυπο έργου για αυτήν τη ρύθμιση, το django-start-template

Ανάπτυξη

Αυτό το έργο αναπτύσσεται ως εξής:

Πηγή $VENV/bin/ενεργοποίηση εξαγωγής DJANGO_SETTINGS_MODULE=project_name.settings.production git pull pip install -r requires.txt # Ενημέρωση βάσης δεδομένων, στατικών αρχείων, τοπικών ρυθμίσεων manager.py syncdb --noinput manager.py migrate manager.py collectstatic --noinput manager.py makemessages -a manager.py compilemessages # επανεκκίνηση wsgi touch project_name/wsgi.py

Μπορείτε να χρησιμοποιήσετε το rsync αντί για το git , αλλά πρέπει να εκτελέσετε μια δέσμη εντολών για να ενημερώσετε το περιβάλλον σας.

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

Σκίτσα και προσχέδια

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

Συνδεδεμένη εφαρμογή

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

~/projects/django-app/ docs/ app/ tests/ example_project/ LICENSE MANIFEST.in README.md setup.py pytest.ini tox.ini .travis.yml ...

Τα ονόματα των καταλόγων είναι ξεκάθαρα (ελπίζω). Τοποθέτησα τα αρχεία δοκιμής εκτός του καταλόγου της εφαρμογής, αλλά δεν έχει σημασία. Είναι σημαντικό να παρέχετε ένα README και ένα setup.py ώστε το πακέτο να μπορεί να εγκατασταθεί εύκολα μέσω pip.

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

Εργα
Έχω έναν κύριο φάκελο στον προσωπικό μου κατάλογο όπου προβάλλω όλα τα αντικείμενα στα οποία εργάζομαι.

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

Project_repository_folder/ .gitignore Makefile LICENSE.rst docs/ README.rst απαιτήσεις.txt project_folder/ manager.py media/ app-1/ app-2/ ... app-n/ static/ templates/ project/ __init__.py settings/ __init__ .py base.py dev.py local.py test.py production.py ulrs.py wsgi.py

Αποθήκη
Το Git ή το Mercurial φαίνεται να είναι τα περισσότερα δημοφιλή συστήματαέλεγχος έκδοσης μεταξύ των προγραμματιστών του Django. Και οι πιο δημοφιλείς υπηρεσίες φιλοξενίας αντιγράφων ασφαλείας είναι το GitHub και το Bitbucket.

Εικονικό περιβάλλον
Χρησιμοποιώ virtualenv και virtualenvwrapper. Αφού εγκαταστήσετε το δεύτερο, πρέπει να διαμορφώσετε τον κατάλογο εργασίας. Το δικό μου βρίσκεται στον κατάλογο my/home/envs όπως αυτό συνιστάται στον οδηγό εγκατάστασης virtualenvwrapper. Αλλά δεν νομίζω ότι το πιο σημαντικό είναι το πού τοποθετείται. Το πιο σημαντικό πράγμα όταν εργάζεστε με εικονικά περιβάλλοντα- ενημερώστε το αρχείο απαιτήσεις.txt.

Pip freeze -l > απαιτήσεις.txt

Στατική ρίζα
Φάκελος έργου

Root Media
Φάκελος έργου

ΔΙΑΒΑΣΤΕ
Ρίζα αποθετηρίου

ΑΔΕΙΑ
Ρίζα αποθετηρίου

Τεκμηρίωση
Ρίζα αποθετηρίου. Αυτά τα πακέτα python μπορούν να σας βοηθήσουν να απλοποιήσετε την τεκμηρίωσή σας:

Σκίτσα

Παραδείγματα

Βάση δεδομένων

Δεν μου αρέσει η δημιουργία νέων ρυθμίσεων/καταλόγου. Απλώς προσθέτω αρχεία που ονομάζονται settings_dev.py και settings_production.py, ώστε να μην χρειάζεται να επεξεργαστώ το BASE_DIR. Η παρακάτω προσέγγιση αυξάνει την προεπιλεγμένη δομή αντί να την αλλάξει.

Mysite/ # Project conf/ locale/ en_US/ fr_FR/ it_IT/ mysite/ __init__.py settings.py settings_dev.py settings_production.py urls.py wsgi.py static/ admin/ css/ # Custom back end styles css/ # Project front στιλ τέλους γραμματοσειρές/ εικόνες/ js/ sass/ staticfiles/ templates/ # Πρότυπα έργου περιλαμβάνει/ footer.html header.html index.html myapp/ # Application core/ migrations/ __init__.py templates/ # Application Templates myapp/ index.html static / myapp/ js/ css/ images/ __init__.py admin.py apps.py forms.py models.py models_foo.py models_bar.py views.py templatetags/ # Εφαρμογή με προσαρμοσμένους επεξεργαστές περιβάλλοντος και ετικέτες προτύπου __init__.py context_processors.py templatetags/ __init__.py templatetag_extras.py gulpfile.js manager.py απαιτήσεις.txt

εγκατάσταση pip Django==2.1.7

Επιλογή 2: Λάβετε την υποψήφια έκδοση για 2.2

pip install --pre django

Επιλογή 3: Λάβετε την πιο πρόσφατη έκδοση ανάπτυξης

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

κλώνος git https://github.com/django/django.git

Επιπλέον πληροφορίες

Για τους ανυπόμονους:

  • Τελευταία έκδοση:
    Αθροίσματα ελέγχου:
    Σημειώσεις έκδοσης:
  • Προεπισκόπηση έκδοσης:
    Αθροίσματα ελέγχου:
    Σημειώσεις έκδοσης:

Ποια έκδοση είναι καλύτερη;

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

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

Προηγούμενες εκδόσεις

  • Django 2.0.13:
    Αθροίσματα ελέγχου:
    Σημειώσεις έκδοσης:
  • Django 1.11.20 (LTS):
    Αθροίσματα ελέγχου:
    Σημειώσεις έκδοσης:
  • Μετάφραση

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


Το Django είναι ένα δωρεάν πλαίσιο Python, βασισμένο στο web, ανοιχτού κώδικα που βοηθά στην επίλυση κοινών προβλημάτων ανάπτυξης. Σας επιτρέπει να δημιουργείτε ευέλικτες, καλά δομημένες εφαρμογές. Ο Django έχει πολλά από το κουτί σύγχρονες δυνατότητες. Για παράδειγμα, για μένα, χαρακτηριστικά όπως το Admin, το Object Relational Mapping (ORM), το Routing και το Templating κάνουν το Django την πρώτη μου επιλογή όταν επιλέγω ένα κιτ εργαλείων ανάπτυξης. Η δημιουργία μιας εφαρμογής απαιτεί πολλή προσπάθεια και ενώ απολαμβάνω αυτό που κάνω, όπως κάθε προγραμματιστής, θέλω να αφιερώνω όσο το δυνατόν λιγότερο χρόνο σε εργασίες ρουτίνας. Το Django βοηθάει πολύ σε αυτό χωρίς να σας αναγκάζει να θυσιάσετε την ευελιξία της εφαρμογής.


Το χαρακτηριστικό γνώρισμα του Django είναι μια ισχυρή, διαμορφώσιμη διεπαφή διαχειριστή που δημιουργείται αυτόματα (αυτόματα;) με βάση το σχήμα του μοντέλου και τα μοντέλα διαχειριστή. Νιώθεις πραγματικά μάγος. Χρησιμοποιώντας τη διεπαφή διαχειριστή, ο χρήστης μπορεί να διαμορφώσει πολλά πράγματα, όπως μια λίστα ελέγχου πρόσβασης (ACL), δικαιώματα και ενέργειες σε επίπεδο σειράς, φίλτρα, παραγγελίες, γραφικά στοιχεία, φόρμες, πρόσθετα βοηθητικά URL και πολλά άλλα. Πιστεύω ότι κάθε εφαρμογή χρειάζεται έναν πίνακα διαχείρισης. Είναι θέμα χρόνου να χρειαστεί η κύρια εφαρμογή σας ένα τέτοιο πάνελ. Στο Django δημιουργείται γρήγορα και άνετα.


Το Django διαθέτει επίσης ένα ισχυρό ORM που λειτουργεί με όλες τις μεγάλες βάσεις δεδομένων. Είναι "τεμπέλικο": σε αντίθεση με άλλα ORM, έχει πρόσβαση στη βάση δεδομένων μόνο όπως απαιτείται. Διαθέτει υποστήριξη για βασικές δηλώσεις (και συναρτήσεις) SQL που μπορείτε να χρησιμοποιήσετε από τον πηγαίο κώδικα Python, μαζί με όλες τις άλλες δυνατότητες της γλώσσας.
Το Django έχει μια πολύ ευέλικτη και ισχυρή μηχανή προτύπων. Πολλά τυπικά φίλτρα και ετικέτες είναι διαθέσιμα και μπορείτε επίσης να δημιουργήσετε τα δικά σας. Το Django υποστηρίζει άλλους κινητήρες όπως προσαρμοσμένα πρότυπα, παρέχει ένα API για εύκολη ενσωμάτωση με άλλους κινητήρες χρησιμοποιώντας τυπικές λειτουργίες συντόμευσης για την επεξεργασία προτύπων.


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

Λάθος #1: Χρήση του παγκόσμιου περιβάλλοντος Python για εξαρτήσεις έργων

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


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


Υπάρχουν πολλοί τρόποι απομόνωσης του περιβάλλοντος, οι πιο συνηθισμένοι είναι:

  • virtualenv: Πακέτο Python που δημιουργεί τον φάκελο περιβάλλοντος. Περιέχει ένα σενάριο για (απ)ενεργοποίηση του περιβάλλοντος και διαχείριση πακέτων που είναι εγκατεστημένα σε αυτό. Αυτή είναι η αγαπημένη και πιο εύκολη μέθοδος μου. Συνήθως δημιουργώ ένα περιβάλλον κοντά στο φάκελο του έργου.
  • virtualenvwrapper: Ένα πακέτο Python που εγκαθιστά καθολικά και παρέχει πρόσβαση σε ένα σύνολο εργαλείων για τη δημιουργία/διαγραφή/ενεργοποίηση κ.λπ. εικονικών περιβαλλόντων. Όλα τα περιβάλλοντα αποθηκεύονται σε έναν φάκελο (μπορεί να αντικατασταθεί χρησιμοποιώντας τη μεταβλητή WORKON_HOME). Δεν βλέπω κανένα πλεονέκτημα στη χρήση του virtualenvwrapper αντί του virtualenv.
  • Εικονικές μηχανές: Δεν υπάρχει καλύτερη απομόνωση από μια ολόκληρη εικονική μηχανή αφιερωμένη στην εφαρμογή σας. Υπάρχουν πολλά διαθέσιμα εργαλεία, όπως το VirtualBox (δωρεάν), το VMware, το Parallels και το Proxmox (το αγαπημένο μου, υπάρχει δωρεάν έκδοση). Όταν συνδυάζεται με ένα εργαλείο αυτοματισμού εικονικής μηχανής όπως το Vagrant, αυτό μπορεί να είναι μια πολύ ισχυρή λύση.
  • Εμπορευματοκιβώτια: Τα τελευταία χρόνια χρησιμοποιώ το Docker σχεδόν σε κάθε έργο, ειδικά σε νέα έργα που ξεκινούν από την αρχή. Το Docker είναι ένα απίστευτο εργαλείο με πολλές δυνατότητες. Υπάρχουν πολλές διαθέσιμες επιλογές για την αυτοματοποίησή του. εργαλεία τρίτων. Το Docker διαθέτει προσωρινή αποθήκευση στρώσης, η οποία επιτρέπει την αναδημιουργία κοντέινερ εξαιρετικά γρήγορα. Σε αυτά, χρησιμοποιώ ένα παγκόσμιο περιβάλλον Python επειδή κάθε κοντέινερ έχει το δικό του σύστημα αρχείων και τα έργα είναι απομονωμένα σε υψηλό επίπεδο. Το Docker επιτρέπει στα νέα μέλη της ομάδας να ξεκινήσουν ένα έργο πιο γρήγορα, ειδικά εάν έχουν εμπειρία με την τεχνολογία.

Λάθος #2: Λείπουν οι δεσμεύσεις εξάρτησης στο απαιτήσεις.txt

Κάθε νέο έργοΗ Python θα πρέπει να ξεκινά με ένα αρχείο requires.txt και ένα νέο sandbox. Συνήθως θα χρησιμοποιούσατε το pip/easy_install για να εγκαταστήσετε όλα τα πακέτα, χωρίς να ξεχνάτε τις απαιτήσεις.txt . Συνήθως πιο εύκολο ( Μπορεί, πιο σωστά) αναπτύξτε έργα σε διακομιστές ή σε μηχανήματα μελών της ομάδας.


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


Στην παραγωγή, εκτελείτε πάντα δέσιμο συσκευασίας! Χρησιμοποιώ ένα πολύ καλό εργαλείο για αυτό, το pip-tools. Παρέχει ένα σύνολο εντολών για τη διαχείριση των εξαρτήσεων. Το εργαλείο δημιουργεί αυτόματα τις απαιτήσεις.txt , το οποίο περιέχει όχι μόνο τις εξαρτήσεις σας, αλλά ολόκληρο το δέντρο, δηλαδή τις εξαρτήσεις των εξαρτήσεων σας.


Μερικές φορές χρειάζεται να ενημερώσετε ορισμένα πακέτα στη λίστα εξαρτήσεων (για παράδειγμα, απλώς ένα πλαίσιο ή ένα βοηθητικό πρόγραμμα). Εάν καταφύγετε στο πάγωμα κουκίδων, δεν γνωρίζετε ποιες εξαρτήσεις χρησιμοποιούνται από ποια πακέτα και επομένως δεν μπορείτε να τις ενημερώσετε. Το εργαλείο pip-tools συνδέει αυτόματα πακέτα σύμφωνα με τις εξαρτήσεις που συνδέετε και επομένως αποφασίζει αυτόματα ποια πακέτα πρέπει να ενημερωθούν. Και χάρη στα σχόλια που χρησιμοποιούνται στο απαιτήσεις.txt, γνωρίζετε πάντα ποιο πακέτο προήλθε από ποια εξάρτηση.


Εάν είστε ακόμη πιο προσεκτικοί, μπορείτε να δημιουργήσετε αντίγραφα ασφαλείας των αρχείων προέλευσης των εξαρτήσεών σας. Αποθηκεύστε ένα αντίγραφο στο σύστημα αρχείων σας, φάκελο Git, φάκελο S3, FTP, SFTP - όπου κι αν το έχετε διαθέσιμο. Υπάρχουν περιπτώσεις όπου η διαγραφή ενός σχετικά μικρού πακέτου σπάει μεγάλο αριθμό πακέτων σε npm. Το Pip σάς επιτρέπει να κάνετε λήψη όλων των απαιτούμενων εξαρτήσεων ως αρχεία πηγής. Διαβάστε περισσότερα σχετικά με αυτό εκτελώντας τη λήψη βοήθειας pip.

Λάθος #3: Χρησιμοποιώντας παλιομοδίτικα συναρτήσεις Python αντί για προβολές που βασίζονται σε τάξη

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


Τα CBV είναι προβολές γενικού σκοπού που παρέχουν αφηρημένες τάξεις, υλοποίηση κοινών εργασιών ανάπτυξης ιστού. Τα CBV δημιουργούνται από επαγγελματίες και καλύπτουν τις πιο περιζήτητες συμπεριφορές. Έχουν ένα όμορφα δομημένο API και το CBV θα σας δώσει την ευκαιρία να απολαύσετε όλα τα οφέλη του OOP. Ο κώδικάς σας θα είναι πιο καθαρός και πιο ευανάγνωστος. Ξεχάστε τις δυσκολίες χρήσης τυποποιημένα χαρακτηριστικάΣυναρτήσεις προβολής Django για δημιουργία λιστών, λειτουργίες CRUD, επεξεργασία φορμών κ.λπ. Μπορείτε απλά να επεκτείνετε το κατάλληλο CBV για την προβολή σας και να παρακάμψετε συναρτήσεις ή ιδιότητες κλάσης που διαμορφώνουν τη συμπεριφορά της προβολής (συνήθως μια συνάρτηση επιστρέφει μια ιδιότητα και μπορείτε προσθέστε οποιαδήποτε λογική σε αυτό που μπορεί να μετατρέψει τον κώδικά σας σε σπαγγέτι εάν χρησιμοποιείτε συναρτήσεις προβολής αντί για CBV).


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


Δημιούργησα ένα πακέτο ονομάτων προτύπων Django που τυποποιεί τα ονόματα προτύπων για τις προβολές σας με βάση το όνομα της εφαρμογής και το όνομα της κλάσης προβολής. Το χρησιμοποιώ καθημερινά και εξοικονομώ πολύ χρόνο όταν επιλέγω ονόματα. Απλώς εισάγετε το mixin στο CBV σας - class Detail(TemplateNames, DetailView): - και θα αρχίσει να λειτουργεί! Φυσικά, μπορείτε να παρακάμψετε τις λειτουργίες μου και να προσθέσετε πρότυπα που ανταποκρίνονται σε κινητά, άλλα πρότυπα πρακτόρων χρήστη ή οτιδήποτε άλλο.

Λάθος Νο. 4. Γράφοντας «χοντρές» απόψεις και «αδύνατες» (κοκαλιάρικες) μοντέλα

Εάν η λογική της εφαρμογής έχει μετακινηθεί από το μοντέλο στις προβολές, αυτό σημαίνει ότι οι προβολές περιέχουν κώδικα που ανήκει στο μοντέλο. Δηλαδή, οι παραστάσεις γίνονται «χοντρές» και το μοντέλο γίνεται «λεπτό».


Αλλά πρέπει να γράψετε "χοντρά" μοντέλα και "λεπτές" αναπαραστάσεις.


Χωρίστε τη λογική σε μικρές μεθόδους στο μοντέλο. Αυτό θα τους επιτρέψει να χρησιμοποιούνται επανειλημμένα και από πολλές πηγές (διεπαφή χρήστη back-end, διεπαφή χρήστη διεπαφής, τερματικά σημεία API, πολλαπλές προβολές). Χρειάζονται μόνο μερικές γραμμές κώδικα και δεν χρειάζεται να κάνετε copy-paste ένα σωρό γραμμές. Την επόμενη φορά που θα γράψετε τη λειτουργικότητα για να στείλετε ένα email σε έναν χρήστη, επεκτείνετε το μοντέλο με μια λειτουργία email αντί να γράψετε τη λογική στον ελεγκτή.


Αυτό θα κάνει τον κώδικά σας πιο ελεγχόμενο για τη μονάδα επειδή μπορείτε να δοκιμάσετε τη λογική ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗσε ένα μέρος, αντί να το κάνετε σε κάθε ελεγκτή. Διαβάστε περισσότερα για αυτό το ζήτημα στο Django Best Practices. Η λύση είναι απλή: γράψτε «χοντρά» μοντέλα και «λεπτές» παραστάσεις. Ξεκινήστε να το κάνετε αυτό στο επόμενο έργο σας ή αναδιαμορφώστε το τρέχον.

Λάθος Νο. 5. Τεράστιο, αδέξιο αρχείο ρυθμίσεων

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


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


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


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


από split_settings.tools εισαγωγή προαιρετική, περιλαμβάνει include("components/base.py", "components/database.py", "components/*.py", # the project διαφορετικές ρυθμίσεις envs προαιρετικά("envs/devel/*.py "), προαιρετικό("envs/production/*.py"), προαιρετικό("envs/staging/*.py"), # για τυχόν τοπικές ρυθμίσεις προαιρετικές('local_settings.py"),)

Λάθος #6: Εφαρμογή όλα σε ένα, κακή δομή εφαρμογής και εσφαλμένη τοποθέτηση πόρων

Κάθε έργο Django αποτελείται από πολλές εφαρμογές. Στην ορολογία του Django, μια εφαρμογή είναι ένα έργο Python που περιέχει τουλάχιστον αρχεία __init__.py και models.py. Στις πρόσφατες εκδόσεις του Django, το models.py δεν χρειάζεται πλέον, αρκεί μόνο το __init__.py.


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


Θα πρέπει να μπορείτε να περιγράψετε πλήρως τον σκοπό της εφαρμογής με μία ή δύο σύντομες προτάσεις. Για παράδειγμα: "Επιτρέπει στον χρήστη να εγγραφεί και να ενεργοποιήσει τον λογαριασμό του μέσω ταχυδρομείου."



  • Στατικά αρχεία: έργο/εφαρμογές/όνομα εφαρμογής/στατικό/όνομα εφαρμογής/
  • Ετικέτες προτύπου: project/apps/appname/templatetags/appname.py
  • Αρχεία προτύπων: έργο/εφαρμογές/όνομα εφαρμογής/πρότυπα/όνομα εφαρμογής/

Πάντα να προσαρτάτε τα ονόματα εφαρμογών με ονόματα υποφακέλων, επειδή όλοι οι στατικοί φάκελοι συνδυάζονται σε έναν. Και αν δύο ή περισσότερες εφαρμογές έχουν αρχείο js/core.js, τότε η τελευταία εφαρμογή στις ρυθμίσεις.INSTALLED_APPLICATIONS θα αντικαταστήσει όλες τις προηγούμενες. Κάποτε αντιμετώπισα ένα τέτοιο σφάλμα στο έργο μου και πέρασα περίπου έξι ώρες διόρθωσης σφαλμάτων έως ότου συνειδητοποίησα ότι ένας άλλος προγραμματιστής είχε παρακάμψει το static/admin/js/core.js μου, έτσι τα μέλη της ομάδας εφάρμοσαν έναν προσαρμοσμένο πίνακα διαχείρισης SPA και έδωσαν στα αρχεία τους τα εξής ίδια ονόματα.


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


root@c5b96c395cfb:/test# δέντρο project/apps/portal/ project/apps/portal/ ├── __init__.py ├── admin.py ├─└ apps.py ├── διαχείριση ____________________ └── εντολές │ ├── __init__.py │ └── update_portal_feeds.py ├── migrations │ └─└ __init__.py├s __init__.py├s. ── πύλη │ ├── css │ ├ ── img │ └── js ├── πρότυπα │ └── │ └── index.html └── templates │_ ─__ portal.py ├── tests.py ├ ─ ─ urls.py └── views.py 11 κατάλογοι, 14 αρχεία

Χάρη σε αυτή τη δομή, μπορείτε ανά πάσα στιγμή να εξαγάγετε την εφαρμογή σε άλλο πακέτο Python και να την χρησιμοποιήσετε ξανά. Μπορείτε ακόμη να το δημοσιεύσετε στο PyPi ως πακέτο ανοιχτού κώδικα ή να το μετακινήσετε σε άλλο φάκελο. Θα καταλήξετε με κάτι σαν αυτή τη δομή του έργου:


root@c5b96c395cfb:/test# δέντρο -L 3 . ανάπτυξη ─ media ├── έργο │ ├── __init__.py │ ├── εφαρμογές │ │ ├── auth │ │ ├── blog │ │ └── faq │ │ ├ faq │ │ ├ tal │ │ └── χρήστες │ ├── conf │ ├── settings.py │ ├── static │ ├── templates │ ├── urls.py │ └└─ wsgi.py └└├─── admin ├── γραμματοσειρές ├── img └── js 25 κατάλογοι, 5 αρχεία

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

Λάθος #7: STATICFILES_DIRS και STATIC_ROOT μπερδεύουν τους νεοφερμένους στην ανάπτυξη του Django

Τα στατικά αρχεία είναι στοιχεία που δεν αλλάζουν καθώς χρησιμοποιείται η εφαρμογή. Για παράδειγμα, JavaScript, CSS, εικόνες, γραμματοσειρές κ.λπ. Στο Django, "συσσωρεύονται" σε έναν δημόσιο κατάλογο κατά την ανάπτυξη.


Σε λειτουργία ανάπτυξης - python manager.py runserver - Το Django αναζητά στατικά αρχεία χρησιμοποιώντας τη ρύθμιση STATICFILES_FINDERS. Από προεπιλογή, προσπαθεί να βρει το ζητούμενο αρχείο στους φακέλους που αναφέρονται στο STATICFILES_DIRS. Εάν δεν το βρει, πραγματοποιεί αναζήτηση χρησιμοποιώντας το django.contrib.staticfiles.finders.AppDirectoriesFinder , το οποίο ελέγχει τον στατικό φάκελο κάθε εφαρμογής που είναι εγκατεστημένη στο έργο. Αυτός ο σχεδιασμός σάς επιτρέπει να γράφετε επαναχρησιμοποιήσιμες εφαρμογές που συνοδεύονται από τα δικά τους στατικά αρχεία.


Στην παραγωγή, διανέμετε στατικά δεδομένα μέσω ενός ξεχωριστού διακομιστή web, όπως το nginx. Δεν γνωρίζει τίποτα για τη δομή εφαρμογής του έργου Django ή σε ποιους φακέλους διανέμονται τα στατικά αρχεία σας. Ευτυχώς, το Django μας παρέχει μια εντολή συλλογής στατικής διαχείρισης - python manager.py collectstatic - η οποία περνάει από το STATICFILES_FINDERS και αντιγράφει όλα τα στατικά αρχεία από τους στατικούς φακέλους της εφαρμογής, καθώς και από τους φακέλους που αναφέρονται στο STATICFILES_DIRS, σε αυτόν που έχετε καθορίσει τον κατάλογο STATIC_ROOT. Αυτό σας επιτρέπει να επιλύετε πόρους ως στατικά δεδομένα χρησιμοποιώντας την ίδια λογική με τον διακομιστή Django στη λειτουργία ανάπτυξης και να συλλέγετε όλα τα στατικά αρχεία σε ένα μέρος για τον διακομιστή ιστού.


Μην ξεχνάτε να τρέχετε το collectstatic στο περιβάλλον παραγωγής σας!

Λάθος #8: Χρήση προεπιλεγμένων STATICFILES_STORAGE και φορτωτών προτύπων Django στην παραγωγή

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


Ωραία ιδέα και μπορεί να εφαρμοστεί σε λίγες μόνο γραμμές στη διαμόρφωση nginx για το φάκελο μας με στατικά αρχεία. Τι γίνεται όμως με τον έλεγχο ότι η προσωρινή μνήμη είναι ενημερωμένη; Εάν ένας χρήστης πραγματοποιεί λήψη του πόρου μας μόνο μία φορά, τι γίνεται αν ενημερώσετε το λογότυπο, τις γραμματοσειρές, το JavaScript ή το χρώμα του κειμένου στο μενού; Για να λύσετε αυτό το πρόβλημα, πρέπει να δημιουργείτε μοναδικές διευθύνσεις URL και ονόματα για κάθε στατικό αρχείο κάθε φορά που αναπτύσσετε!


Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το ManifestStaticFilesStorage ως STATICFILES_STORAGE (προσέξτε, ο κατακερματισμός είναι ενεργοποιημένος μόνο σε λειτουργία DEBUG=false) και να εκτελέσετε την εντολή collectstatic. Αυτό θα οδηγήσει σε μείωση του αριθμού των αιτημάτων πόρων από τον ιστότοπο παραγωγής σας και θα τον κάνει να αποδίδεται πολύ πιο γρήγορα.


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


Στην ενότητα cached.Loader configuration μπορείτε να βρείτε Καλό παράδειγμακαι λεπτομέρειες για τη λύση του προβλήματος. Μην χρησιμοποιείτε το πρόγραμμα φόρτωσης σε λειτουργία ανάπτυξης επειδή δεν φορτώνει εκ νέου αναλυμένα πρότυπα από το σύστημα αρχείων. Θα χρειαστεί να επανεκκινήσετε το έργο σας χρησιμοποιώντας το python manager.py startapp κάθε φορά που αλλάζει το πρότυπο. Αυτό μπορεί να είναι ενοχλητικό κατά την ανάπτυξη, αλλά είναι ιδανικό για περιβάλλον παραγωγής.

Λάθος #9: Καθαρή Python για βοηθητικά προγράμματα ή σενάρια

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


Δείτε επίσης το πακέτο Django Extensions, το οποίο είναι μια συλλογή προσαρμοσμένων επεκτάσεων για το Django. Ίσως κάποιος έχει ήδη εφαρμόσει τις εντολές σας! Υπάρχουν πολλές κοινές εντολές στόχου.

Λάθος Νο 10. Κτίριο ποδηλάτων

Υπάρχουν χιλιάδες έτοιμες λύσεις για Django και Python. Συμβουλευτείτε τις μηχανές αναζήτησης πριν γράψετε κάτι που δεν είναι καθόλου μοναδικό. Μάλλον υπάρχει ήδη μια κατάλληλη λύση.


Δεν χρειάζεται να περιπλέκουμε τα πράγματα. Πρώτον, ας το Google! Εγκαταστήστε το πακέτο ποιότητας που βρίσκετε, διαμορφώστε, επεκτείνετε και ενσωματώστε στο έργο σας. Και αν είναι δυνατόν, συνεισφέρετε στον ανοιχτό κώδικα.


Ακολουθεί μια λίστα με τα δικά μου πακέτα Django για να ξεκινήσετε:

  • URL Django Macros: Διευκολύνει τη σύνταξη (και την ανάγνωση) μοτίβων URL σε εφαρμογές Django χρησιμοποιώντας μακροεντολές.
  • Django Templates Names: Ένα μικρό mixin που σας βοηθά να τυποποιήσετε εύκολα τα ονόματα των προτύπων CBV σας.
  • Ρυθμίσεις Django Split: Σας επιτρέπει να διανέμετε τις ρυθμίσεις του Django σε πολλά αρχεία και καταλόγους. Παρακάμπτει και τροποποιεί εύκολα τις ρυθμίσεις. Χρησιμοποιεί χαρακτήρες μπαλαντέρ σε διαδρομές αρχείων και επισημαίνει τα αρχεία διαμόρφωσης ως προαιρετικά.

Μην επαναλαμβάνετε τον εαυτό σας (ΞΕΡΑ)!


Είμαι υποστηρικτής της ιδέας DRY, έτσι δημιούργησα τον σκελετό Django - εύχρηστο εργαλείομε μια σειρά από ωραία χαρακτηριστικά εκτός συσκευασίας:

  • Ανάπτυξη/παραγωγή εικόνων Docker που διαχειρίζονται το docker-compose, επιτρέποντας την εύκολη ενορχήστρωση με μια λίστα κοντέινερ.
  • Ένα απλό σενάριο Fabric για ανάπτυξη στην παραγωγή.
  • Διαμόρφωση για το πακέτο Django Split Settings με ρυθμίσεις βάσης δεδομένων και τοπικής πηγής.
  • Ενσωματωμένο στο έργο Webpack - όταν εκτελείτε την εντολή collectstatic, το Django θα συλλέγει μόνο τον φάκελο dist.
  • Διαμορφώνονται όλες οι βασικές ρυθμίσεις και δυνατότητες του Django, όπως πρότυπα Django που αποθηκεύονται προσωρινά στην παραγωγή, κατακερματισμένα στατικά αρχεία, μια ενσωματωμένη γραμμή εργαλείων για εντοπισμό σφαλμάτων, καταγραφή κ.λπ.

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

Ετικέτες:

  • Πύθων
  • τζάνγκο
  • κανείς δεν διαβάζει ετικέτες
Προσθέστε ετικέτες

Περιγραφή της διαδικασίας γρήγορης εγκατάστασης του Django από τον Πίνακα Ελέγχου Plesk.

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

"Pro" (με συνδεδεμένη πρόσβαση SSH), "Plus", "VIP", καθώς και κατά τη δοκιμαστική πρόσβαση σε αυτές τις τιμές και προσφέρει τη γρήγορη δημιουργία ενός νέου έργου Django. Για να το κάνετε αυτό χρειάζεστε:

  1. Συνδεθείτε στον Πίνακα Ελέγχου (θα λάβετε διαπιστευτήρια πρόσβασης αμέσως μετά.)
  2. Στο κύριο μενού του πίνακα ελέγχου, επιλέξτε "Domains".
  3. Επιλέξτε τον τομέα στον οποίο σκοπεύετε να εγκαταστήσετε το Django.
  4. Στην ομάδα "Εφαρμογές και υπηρεσίες", επιλέξτε "Εφαρμογές Ιστού".
  5. Εισαγάγετε το django στη γραμμή αναζήτησης και, στη συνέχεια, ξεκινήστε την εγκατάσταση.
  6. Διαβάστε προσεκτικά την άδεια χρήσης, αφού συμφωνήσετε, είναι δυνατή η περαιτέρω εγκατάσταση.
  7. Στην ενότητα "Επιλογές εγκατάστασης", επιλέξτε τον κατάλογο προορισμού για την εγκατάσταση της εφαρμογής.
  8. Στην ενότητα "Ρυθμίσεις βάσης δεδομένων" πρέπει να επιλέξετε τον τύπο (Ενεργ αυτή τη στιγμή MySQL και PostgreSQL υποστηρίζονται), καθορίστε το όνομα χρήστη και τον κωδικό πρόσβασης της βάσης δεδομένων - αυτές οι παράμετροι θα εισαχθούν αυτόματα στο αρχείο settings.py.
  9. Στη συνέχεια, πρέπει να εισαγάγετε τα στοιχεία σύνδεσης, τη διεύθυνση email και τον κωδικό πρόσβασης διαχειριστή.
  10. στο κεφάλαιο " Προσωπικές ρυθμίσεις"Κατά την εγκατάσταση του πακέτου, έχετε πρόσβαση στις ρυθμίσεις του Django για το νέο έργο, και συγκεκριμένα:
    • "Django Project Name" - το όνομα του έργου Django που θα δημιουργηθεί.
    • "Όνομα καταλόγου με έργα Django" - το όνομα του καταλόγου όπου θα βρίσκονται τα έργα Django, αυτός ο κατάλογος θα βρίσκεται στον ιδιωτικό φάκελο στον ιστότοπό σας.
    • "Ενεργοποίηση διεπαφής διαχειριστή" - όταν είναι επιλεγμένη αυτή η επιλογή, το django αναπτύσσεται με ενεργοποιημένη την ενότητα διαχειριστή, η βάση δεδομένων συγχρονίζεται, η σύνδεση διαχειριστή και ο κωδικός πρόσβασης ορίζονται στις τιμές που καθορίζονται παραπάνω.
    • "Το δικό σου virtualenv" - αυτή την επιλογήπεριλαμβάνει τη δημιουργία του δικού σας «στιγμιότυπου» python, ενώ έχετε την ευκαιρία να εγκαταστήσετε τις δικές σας μονάδες, οι οποίες μπορεί να διαφέρουν από αυτές που είναι εγκατεστημένες στο hosting όταν είναι ενεργοποιημένο, ο χώρος στο δίσκο που καταλαμβάνει η εφαρμογή αυξάνεται ελαφρώς.

Μετά την εγκατάσταση αυτή η αίτηση, στο http://domain_name/installation_directory/ θα είναι διαθέσιμο τυπική σελίδαΜε την τελευταία σταθερή έκδοση του Django που είναι εγκατεστημένη με την Python 2.6.2, απαιτείται πλήρης πρόσβαση ssh για περαιτέρω λειτουργίες και την εκτέλεση τυπικών ενεργειών, για παράδειγμα, διαχείριση ενός έργου μέσω του manager.py. Αυτή η υπηρεσία είναι διαθέσιμη από προεπιλογή για τα προγράμματα τιμολόγησης "Plus" και "VIP" στο τιμολόγιο "Pro" είναι δυνατό να αποκτήσετε πλήρη πρόσβαση ssh επεκτείνοντας το τιμολόγιο με μια πρόσθετη επιλογή μέσω του συστήματος χρέωσης. Εάν για κάποιο λόγο αυτό το πακέτο δεν πληροί τις απαιτήσεις του έργου σας, μπορείτε να δημιουργήσετε ένα έργο Django