Διαχειρίζοντας τα static files (πχ εικόνες, JavaScript, CSS)¶
Οι ιστοσελίδες, γενικά, χρειάζονται να εξυπηρετούν και επιπρόσθετα αρχεία πέρα από την ίδια την HTML, όπως εικόνες, JavaScript, CSS, γραμματοσειρές κλπ. Στο Django, αναφερόμαστε σε αυτού του είδους τα αρχεία ως «στατικά αρχεία» (static files). Το Django παρέχει το module django.contrib.staticfiles
για να σας βοηθήσει να τα διαχειρίζεστε.
Η σελίδα αυτή περιγράφει πως μπορείτε να εξυπηρετήσετε τέτοιου είδους αρχεία, static files.
Ρυθμίζοντας τα static files¶
Βεβαιωθείτε ότι η εφαρμογή
django.contrib.staticfiles
συμπεριλαμβάνεται στη ρύθμισηINSTALLED_APPS
.Στο γενικό αρχείο ρυθμίσεων σας, settings file, δώστε μια τιμή, string, στη μεταβλητή :STATIC_URL. Για παράδειγμα:
STATIC_URL = '/static/'
In your templates, use the
static
template tag to build the URL for the given relative path using the configuredSTATICFILES_STORAGE
.{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
Αποθηκεύστε τα static files σας σε έναν φάκελο που ονομάζεται
static
μέσα στην εκάστοτε εφαρμογή σας. Για παράδειγμαmy_app/static/my_app/myimage.jpg
.
Εξυπηρετώντας τα αχεία
Πέρα από τις ανωτέρω ρυθμίσεις, θα χρειαστεί, επίσης, να εξυπηρετήσετε αυτά τα static files.
Κατά τη διάρκεια του development, αν χρησιμοποιείτε την εφαρμογή django.contrib.staticfiles
, η εξυπηρέτηση των static files θα γίνει αυτόματα από το runserver
όταν, φυσικά, το DEBUG
είναι True
(δείτε τη συνάρτηση django.contrib.staticfiles.views.serve()
).
Αυτή η μέθοδος είναι εντελώς αναποτελεσματική και πιθανόν μη ασφαλής, κάτι που την καθιστά ακατάλληλη για την παραγωγή.
Δείτε στο άρθρο Ανεβάζοντας τα static files για τις σωστές στρατηγικές εξυπηρέτησης των static files σε παραγωγικά περιβάλλοντα.
Το project σας θα έχει, πιθανόν και κάποια static files τα οποία δεν θα συνδέονται με κάποια συγκεκριμένη εφαρμογή. Αν θέλετε να εξυπηρετήσετε στατικά αρχεία τα οποία θα είναι καθολικά για όλο το project σας, εκτός της δημιουργίας του φακέλου static/
μέσα σε κάθε εφαρμογή σας, μπορείτε να ορίσετε μια λίστα από φακέλους (STATICFILES_DIRS
) μέσα στο γενικό αρχείο ρυθμίσεων σας, settings file, όπου το Django θα κοιτάξει, επίσης, για επιπρόσθετα static files. Για παράδειγμα:
STATICFILES_DIRS = [
BASE_DIR / "static",
'/var/www/static/',
]
Δείτε το εγχειρίδιο για τη ρύθμιση STATICFILES_FINDERS
για περισσότερες πληροφορίες σχετικά με το πως η εφαρμογή staticfiles
βρίσκει τα αρχεία σας.
Static file namespacing
Now we might be able to get away with putting our static files directly
in my_app/static/
(rather than creating another my_app
subdirectory), but it would actually be a bad idea. Django will use the
first static file it finds whose name matches, and if you had a static file
with the same name in a different application, Django would be unable to
distinguish between them. We need to be able to point Django at the right
one, and the best way to ensure this is by namespacing them. That is,
by putting those static files inside another directory named for the
application itself.
You can namespace static assets in STATICFILES_DIRS
by
specifying prefixes.
Εξυπηρετώντας τα static files κατά τη διάρκεια του development¶
Αν χρησιμοποιείτε την εφαρμογή django.contrib.staticfiles
όπως περιγράφηκε παραπάνω, η εντολή runserver
θα εξυπηρετήσει τα static files αυτόματα αν το DEBUG
είναι True
. Αν δεν έχετε την εφαρμογή django.contrib.staticfiles
μέσα στη ρύθμιση INSTALLED_APPS
, μπορείτε ακόμη να τα εξυπηρετήσετε, χειροκίνητα, χρησιμοποιώντας το view django.views.static.serve()
.
Αυτό, φυσικά, δεν είναι κατάλληλο για την παραγωγή (όταν δηλαδή το site σας είναι στον αέρα, διαθέσιμο για το ευρύ κοινό)! Για μερικές κοινές deployment στρατηγικές δείτε στο άρθρο Ανεβάζοντας τα static files.
Για παράδειγμα, αν το STATIC_URL
έχει οριστεί ως /static/
, μπορείτε να κάνετε χρήση της django.contrib.staticfiles.views.serve()
, μέσα στο αρχείο urls.py, ως εξής:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Σημείωση
Αυτή η βοηθητική συνάρτηση δουλεύει μόνο σε debug mode (ήτοι το DEBUG
είναι True
) και μόνο αν το δοσμένο πρόθεμα είναι τοπικό (πχ /static/
) και όχι ένα URL (πχ http://static.example.com/
).
Επίσης, αυτή η βοηθητική συνάρτηση εξυπηρετεί μόνο το φάκελο STATIC_ROOT
. Δεν πραγματοποιεί την πραγματική αναζήτηση των static files, όπως κάνει η εφαρμογή django.contrib.staticfiles
.
Εξυπηρετώντας αρχεία τα οποία ανέβηκαν από έναν χρήστη κατά τη διάρκεια του development¶
Στο Django, τα αρχεία που ανεβαίνουν στον server σας από κάποιον χρήστη (ή από τον admin μέσω του django.contrib.admin
) ονομάζονται media files ή media assets και γι” αυτό το λόγο υπάρχει ένας διαχωρισμός μεταξύ των μεταβλητών στις ρυθμίσεις, πχ MEDIA_ROOT
, MEDIA_URL
, STATIC_ROOT
και STATIC_URL
. Κατά τη διάρκεια του development, μπορείτε να εξυπηρετήσετε τα media files που ανέβηκαν από κάποιον χρήστη μέσω της ρύθμισης MEDIA_ROOT
χρησιμοποιώντας το view django.contrib.staticfiles.views.serve()
.
Αυτό, φυσικά, δεν είναι κατάλληλο για την παραγωγή (όταν δηλαδή το site σας είναι στον αέρα, διαθέσιμο για το ευρύ κοινό)! Για μερικές κοινές deployment στρατηγικές δείτε στο άρθρο Ανεβάζοντας τα static files.
For example, if your MEDIA_URL
is defined as /media/
, you can do
this by adding the following snippet to your ROOT_URLCONF
:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Σημείωση
Αυτή η βοηθητική συνάρτηση δουλεύει μόνο σε debug mode (ήτοι το DEBUG
είναι True
) και μόνο αν το δοσμένο πρόθεμα είναι τοπικό (πχ /media/
) και όχι ένα URL (πχ http://media.example.com/
).
Τεστ¶
Όταν τρέχετε τα τεστ τα οποία χρησιμοποιούν πραγματικά HTTP requests αντί του προεγκατεστημένου testing client (πχ όταν χρησιμοποιείτε την κλάση LiveServerTestCase
), τα static files θα χρειαστεί να εξυπηρετηθούν μαζί με το υπόλοιπο περιεχόμενο, προκειμένου το περιβάλλον του τεστ σας να αναπαράγει το πραγματικό περιβάλλον όσο πιο πιστά γίνεται. Αλλά η κλάση LiveServerTestCase
παρέχει μια πολύ βασική λειτουργία εξυπηρέτησης των static files: Δεν γνωρίζει τίποτα σχετικά με τη λειτουργία των finders της εφαρμογής staticfiles
και προϋποθέτει ότι τα static files έχουν ήδη συγκεντρωθεί μέσα στο φάκελο STATIC_ROOT
.
Εξαιτίας αυτού, η εφαρμογή staticfiles
έρχεται με μια δική της κλάση django.contrib.staticfiles.testing.StaticLiveServerTestCase
, μια subclass της προεγκατεστημένης, η οποία έχει τη δυνατότητα να εξυπηρετεί με έναν παρόμοιο τρόπο με αυτόν που τρέχουμε κατά τη διάρκεια του development όταν το DEBUG = True
, διαφανώς, όλα τα assets κατά τη διάρκεια εκτέλεσης αυτών των τεστ, πχ χωρίς να χρειαστεί να τα συγκεντρώνουμε πρώτα, χρησιμοποιώντας την εντολή collectstatic
.
Deployment¶
Η εφαρμογή django.contrib.staticfiles
παρέχει μια βολική διαχειριστική εντολή για να συγκεντρώσει (collect) όλα τα static files σε ένα μόνο φάκελο ούτως ώστε να τα εξυπηρετήσετε εύκολα.
Θέστε τη ρύθμιση
STATIC_ROOT
στον φάκελο από τον οποίο θα θέλετε να εξυπηρετήσετε αυτά τα αρχεία. Για παράδειγμα:STATIC_ROOT = "/var/www/example.com/static/"
Τρέξτε την εντολή
collectstatic
:$ python manage.py collectstatic
Η εντολή αυτή θα αντιγράψει όλα τα αρχεία από τους επιμέρους φακέλους με το όνομα
static
(αν υπάρχουν) κάθε εφαρμογής και όλα τα αρχεία στους φακέλους που περιέχονται στη ρύθμισηSTATICFILES_DIRS
στον έναν και μοναδικό φάκελοSTATIC_ROOT
.Χρησιμοποιήστε έναν Web server της επιλογής σας για να εξυπηρετήσετε αυτά τα αρχεία. Το άρθρο Ανεβάζοντας τα static files καλύπτει μερικές κοινές deployment στρατηγικές για τα static files.
Μάθετε περισσότερα¶
Αυτό το άρθρο κάλυψε τα βασικά και μερικές συνηθισμένες πρακτικές. Για πλήρεις λεπτομέρειες πάνω σε όλες τις ρυθμίσεις, εντολές, template tags και άλλα κομμάτια που περιέχονται στο django.contrib.staticfiles
, δείτε στο άρθρο αναφορά στα staticfiles.