{"title":"Πως να ανεβάσετε το site σας χρησιμοποιώντας το WSGI","version":"1.10","locale":"el","docname":"howto/deployment/wsgi/index","url":"/el/1.10/howto/deployment/wsgi/","canonical":"https://djangodocs.dev/el/1.10/howto/deployment/wsgi/","summary":"Η βασική πλατφόρμα του Django για να ανεβάσετε το site σας (deploying) είναι το WSGI , το Python στάνταρντ για τους Web servers και τις εφαρμογές. Αν δεν γνωρίζετε…","html":"<h1>Πως να ανεβάσετε το site σας χρησιμοποιώντας το WSGI<a class=\"heading-anchor\" href=\"#how-to-deploy-with-wsgi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Η βασική πλατφόρμα του Django για να ανεβάσετε το site σας (deploying) είναι το <a class=\"reference external\" href=\"http://www.wsgi.org\">WSGI</a>, το 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 όπου προβάλλεται.</p>\n<p>Η διαχειριστική εντολή του Django <a class=\"reference internal\" href=\"/el/1.10/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> δημιουργεί μια μικρή προεπιλεγμένη παραμετροποίηση του WSGI για εσάς, την οποία μπορείτε να αλλάξετε για τις ανάγκες του project σας και να κατευθύνετε οποιονδήποτε συμβατό με το WSGI application server, για χρήση.</p>\n<p>Το Django περιλαμβάνει εγχειρίδια για αρχάριους για τους ακόλουθους WSGI servers:</p>\n<div class=\"toctree-wrapper compound\">\n<ul>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/el/1.10/howto/deployment/wsgi/modwsgi/\">Πως να χρησιμοποιήσετε το Django με τον Apache και το <code class=\"docutils literal notranslate\"><span class=\"pre\">mod_wsgi</span></code></a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/el/1.10/howto/deployment/wsgi/apache-auth/\">Πιστοποίηση της βάσης δεδομένων ενός Django χρήστη μέσω Apache</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/el/1.10/howto/deployment/wsgi/gunicorn/\">Πως να χρησιμοποιήσετε το Django με το Gunicorn</a></li>\n<li class=\"toctree-l1\"><a class=\"reference internal\" href=\"/el/1.10/howto/deployment/wsgi/uwsgi/\">Πως να χρησιμοποιήσετε το Django με το uWSGI</a></li>\n</ul>\n</div>\n<section id=\"the-application-object\">\n<h2>Το <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> object<a class=\"heading-anchor\" href=\"#the-application-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Η έννοια κλειδί του deploying με το WSGI είναι το <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> callable το οποίο χρησιμοποιεί ο application server για να επικοινωνήσει με τον κώδικα σας. Συνήθως χρησιμοποιείται ως object με το όνομα <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> σε κάποιο Python module στο οποίο έχει πρόσβαση ο server.</p>\n<p>Η εντολή <a class=\"reference internal\" href=\"/el/1.10/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> δημιουργεί ένα αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">&lt;project_name&gt;/wsgi.py</span></code> το οποίο περιέχει ένα τέτοιο <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> callable.</p>\n<p>Χρησιμοποιείται όχι μόνο από τον development server του Django αλλά και σε παραγωγικό περιβάλλον από WSGI deployments.</p>\n<p>Οι WSGI servers αποκτούν το path στο <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> callable από την παραμετροποίηση τους. Ο προεγκατεστημένος server του Django, που τρέχετε με την εντολή <a class=\"reference internal\" href=\"/el/1.10/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a>, διαβάζει το path από τη ρύθμιση <a class=\"reference internal\" href=\"/el/1.10/ref/settings/#std-setting-WSGI_APPLICATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">WSGI_APPLICATION</span></code></a>. Από προεπιλογή, είναι σεταρισμένη στην τιμή <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;project_name&gt;.wsgi.application</span></code>, η οποία δείχνει στο <code class=\"docutils literal notranslate\"><span class=\"pre\">application</span></code> callable που βρίσκεται μέσα στο αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">&lt;project_name&gt;/wsgi.py</span></code>.</p>\n</section>\n<section id=\"configuring-the-settings-module\">\n<h2>Παραμετροποιώντας το module των ρυθμίσεων<a class=\"heading-anchor\" href=\"#configuring-the-settings-module\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Όταν ο WSGI server φορτώσει την εφαρμογή σας, το Django χρειάζεται να κάνει import το module των γενικών ρυθμίσεων σας — εκεί είναι το μέρος όπου ορίζεται ολόκληρη η εφαρμογή σας.</p>\n<p>Το Django χρησιμοποιεί την environment variable <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/el/1.10/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a>  για να εντοπίσει το κατάλληλο module ρυθμίσεων. Η τιμή αυτή πρέπει να περιέχει το μονοπάτι για το module των ρυθμίσεων σύμφωνα με τελείες (πχ <code class=\"docutils literal notranslate\"><span class=\"pre\">myproject.settings</span></code> και όχι <code class=\"docutils literal notranslate\"><span class=\"pre\">myproject/settings.py</span></code>). Μπορείτε να χρησιμοποιήσετε διαφορετική τιμή αυτής της μεταβλητής για development και production περιβάλλοντα. Όλα εξαρτώνται από το πως έχετε οργανώσει τις ρυθμίσεις σας.</p>\n<p>Αν αυτή η μεταβλητή δεν έχει οριστεί, το προεπιλεγμένο αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">wsgi.py</span></code> τη θέτει στην τιμή <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite.settings</span></code>, όπου το <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite</span></code> είναι το όνομα του project σας. Με αυτό τον τρόπο, από προεπιλογή, η εντολή <a class=\"reference internal\" href=\"/el/1.10/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">runserver</span></code></a> ανακαλύπτει το προεπιλεγμένο αρχείο ρυθμίσεων.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Εφόσον τις environment variables τις βλέπει όλο το σύστημα καθολικώς, αυτή η μέθοδος δεν θα δουλέψει αν έχετε πολλά Django sites μέσα στο ίδιο process. Αυτό συμβαίνει με το mod_wsgi (ένας WSGI server από αρκετούς που είναι διαθέσιμοι).</p>\n<p>Για να αποφύγετε τέτοιου είδους προβλήματα, χρησιμοποιήστε το mod_wsgi σε daemon mode με κάθε site σε δικό του daemon process ή παρακάμψτε (override) την τιμή από το environment θέτοντας μια διαφορετική, ως <code class=\"docutils literal notranslate\"><span class=\"pre\">os.environ[&quot;DJANGO_SETTINGS_MODULE&quot;]</span> <span class=\"pre\">=</span> <span class=\"pre\">&quot;mysite.settings&quot;</span></code> μέσα στο αρχείο <code class=\"file docutils literal notranslate\"><span class=\"pre\">wsgi.py</span></code>.</p>\n</aside>\n</section>\n<section id=\"applying-wsgi-middleware\">\n<h2>Εφαρμόζοντας ένα WSGI middleware<a class=\"heading-anchor\" href=\"#applying-wsgi-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Για να εφαρμόσετε ένα <a class=\"reference external\" href=\"https://www.python.org/dev/peps/pep-3333/#middleware-components-that-play-both-sides\">WSGI middleware</a> μπορείτε, απλώς, να κάνετε wrap το application object. Για παράδειγμα, θα μπορούσατε να προσθέσετε αυτές τις γραμμές στο τέλος του αρχείου <code class=\"file docutils literal notranslate\"><span class=\"pre\">wsgi.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">helloworld.wsgi</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HelloWorldApplication</span>\n<span class=\"n\">application</span> <span class=\"o\">=</span> <span class=\"n\">HelloWorldApplication</span><span class=\"p\">(</span><span class=\"n\">application</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Μπορείτε επίσης να αντικαταστήσετε το Django WSGI application με ένα δικό σας WSGI application που το τελευταίο θα ανατεθεί στο Django WSGI application, αν θέλετε να συνδυάσετε μια Django εφαρμογή με μια WSGI εφαρμογή από ένα άλλο framework.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Σημείωση</p>\n<p>Μερικά τρίτα WSGI middleware δεν καλούν τη μέθοδο <code class=\"docutils literal notranslate\"><span class=\"pre\">close</span></code> στο response object αφού έχουν τελειώσει με το request. Σε αυτές τις περιπτώσεις το σήμα <a class=\"reference internal\" href=\"/el/1.10/ref/signals/#django.core.signals.request_finished\" title=\"django.core.signals.request_finished\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">request_finished</span></code></a> δεν στέλνεται. Αυτό μπορεί να προκαλέσει αδρανείς συνδέσεις (idle connections) στη βάση δεδομένων και στους memcache servers.</p>\n</aside>\n</section>","rootId":"how-to-deploy-with-wsgi","toc":[{"title":"Το application object","anchor":"the-application-object","children":[]},{"title":"Παραμετροποιώντας το module των ρυθμίσεων","anchor":"configuring-the-settings-module","children":[]},{"title":"Εφαρμόζοντας ένα WSGI middleware","anchor":"applying-wsgi-middleware","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"Οδηγοί «Πως-να»","url":"/el/1.10/howto/"},{"docname":"howto/deployment/index","title":"Ανεβάζοντας το Django site σας για το ευρύ κοινό (deploying)","url":"/el/1.10/howto/deployment/"}],"prev":{"docname":"howto/deployment/index","title":"Ανεβάζοντας το Django site σας για το ευρύ κοινό (deploying)","url":"/el/1.10/howto/deployment/"},"next":{"docname":"howto/deployment/wsgi/modwsgi","title":"Πως να χρησιμοποιήσετε το Django με τον Apache και το mod_wsgi","url":"/el/1.10/howto/deployment/wsgi/modwsgi/"},"formats":{"html":"/el/1.10/howto/deployment/wsgi/","markdown":"/el/1.10/howto/deployment/wsgi.md","json":"/el/1.10/howto/deployment/wsgi.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/howto/deployment/wsgi/index.txt","official":"https://docs.djangoproject.com/el/1.10/howto/deployment/wsgi/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","fr","ja","id","pt-br","es","el","pl"]}