Πως να ανεβάσετε το site σας χρησιμοποιώντας το WSGI¶
Η βασική πλατφόρμα του Django για να ανεβάσετε το site σας (deploying) είναι το WSGI, το Python στάνταρντ για τους Web servers και τις εφαρμογές. Αν δεν γνωρίζετε τι είναι το WSGI (Web Server Gateway Interface) θα προσπαθήσουμε να σας το εξηγήσουμε με λίγα λόγια εδώ: ένας παραδοσιακός Web server δεν καταλαβαίνει ή δεν γνωρίζει πως να τρέξει μια Python εφαρμογή. Για το λόγο αυτό χρειάζεται να υπάρξει ένας μεσολαβητής ο οποίος θα στέκεται μεταξύ του Web server και της εφαρμογής σας (πχ μια Django ή κάποια άλλη Python εφαρμογή). Αυτός ο μεσολαβητής ονομάζεται WSGI server και μια από τις αρμοδιότητες του είναι να καλεί ένα callable object που βρίσκεται στην Python εφαρμογή σας. Ο WSGI server τρέχει ως ένα διαφορετικό process και ακούει σε διαφορετική πόρτα από αυτή που ακούει ο Web server. Η πιο συνηθισμένη υλοποίηση ενός WSGI server είναι η εξής: ένας browser ζητά την εμφάνιση μιας HTML σελίδας, στην πόρτα 80 όπου ακούει ο Web server. Αφού πάρει το αίτημα ο Web server ζητάει από τον WSGI server, μέσω μιας άλλης πόρτας πχ 8000, να του δώσει την HTML που ζητήθηκε. Ο WSGI server, με τη σειρά του, καλεί το callable object της εφαρμογής σας και εκείνη τη στιγμή ξεκινούν οι απαραίτητες διαδικασίες για να παραχθεί η ζητούμενη HTML. Τέλος, η εφαρμογή σας δίνει την HTML στον WSGI server, αυτός στον Web server και τελικά φθάνει στον browser όπου προβάλλεται.
Django’s startproject
management command sets up a minimal default
WSGI configuration for you, which you can tweak as needed for your project,
and direct any WSGI-compliant application server to use.
Το Django περιλαμβάνει εγχειρίδια για αρχάριους για τους ακόλουθους WSGI servers:
Το application
object¶
Η έννοια κλειδί του deploying με το WSGI είναι το application
callable το οποίο χρησιμοποιεί ο application server για να επικοινωνήσει με τον κώδικα σας. Συνήθως χρησιμοποιείται ως object με το όνομα application
σε κάποιο Python module στο οποίο έχει πρόσβαση ο server.
Η εντολή startproject
δημιουργεί ένα αρχείο <project_name>/wsgi.py
το οποίο περιέχει ένα τέτοιο application
callable.
Χρησιμοποιείται όχι μόνο από τον development server του Django αλλά και σε παραγωγικό περιβάλλον από WSGI deployments.
Οι WSGI servers αποκτούν το path στο application
callable από την παραμετροποίηση τους. Ο προεγκατεστημένος server του Django, που τρέχετε με την εντολή runserver
, διαβάζει το path από τη ρύθμιση WSGI_APPLICATION
. Από προεπιλογή, είναι σεταρισμένη στην τιμή <project_name>.wsgi.application
, η οποία δείχνει στο application
callable που βρίσκεται μέσα στο αρχείο <project_name>/wsgi.py
.
Παραμετροποιώντας το module των ρυθμίσεων¶
Όταν ο WSGI server φορτώσει την εφαρμογή σας, το Django χρειάζεται να κάνει import το module των γενικών ρυθμίσεων σας — εκεί είναι το μέρος όπου ορίζεται ολόκληρη η εφαρμογή σας.
Το Django χρησιμοποιεί την environment variable DJANGO_SETTINGS_MODULE
για να εντοπίσει το κατάλληλο module ρυθμίσεων. Η τιμή αυτή πρέπει να περιέχει το μονοπάτι για το module των ρυθμίσεων σύμφωνα με τελείες (πχ myproject.settings
και όχι myproject/settings.py
). Μπορείτε να χρησιμοποιήσετε διαφορετική τιμή αυτής της μεταβλητής για development και production περιβάλλοντα. Όλα εξαρτώνται από το πως έχετε οργανώσει τις ρυθμίσεις σας.
Αν αυτή η μεταβλητή δεν έχει οριστεί, το προεπιλεγμένο αρχείο wsgi.py
τη θέτει στην τιμή mysite.settings
, όπου το mysite
είναι το όνομα του project σας. Με αυτό τον τρόπο, από προεπιλογή, η εντολή runserver
ανακαλύπτει το προεπιλεγμένο αρχείο ρυθμίσεων.
Σημείωση
Εφόσον τις environment variables τις βλέπει όλο το σύστημα καθολικώς, αυτή η μέθοδος δεν θα δουλέψει αν έχετε πολλά Django sites μέσα στο ίδιο process. Αυτό συμβαίνει με το mod_wsgi (ένας WSGI server από αρκετούς που είναι διαθέσιμοι).
Για να αποφύγετε τέτοιου είδους προβλήματα, χρησιμοποιήστε το mod_wsgi σε daemon mode με κάθε site σε δικό του daemon process ή παρακάμψτε (override) την τιμή από το environment θέτοντας μια διαφορετική, ως os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
μέσα στο αρχείο wsgi.py
.
Εφαρμόζοντας ένα WSGI middleware¶
To apply WSGI middleware you can wrap the application object. For instance
you could add these lines at the bottom of wsgi.py
:
from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)
Μπορείτε επίσης να αντικαταστήσετε το Django WSGI application με ένα δικό σας WSGI application που το τελευταίο θα ανατεθεί στο Django WSGI application, αν θέλετε να συνδυάσετε μια Django εφαρμογή με μια WSGI εφαρμογή από ένα άλλο framework.