Οδηγός για προχωρημένους: Πως να γράψετε επαναχρησιμοποιήσιμα appsLink to this heading
Αυτός ο οδηγός για προχωρημένους ξεκινά μετά το τέλος του Οδηγού 7. Θα μετατρέψουμε την εφαρμογή ψηφοφορίας μας (Web-poll) σε ένα ξεχωριστό-ανεξάρτητο Python package το οποίο μπορείτε να επαναχρησιμοποιήσετε σε άλλα projects και να τα μοιραστείτε με άλλους προγραμματιστές.
Αν δεν έχετε ολοκληρώσει πρόσφατα τον Οδηγό του Django (μέρη 1 εως 7), σας ενθαρρύνουμε να ρίξετε μια ματιά (ή ακόμη και να τον ακολουθήσετε πλήρως) ούτως ώστε το project σας να συμβαδίζει με αυτό που θα ακολουθήσει.
Η επαναχρησιμοποίηση έχει σημασίαLink to this heading
Απαιτεί πολύ δουλειά για να σχεδιάσετε, χτίσετε, τεστάρετε και διατηρήσετε μια web εφαρμογή (application). Πολλά Python και Django projects μοιράζονται κοινά προβλήματα. Δεν θα ήταν εξαιρετικά αν μπορούσαμε να γλυτώσουμε κάποιο μέρος από αυτή τη ρουτίνα;
Reusability is the way of life in Python. The Python Package Index (PyPI) has a vast range of packages you can use in your own Python programs. Check out Django Packages for existing reusable apps you could incorporate in your project. Django itself is also a normal Python package. This means that you can take existing Python packages or Django apps and compose them into your own web project. You only need to write the parts that make your project unique.
Let’s say you were starting a new project that needed a polls app like the one
we’ve been working on. How do you make this app reusable? Luckily, you’re well
on the way already. In Tutorial 1, we saw how we
could decouple polls from the project-level URLconf using an include.
In this tutorial, we’ll take further steps to make the app easy to use in new
projects and ready to publish for others to install and use.
Το project σας και η επαναχρησιμοποιήσιμη appLink to this heading
Κατόπιν ολοκλήρωσης των προηγούμενων οδηγών, η δομή του project μας θα πρέπει να έχει αυτή τη μορφή:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
0001_initial.py
models.py
static/
polls/
images/
background.gif
style.css
templates/
polls/
detail.html
index.html
results.html
tests.py
urls.py
views.py
templates/
admin/
base_site.html
Δημιουργήσατε τον φάκελο mysite/templates στον Οδηγό 7 και τον φάκελο polls/templates στον Οδηγό 3. Τώρα ίσως φαίνεται πιο καθαρά ο λόγος που διαλέξαμε να έχουμε ξεχωριστούς template φακέλους για το project και για το application: οτιδήποτε είναι μέρος της εφαρμογής polls βρίσκεται μέσα στο polls. Αυτό κάνει την εφαρμογή ανεξάρτητη και ευκολότερη να ενσωματωθεί μέσα σε ένα καινούργιο project.
Ο φάκελο polls μπορεί εύκολα να αντιγραφεί σε ένα καινούργιο Django project και αμέσως να επαναχρησιμοποιηθεί. Δεν είναι, όμως, ακόμη έτοιμο να διανεμηθεί (εκδοθεί). Γι’ αυτό θα πρέπει να μετατρέψουμε την εφαρμογή μας σε ένα package για να διευκολύνουμε τους άλλους που θα την εγκαταστήσουν.
Εγκαθιστώντας μερικά προαπαιτούμεναLink to this heading
Η παρούσα κατάσταση του Python packaging είναι λιγάκι συγκεχυμένη με διάφορα εργαλεία. Για αυτό τον οδηγό, θα χρησιμοποιήσουμε το εργαλείο setuptools για να χτίσουμε το package (πακέτο) μας. Είναι το προτεινόμενο εργαλείο για packaging (το οποίο έχει γίνει merged με το fork του distribute). Θα χρησιμοποιήσουμε, επίσης, το pip για να το εγκαταστήσουμε και να το απεγκαταστήσουμε. Θα χρειαστεί να εγκαταστήσετε τα δύο αυτά πακέτα τώρα. Αν χρειάζεστε βοήθεια, μπορείτε να ανατρέξετε στο πως να εγκαταστήσω το Django με το pip. Μπορείτε να εγκαταστήσετε το πακέτο setuptools με τον ίδιο τρόπο.
Πακετάροντας το app σαςLink to this heading
Το Python packaging αναφέρεται στην προετοιμασία του app σε μια συγκεκριμένη μορφή ούτως ώστε να μπορεί να εγκατασταθεί και να χρησιμοποιηθεί εύκολα. Το Django από μόνο του έχει πακεταριστεί με παρόμοιο τρόπο. Για μικρά apps όπως το polls, αυτή η διαδικασία δεν είναι δύσκολη.
Αρχικά, δημιουργήστε ένα φάκελο για την εφαρμογή
polls, έξω από το Django project σας. Δώστε του όνομαdjango-polls.Μετακινήστε τον φάκελο
pollsμέσα στον φάκελοdjango-polls.Δημιουργήστε ένα αρχείο
django-polls/README.rstμε το ακόλουθο περιεχόμενο:django-polls/README.rst ===== Polls ===== Polls is a Django app to conduct Web-based polls. For each question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. Quick start ----------- 1. Add "polls" to your INSTALLED_APPS setting like this:: INSTALLED_APPS = [ ... 'polls', ] 2. Include the polls URLconf in your project urls.py like this:: path('polls/', include('polls.urls')), 3. Run ``python manage.py migrate`` to create the polls models. 4. Start the development server and visit http://127.0.0.1:8000/admin/ to create a poll (you'll need the Admin app enabled). 5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.Δημιουργήστε ένα αρχείο
django-polls/LICENSE. Η επιλογή μιας άδειας (license) είναι πέρα από τους σκοπούς αυτού του οδηγού, αλλά αρκεί να πούμε ότι κώδικας που έχει δημοσιευτεί χωρίς άδεια είναι άχρηστος. Το Django και πολλά άλλα συμβατα με το Django apps είναι διανεμημένα κάτω από την BSD άδεια. Ωστόσο, είστε ελεύθεροι να διαλέξετε μια της αρέσκειας σας. Κρατήστε στο μυαλό σας, όμως, ότι η επιλογή της αδείας επηρεάζει το ποιος θα μπορεί να χρησιμοποιήσει τον κώδικα σας.Next we’ll create
setup.cfgandsetup.pyfiles which detail how to build and install the app. A full explanation of these files is beyond the scope of this tutorial, but the setuptools documentation has a good explanation. Create the filesdjango-polls/setup.cfganddjango-polls/setup.pywith the following contents:django-polls/setup.cfg [metadata] name = django-polls version = 0.1 description = A Django app to conduct Web-based polls. long_description = file: README.rst url = https://www.example.com/ author = Your Name author_email = yourname@example.com license = BSD-3-Clause # Example license classifiers = Environment :: Web Environment Framework :: Django Framework :: Django :: X.Y # Replace "X.Y" as appropriate Intended Audience :: Developers License :: OSI Approved :: BSD License Operating System :: OS Independent Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Topic :: Internet :: WWW/HTTP Topic :: Internet :: WWW/HTTP :: Dynamic Content [options] include_package_data = true packages = find:django-polls/setup.py from setuptools import setup setup()Μόνο τα Python modules και τα packages περιλαμβάνονται στο package από προεπιλογή. Για να συμπεριλάβετε και πρόσθετα αρχεία, θα χρειαστεί να δημιουργήσουμε ένα αρχείο
MANIFEST.in. Το εγχειρίδιο του πακέτου setuptools αναφέρεται σε αυτό το αρχείο με λεπτομέρεια. Για να συμπεριλάβετε τα templates, τοREADME.rstκαι το αρχείοLICENSE, δημιουργήστε ένα αρχείοdjango-polls/MANIFEST.inμε το ακόλουθο περιεχόμενο:django-polls/MANIFEST.in include LICENSE include README.rst recursive-include polls/static * recursive-include polls/templates *Προτείνεται, παρόλο που είναι προαιρετικό, να συμπεριλάβετε ένα λεπτομερές εγχειρίδιο (documentation) με την εφαρμογή σας. Δημιουργήστε ένα κενό φάκελο
django-polls/docsγια μελλοντική προσθήκη του εγχειριδίου. Προσθέστε την ακόλουθη πρόσθετη γραμμή στο αρχείοdjango-polls/MANIFEST.in:recursive-include docs *Σημειώστε ότι ο φάκελος
docsδεν θα συμπεριληφθεί στο package σας εκτός και αν προσθέσετε μερικά αρχεία μέσα. Σε περίπτωση που δεν το γνωρίζατε, πολλά Django apps παρέχουν το δικό τους documentation και online μέσα από ιστοσελίδες όπως η readthedocs.org.Προσπαθήστε να χτίσετε το πακέτο σας (build package) με την εντολή
python setup.py sdist(τρέξτε την μέσα από τον φάκελοdjango-polls). Αυτή η εντολή δημιουργεί έναν φάκελο με το όνομαdistκαι χτίζει το νέο σας πακέτο με το όνομαdjango-polls-0.1.tar.gz.
For more information on packaging, see Python’s Tutorial on Packaging and Distributing Projects.
Χρησιμοποιώντας το δικό σας packageLink to this heading
Από τη στιγμή που μετακινήσαμε τον φάκελο polls έξω από το project, η εφαρμογή μας δεν δουλεύει πλέον, κάτι το οποίο είναι λογικό. Σε αυτή την παράγραφο θα εγκαταστήσουμε την εφαρμογή μας,``django-polls``, σαν ένα (τρίτο) πακέτο.
Για να εγκαταστήσετε το πακέτο σας, χρησιμοποιήστε το pip (το έχετε :ref:` ήδη εγκατεστημένο <installing-reusable-apps-prerequisites>`, σωστά?):
python -m pip install --user django-polls/dist/django-polls-0.1.tar.gzΜε λίγη τύχη, το Django project σας θα λειτουργεί και πάλι όπως πριν. Τρέξτε τον server, ξανά, για να το επιβεβαιώσετε.
Για να απεγκαταστήσετε το πακέτο σας, χρησιμοποιήστε, πάλι το pip:
python -m pip uninstall django-polls
Δημοσιεύοντας το app σαςLink to this heading
Τώρα που έχουμε μετατρέψει σε package και τεστάρει την εφαρμογή django-polls, είναι έτοιμη να διαμοιραστεί στον υπόλοιπο κόσμο! Αν αυτό δεν ήταν κάποιο παράδειγμα, θα μπορούσατε να:
Στείλετε με email το package σε κάποιον φίλο.
Να ανεβάσετε το package στην ιστοσελίδα σας.
Post the package on a public repository, such as the Python Package Index (PyPI). packaging.python.org has a good tutorial for doing this.
Installing Python packages with a virtual environmentLink to this heading
Νωρίτερα, εγκαταστήσαμε την εφαρμογή ψηφοφορίας ως μια βιβλιοθήκη χρήστη (user library). Αυτό κρύβει μερικά μειονεκτήματα:
Η αλλαγή των βιβλιοθηκών χρηστών μπορεί να επηρεάσει άλλο Python software μέσα στο σύστημα σας.
Δεν θα είστε σε θέση να τρέξετε πολλαπλές εκδόσεις το ίδιου πακέτου (ή άλλων με το ίδιο όνομα).
Typically, these situations only arise once you’re maintaining several Django projects. When they do, the best solution is to use venv. This tool allows you to maintain multiple isolated Python environments, each with its own copy of the libraries and package namespace.