Πως να ανεβάσετε το 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 startproject δημιουργεί μια μικρή προεπιλεγμένη παραμετροποίηση του WSGI για εσάς, την οποία μπορείτε να αλλάξετε για τις ανάγκες του project σας και να κατευθύνετε οποιονδήποτε συμβατό με το WSGI application server, για χρήση.

Το 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

Για να εφαρμόσετε ένα WSGI middleware μπορείτε, απλώς, να κάνετε wrap το application object. Για παράδειγμα, θα μπορούσατε να προσθέσετε αυτές τις γραμμές στο τέλος του αρχείου wsgi.py:

from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)

Μπορείτε επίσης να αντικαταστήσετε το Django WSGI application με ένα δικό σας WSGI application που το τελευταίο θα ανατεθεί στο Django WSGI application, αν θέλετε να συνδυάσετε μια Django εφαρμογή με μια WSGI εφαρμογή από ένα άλλο framework.

Σημείωση

Μερικά τρίτα WSGI middleware δεν καλούν τη μέθοδο close στο response object αφού έχουν τελειώσει με το request. Σε αυτές τις περιπτώσεις το σήμα request_finished δεν στέλνεται. Αυτό μπορεί να προκαλέσει αδρανείς συνδέσεις (idle connections) στη βάση δεδομένων και στους memcache servers.

Back to Top