Ανεβάζοντας τα static files¶
Δείτε επίσης
Για μια εισαγωγή στη χρήση του module django.contrib.staticfiles
, δείτε στο άρθρο Διαχειρίζοντας τα static files (πχ εικόνες, JavaScript, CSS).
Εξυπηρετώντας τα static files στην παραγωγή¶
Τα βασικά βήματα για να εξυπηρετήσετε τα static files σας από κάποιον server και όχι, φυσικά, τοπικά από τον υπολογιστή σας (όπως γίνεται αυτόματα με το runserver
) είναι απλά: τρέξτε την διαχειριστική εντολή collectstatic
όταν αλλάζουν τα static files και μετά δείτε πως μπορείτε να μεταφέρετε τα static files που έχουν συλλεχθεί στον προκαθορισμένο, από εσάς, φάκελο (STATIC_ROOT
) στον server που θα χειρίζεται τα static files και θα τα εξυπηρετεί. Αναλόγως τη ρύθμιση STATICFILES_STORAGE
, τα αρχεία ίσως χρειαστεί να μετακινηθούν χειροκίνητα στη νέα τοποθεσία ή αυτό μπορεί να το τακτοποιήσει η μέθοδος post_process
της κλάσης Storage
.
Φυσικά, όπως με όλες τις διαδικασίες μετάβασης από το development στο production περιβάλλον, ο διάβολος κρύβεται στις λεπτομέρειες. Κάθε εγκατάσταση-ρύθμιση ενός production περιβάλλοντος είναι διαφορετική, που σημαίνει ότι θα πρέπει να προσαρμόσετε τα ανωτέρω βασικά βήματα για να ταιριάζουν με τις ανάγκες σας. Παρακάτω φαίνονται μερικά συνηθισμένα παραδείγματα που μπορεί να βοηθήσουν.
Εξυπηρετώντας το site και τα static files σας από τον ίδιο server¶
Αν θέλετε να εξυπηρετήσετε τα static files σας από τον ίδιο server ο οποίος εξυπηρετεί ήδη το site σας, η διαδικασία θα μοιάζει κάπως έτσι:
- Ανεβάστε τον κώδικα σας στον deployment server.
- Στον server, τρέξτε την εντολή
collectstatic
για να αντιγραφτούν όλα τα static files μέσα στο φάκελοSTATIC_ROOT
. - Παραμετροποιήστε τον Web server σας για να εξυπηρετεί τα αρχεία του φακέλου
STATIC_ROOT
στο URLSTATIC_URL
. Για παράδειγμα, δείτε πως μπορείτε να το κάνετε αυτό με τον Apache και το mod_wsgi.
Το πιο πιθανό είναι, ίσως, να αυτοματοποιήσετε την παραπάνω διαδικασία, ειδικά όταν έχετε πολλούς Web servers. Υπάρχουν πολλοί τρόποι να πραγματοποιήσετε αυτόν τον αυτοματισμό, αλλά μια επιλογή που απολαμβάνουν πολλοί Django developers είναι το Fabric.
Παρακάτω και στις επόμενες ενότητες, θα σας δείξουμε μερικά παραδείγματα των fabfiles αρχείων (δηλαδή, Fabric scripts) τα οποία αυτοματοποιούν την παραπάνω διαδικασία του deployment των static files (και όχι μόνο). Η σύνταξη ενός fabfile είναι αρκετά επεξηγηματική αλλά δεν θα καλυφθεί εδώ. Συμβουλευτείτε το Fabric’s documentation, για μια πλήρη εξήγηση της σύνταξης fabfile αρχείων.
Οπότε, ένα fabfile για να ανεβάσει τα static files σε μερικούς Web servers, θα μοιάζει κάπως έτσι:
from fabric.api import *
# Hosts to deploy onto
env.hosts = ['www1.example.com', 'www2.example.com']
# Where your project code lives on the server
env.project_root = '/home/www/myproject'
def deploy_static():
with cd(env.project_root):
run('./manage.py collectstatic -v0 --noinput')
Εξυπηρετώντας τα static files από έναν dedicated server¶
Τα περισσότερα μεγάλα Django sites χρησιμοποιούν ένα ξεχωριστό Web server – πχ κάποιον ο οποίος δεν τρέχει ήδη το Django – για να εξυπηρετήσουν τα static files. Αυτός ο server συνήθως τρέχει έναν διαφορετικού τύπου web server – γρηγορότερος αλλά με λιγότερες λειτουργίες. Μερικές κοινές επιλογές είναι:
Η παραμετροποίηση αυτών των servers είναι εκτός του πεδίου εφαρμογής του παρόντος άρθρου. Συμβουλευτείτε το εγχειρίδιο καθενός από τους παραπάνω servers για λεπτομέρειες και οδηγίες.
Εφόσον ο static file server δεν θα τρέχει το Django, θα χρειαστεί να αλλάξετε τη στρατηγική του deployment για να μοιάζει κάπως έτσι:
- Όταν τα static files αλλάζουν, τρέξτε την εντολή
collectstatic
τοπικά στον υπολογιστή σας. - Ανεβάστε τον τοπικό σας φάκελο
STATIC_ROOT
στον static file server μέσα στο φάκελο όπου εξυπηρετείται. Η εντολή rsync είναι μια κοινή λύση για αυτό το βήμα καθώς δεν αντιγράφει κάθε φορά όλο το φάκελο, παρά μόνο τις αλλαγές που έγιναν.
Δείτε πως φαίνεται η παραπάνω διαδικασία, μέσα σε ένα fabfile:
from fabric.api import *
from fabric.contrib import project
# Where the static files get collected locally. Your STATIC_ROOT setting.
env.local_static_root = '/path/to/static'
# Where the static files should go remotely
env.remote_static_root = '/home/www/static.example.com'
@roles('static')
def deploy_static():
local('./manage.py collectstatic')
project.rsync_project(
remote_dir=env.remote_static_root,
local_dir=env.local_static_root,
delete=True,
)
Εξυπηρετώντας τα static files από μια υπηρεσία cloud ή CDN¶
Μια άλλη συνηθισμένη τακτική είναι να εξυπηρετείτε τα static files από έναν πάροχο αποθήκευσης αρχείων στο cloud, όπως είναι η υπηρεσία S3 της Amazon και/ή σε κάποιο CDN (content delivery network). Αυτό, φυσικά, σας απαλλάσσει από το πρόβλημα της εξυπηρέτησης των static files και συχνά συμβάλλει στη γρηγορότερη φόρτωση των ιστοσελίδων (ειδικότερα αν χρησιμοποιείτε CDN).
Όταν χρησιμοποιείτε αυτές τις υπηρεσίες, η βασική διαδικασία θα μοιάζει λίγο-πολύ με την παραπάνω, εκτός του ότι αντί να χρησιμοποιείτε την εντολή rsync
για να μεταφέρετε τα static files στον server, θα χρειαστεί να μεταφέρετε τα static files στον πάροχο αποθήκευσης αρχείων ή στο CDN.
Υπάρχουν πολλοί τρόποι για το πετύχετε αυτό, αλλά αν ο πάροχος έχει κάποιο API, τότε ένα παραμετροποιήσιμο σύστημα αποθήκευσης θα κάνει την διαδικασία απίστευτα απλή. Αν έχετε γράψει ή χρησιμοποιείτε ένα σύστημα αποθήκευσης τρίτου (third-party custom storage backend), μπορείτε να πείτε στην εντολή collectstatic
να χρησιμοποιήσει αυτό το σύστημα, ρυθμίζοντας ανάλογα την επιλογή STATICFILES_STORAGE
στη μηχανή αποθήκευσης.
Για παράδειγμα, αν έχετε γράψει ένα σύστημα αποθήκευσης S3 στο αρχείο myproject.storage.S3Storage
, μπορείτε να το χρησιμοποιήσετε ως εξής:
STATICFILES_STORAGE = 'myproject.storage.S3Storage'
Όταν γίνει αυτό, το μόνο που έχετε να κάνετε είναι να τρέξετε την εντολή collectstatic
και όλα τα static files σας θα αποθηκευτούν, μέσω του συστήματος αποθήκευσης σας, στο S3. Αν αργότερα αποφασίσετε ότι θέλετε να αλλάξετε πάροχο αποθήκευσης αρχείων, δεν θα μπορούσε να είναι πιο απλό από το να αλλάξετε τη ρύθμιση STATICFILES_STORAGE
αναλόγως.
For details on how you’d write one of these backends, see Γράφοντας ένα δικό σας σύστημα αποθήκευσης (storage system). There are 3rd party apps available that provide storage backends for many common file storage APIs. A good starting point is the overview at djangopackages.org.
Μάθετε περισσότερα¶
Για πλήρεις λεπτομέρειες πάνω σε όλες τις ρυθμίσεις, εντολές, template tags και άλλα κομμάτια που περιέχονται στο django.contrib.staticfiles
, δείτε στο άρθρο αναφορά στα staticfiles.