# Τεκμηρίωση του Django - 1.10.7

# Διαχειρίζοντας τα static files (πχ εικόνες, JavaScript, CSS)

Οι ιστοσελίδες, γενικά, χρειάζονται να εξυπηρετούν και επιπρόσθετα αρχεία πέρα από την ίδια την HTML, όπως εικόνες, JavaScript, CSS, γραμματοσειρές κλπ. Στο Django, αναφερόμαστε σε αυτού του είδους τα αρχεία ως “στατικά αρχεία” (static files). Το Django παρέχει το module `django.contrib.staticfiles` για να σας βοηθήσει να τα διαχειρίζεστε.

Η σελίδα αυτή περιγράφει πως μπορείτε να εξυπηρετήσετε τέτοιου είδους αρχεία, static files.

## Ρυθμίζοντας τα static files

1. Βεβαιωθείτε ότι η εφαρμογή `django.contrib.staticfiles` συμπεριλαμβάνεται στη ρύθμιση `INSTALLED_APPS`.

2. Στο γενικό αρχείο ρυθμίσεων σας, settings file, δώστε μια τιμή, string, στη μεταβλητή :STATIC_URL. Για παράδειγμα:

       STATIC_URL = '/static/'

3. Στα templates σας, είτε εισάγετε με το χέρι το url για μια εικόνα, πχ κάπως έτσι `/static/my_app/myexample.jpg` ή, προτιμότερο, χρησιμοποιήστε το template tag `static` για να χτίσετε το URL ενός δοσμένου relative path χρησιμοποιώντας την, ήδη παραμετροποιημένη ρύθμιση `STATICFILES_STORAGE` (η χρήση του `static` κάνει ακόμα πιο εύκολη, μελλοντικά, την μετάβαση σε ένα content delivery network (CDN) για την εξυπηρέτηση των static files).

       {% load static %}
       <img src="{% static "my_app/example.jpg" %}" alt="My image"/>

4. Αποθηκεύστε τα 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 = [
        os.path.join(BASE_DIR, "static"),
        '/var/www/static/',
    ]

Δείτε το εγχειρίδιο για τη ρύθμιση `STATICFILES_FINDERS` για περισσότερες πληροφορίες σχετικά με το πως η εφαρμογή `staticfiles` βρίσκει τα αρχεία σας.

Static file namespacing

Τώρα, ίσως θα μπορούσαμε να βάλουμε τα static files απ’ ευθείας στο φάκελο `my_app/static/` (παρά να δημιουργήσουμε άλλον έναν υποφάκελο `my_app`), αλλά δεν θα ήταν καλή ιδέα. Το Django θα επιλέξει το πρώτο static file που θα βρει το οποίο θα ταιριάξει στο όνομα που ψάχνει. Αν έχετε, λοιπόν, ένα static file με το ίδιο όνομα σε μια άλλη εφαρμογή, τότε το Django δεν θα μπορέσει να διαχωρίσει ποια από τα δύο να χρησιμοποιήσει. Χρειαζόμαστε ένα τρόπο να καθοδηγήσουμε το Django στο σωστό αρχείο. Ο ευκολότερος τρόπος να το κάνουμε είναι να εφαρμόσουμε την τεχνική του namespacing στα static files. Δηλαδή, να τοποθετούμε αυτά τα static files μέσα σε άλλον έναν φάκελο με το ίδιο όνομα με αυτό της εφαρμογής.

## Εξυπηρετώντας τα static files κατά τη διάρκεια του development

Αν χρησιμοποιείτε την εφαρμογή `django.contrib.staticfiles` όπως περιγράφηκε παραπάνω, ο `runserver` θα εξυπηρετήσει τα static files αυτόματα αν το `DEBUG` είναι `True`. Αν δεν έχετε την εφαρμογή `django.contrib.staticfiles` μέσα στη ρύθμιση `INSTALLED_APPS`, μπορείτε ακόμη να τα εξυπηρετήσετε, χειροκίνητα, χρησιμοποιώντας το view `django.contrib.staticfiles.views.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.

Για παράδειγμα, αν το `MEDIA_URL` έχει οριστεί ως `/media/`, μπορείτε να κάνετε χρήση της `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.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 σε ένα μόνο φάκελο ούτως ώστε να τα εξυπηρετήσετε εύκολα.

1. Θέστε τη ρύθμιση `STATIC_ROOT` στον φάκελο από τον οποίο θα θέλετε να εξυπηρετήσετε αυτά τα αρχεία. Για παράδειγμα:

       STATIC_ROOT = "/var/www/example.com/static/"

2. Τρέξτε την εντολή `collectstatic`:

       $ python manage.py collectstatic

   Η εντολή αυτή θα αντιγράψει όλα τα αρχεία από τους επιμέρους φακέλους με το όνομα `static` (αν υπάρχουν) κάθε εφαρμογής και όλα τα αρχεία στους φακέλους που περιέχονται στη ρύθμιση `STATICFILES_DIRS` στον έναν και μοναδικό φάκελο `STATIC_ROOT`.

3. Χρησιμοποιήστε έναν Web server της επιλογής σας για να εξυπηρετήσετε αυτά τα αρχεία. Το άρθρο Ανεβάζοντας τα static files καλύπτει μερικές κοινές deployment στρατηγικές για τα static files.

## Μάθετε περισσότερα

Αυτό το άρθρο κάλυψε τα βασικά και μερικές συνηθισμένες πρακτικές. Για πλήρεις λεπτομέρειες πάνω σε όλες τις ρυθμίσεις, εντολές, template tags και άλλα κομμάτια που περιέχονται στο `django.contrib.staticfiles`, δείτε στο άρθρο αναφορά στα staticfiles.