File: staticfiles.txt

package info (click to toggle)
python-django 1.4.5-1%2Bdeb7u16
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 44,168 kB
  • sloc: python: 140,205; xml: 659; makefile: 160; sh: 145; sql: 7
file content (453 lines) | stat: -rw-r--r-- 15,062 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
===================
The staticfiles app
===================

.. module:: django.contrib.staticfiles
   :synopsis: An app for handling static files.

.. versionadded:: 1.3

``django.contrib.staticfiles`` collects static files from each of your
applications (and any other places you specify) into a single location that
can easily be served in production.

.. seealso::

    For an introduction to the static files app and some usage examples, see
    :doc:`/howto/static-files`.

.. _staticfiles-settings:

Settings
========

.. highlight:: python

.. note::

    The following settings control the behavior of the staticfiles app.

.. setting:: STATICFILES_DIRS

STATICFILES_DIRS
----------------

Default: ``[]``

This setting defines the additional locations the staticfiles app will traverse
if the :class:`FileSystemFinder` finder is enabled, e.g. if you use the
:djadmin:`collectstatic` or :djadmin:`findstatic` management command or use the
static file serving view.

This should be set to a list or tuple of strings that contain full paths to
your additional files directory(ies) e.g.::

    STATICFILES_DIRS = (
        "/home/special.polls.com/polls/static",
        "/home/polls.com/polls/static",
        "/opt/webfiles/common",
    )

Prefixes (optional)
"""""""""""""""""""

In case you want to refer to files in one of the locations with an additional
namespace, you can **optionally** provide a prefix as ``(prefix, path)``
tuples, e.g.::

    STATICFILES_DIRS = (
        # ...
        ("downloads", "/opt/webfiles/stats"),
    )

Example:

Assuming you have :setting:`STATIC_URL` set ``'/static/'``, the
:djadmin:`collectstatic` management command would collect the "stats" files
in a ``'downloads'`` subdirectory of :setting:`STATIC_ROOT`.

This would allow you to refer to the local file
``'/opt/webfiles/stats/polls_20101022.tar.gz'`` with
``'/static/downloads/polls_20101022.tar.gz'`` in your templates, e.g.:

.. code-block:: html+django

    <a href="{{ STATIC_URL }}downloads/polls_20101022.tar.gz">

.. setting:: STATICFILES_STORAGE

STATICFILES_STORAGE
-------------------

Default: ``'django.contrib.staticfiles.storage.StaticFilesStorage'``

The file storage engine to use when collecting static files with the
:djadmin:`collectstatic` management command.

.. versionadded:: 1.4

A ready-to-use instance of the storage backend defined in this setting
can be found at ``django.contrib.staticfiles.storage.staticfiles_storage``.

For an example, see :ref:`staticfiles-from-cdn`.

.. setting:: STATICFILES_FINDERS

STATICFILES_FINDERS
-------------------

Default::

    ("django.contrib.staticfiles.finders.FileSystemFinder",
     "django.contrib.staticfiles.finders.AppDirectoriesFinder")

The list of finder backends that know how to find static files in
various locations.

The default will find files stored in the :setting:`STATICFILES_DIRS` setting
(using :class:`django.contrib.staticfiles.finders.FileSystemFinder`) and in a
``static`` subdirectory of each app (using
:class:`django.contrib.staticfiles.finders.AppDirectoriesFinder`)

One finder is disabled by default:
:class:`django.contrib.staticfiles.finders.DefaultStorageFinder`. If added to
your :setting:`STATICFILES_FINDERS` setting, it will look for static files in
the default file storage as defined by the :setting:`DEFAULT_FILE_STORAGE`
setting.

.. note::

    When using the :class:`AppDirectoriesFinder` finder, make sure your apps
    can be found by staticfiles. Simply add the app to the
    :setting:`INSTALLED_APPS` setting of your site.

Static file finders are currently considered a private interface, and this
interface is thus undocumented.

Management Commands
===================

.. highlight:: console

``django.contrib.staticfiles`` exposes three management commands.

collectstatic
-------------

.. django-admin:: collectstatic

Collects the static files into :setting:`STATIC_ROOT`.

Duplicate file names are by default resolved in a similar way to how template
resolution works: the file that is first found in one of the specified
locations will be used. If you're confused, the :djadmin:`findstatic` command
can help show you which files are found.

Files are searched by using the :setting:`enabled finders
<STATICFILES_FINDERS>`. The default is to look in all locations defined in
:setting:`STATICFILES_DIRS` and in the ``'static'`` directory of apps
specified by the :setting:`INSTALLED_APPS` setting.

.. versionadded:: 1.4

The :djadmin:`collectstatic` management command calls the
:meth:`~django.contrib.staticfiles.storage.StaticFilesStorage.post_process`
method of the :setting:`STATICFILES_STORAGE` after each run and passes
a list of paths that have been found by the management command. It also
receives all command line options of :djadmin:`collectstatic`. This is used
by the :class:`~django.contrib.staticfiles.storage.CachedStaticFilesStorage`
by default.

Some commonly used options are:

.. django-admin-option:: --noinput

    Do NOT prompt the user for input of any kind.

.. django-admin-option:: -i <pattern>
.. django-admin-option:: --ignore <pattern>

    Ignore files or directories matching this glob-style pattern. Use multiple
    times to ignore more.

.. django-admin-option:: -n
.. django-admin-option:: --dry-run

    Do everything except modify the filesystem.

.. django-admin-option:: -c
.. django-admin-option:: --clear

    .. versionadded:: 1.4

    Clear the existing files before trying to copy or link the original file.

.. django-admin-option:: -l
.. django-admin-option:: --link

    Create a symbolic link to each file instead of copying.

.. django-admin-option:: --no-post-process

    .. versionadded:: 1.4

    Don't call the
    :meth:`~django.contrib.staticfiles.storage.StaticFilesStorage.post_process`
    method of the configured :setting:`STATICFILES_STORAGE` storage backend.

.. django-admin-option:: --no-default-ignore

    Don't ignore the common private glob-style patterns ``'CVS'``, ``'.*'``
    and ``'*~'``.

For a full list of options, refer to the commands own help by running::

   $ python manage.py collectstatic --help

findstatic
----------

.. django-admin:: findstatic

Searches for one or more relative paths with the enabled finders.

For example::

   $ python manage.py findstatic css/base.css admin/js/core.js
   /home/special.polls.com/core/static/css/base.css
   /home/polls.com/core/static/css/base.css
   /home/polls.com/src/django/contrib/admin/media/js/core.js

By default, all matching locations are found. To only return the first match
for each relative path, use the ``--first`` option::

   $ python manage.py findstatic css/base.css --first
   /home/special.polls.com/core/static/css/base.css

This is a debugging aid; it'll show you exactly which static file will be
collected for a given path.

.. _staticfiles-runserver:

runserver
---------

.. django-admin:: runserver

Overrides the core :djadmin:`runserver` command if the ``staticfiles`` app
is :setting:`installed<INSTALLED_APPS>` and adds automatic serving of static
files and the following new options.

.. django-admin-option:: --nostatic

Use the ``--nostatic`` option to disable serving of static files with the
:doc:`staticfiles </ref/contrib/staticfiles>` app entirely. This option is
only available if the :doc:`staticfiles </ref/contrib/staticfiles>` app is
in your project's :setting:`INSTALLED_APPS` setting.

Example usage::

    django-admin.py runserver --nostatic

.. django-admin-option:: --insecure

Use the ``--insecure`` option to force serving of static files with the
:doc:`staticfiles </ref/contrib/staticfiles>` app even if the :setting:`DEBUG`
setting is ``False``. By using this you acknowledge the fact that it's
**grossly inefficient** and probably **insecure**. This is only intended for
local development, should **never be used in production** and is only
available if the :doc:`staticfiles </ref/contrib/staticfiles>` app is
in your project's :setting:`INSTALLED_APPS` setting.

Example usage::

    django-admin.py runserver --insecure

Storages
========

StaticFilesStorage
------------------

.. class:: storage.StaticFilesStorage

    A subclass of the :class:`~django.core.files.storage.FileSystemStorage`
    storage backend that uses the :setting:`STATIC_ROOT` setting as the base
    file system location and the :setting:`STATIC_URL` setting respectively
    as the base URL.

    .. method:: post_process(paths, **options)

    .. versionadded:: 1.4

    This method is called by the :djadmin:`collectstatic` management command
    after each run and gets passed the local storages and paths of found
    files as a dictionary, as well as the command line options.

    The :class:`~django.contrib.staticfiles.storage.CachedStaticFilesStorage`
    uses this behind the scenes to replace the paths with their hashed
    counterparts and update the cache appropriately.

CachedStaticFilesStorage
------------------------

.. class:: storage.CachedStaticFilesStorage

    .. versionadded:: 1.4

    A subclass of the :class:`~django.contrib.staticfiles.storage.StaticFilesStorage`
    storage backend which caches the files it saves by appending the MD5 hash
    of the file's content to the filename. For example, the file
    ``css/styles.css`` would also be saved as ``css/styles.55e7cbb9ba48.css``.

    The purpose of this storage is to keep serving the old files in case some
    pages still refer to those files, e.g. because they are cached by you or
    a 3rd party proxy server. Additionally, it's very helpful if you want to
    apply `far future Expires headers`_ to the deployed files to speed up the
    load time for subsequent page visits.

    The storage backend automatically replaces the paths found in the saved
    files matching other saved files with the path of the cached copy (using
    the :meth:`~django.contrib.staticfiles.storage.StaticFilesStorage.post_process`
    method). The regular expressions used to find those paths
    (``django.contrib.staticfiles.storage.CachedStaticFilesStorage.cached_patterns``)
    by default cover the `@import`_ rule and `url()`_ statement of `Cascading
    Style Sheets`_. For example, the ``'css/styles.css'`` file with the
    content

    .. code-block:: css+django

        @import url("../admin/css/base.css");

    would be replaced by calling the
    :meth:`~django.core.files.storage.Storage.url`
    method of the ``CachedStaticFilesStorage`` storage backend, ultimatively
    saving a ``'css/styles.55e7cbb9ba48.css'`` file with the following
    content:

    .. code-block:: css+django

        @import url("../admin/css/base.27e20196a850.css");

    To enable the ``CachedStaticFilesStorage`` you have to make sure the
    following requirements are met:

    * the :setting:`STATICFILES_STORAGE` setting is set to
      ``'django.contrib.staticfiles.storage.CachedStaticFilesStorage'``
    * the :setting:`DEBUG` setting is set to ``False``
    * you use the ``staticfiles`` :ttag:`static<staticfiles-static>` template
      tag to refer to your static files in your templates
    * you've collected all your static files by using the
      :djadmin:`collectstatic` management command

    Since creating the MD5 hash can be a performance burden to your website
    during runtime, ``staticfiles`` will automatically try to cache the
    hashed name for each file path using Django's :doc:`caching
    framework</topics/cache>`. If you want to override certain options of the
    cache backend the storage uses, simply specify a custom entry in the
    :setting:`CACHES` setting named ``'staticfiles'``. It falls back to using
    the ``'default'`` cache backend.

.. _`far future Expires headers`: http://developer.yahoo.com/performance/rules.html#expires
.. _`@import`: http://www.w3.org/TR/CSS2/cascade.html#at-import
.. _`url()`: http://www.w3.org/TR/CSS2/syndata.html#uri
.. _`Cascading Style Sheets`: http://www.w3.org/Style/CSS/

.. currentmodule:: django.contrib.staticfiles.templatetags.staticfiles

Template tags
=============

static
------

.. templatetag:: staticfiles-static

.. versionadded:: 1.4

Uses the configured :setting:`STATICFILES_STORAGE` storage to create the
full URL for the given relative path, e.g.:

.. code-block:: html+django

    {% load static from staticfiles %}
    <img src="{% static "css/base.css" %}" />

The previous example is equal to calling the ``url`` method of an instance of
:setting:`STATICFILES_STORAGE` with ``"css/base.css"``. This is especially
useful when using a non-local storage backend to deploy files as documented
in :ref:`staticfiles-from-cdn`.

Other Helpers
=============

There are a few other helpers outside of the
:mod:`staticfiles <django.contrib.staticfiles>` app to work with static
files:

- The :func:`django.core.context_processors.static` context processor
  which adds :setting:`STATIC_URL` to every template context rendered
  with :class:`~django.template.RequestContext` contexts.

- The builtin template tag :ttag:`static` which takes a path and
  urljoins it with the static prefix :setting:`STATIC_URL`.

- The builtin template tag :ttag:`get_static_prefix` which populates a
  template variable with the static prefix :setting:`STATIC_URL` to be
  used as a variable or directly.

- The similar template tag :ttag:`get_media_prefix` which works like
  :ttag:`get_static_prefix` but uses :setting:`MEDIA_URL`.

.. _staticfiles-development-view:

Static file development view
----------------------------

.. highlight:: python

.. function:: django.contrib.staticfiles.views.serve(request, path)

This view function serves static files in development.

.. warning::

    This view will only work if :setting:`DEBUG` is ``True``.

    That's because this view is **grossly inefficient** and probably
    **insecure**. This is only intended for local development, and should
    **never be used in production**.

This view is automatically enabled by :djadmin:`runserver` (with a
:setting:`DEBUG` setting set to ``True``). To use the view with a different
local development server, add the following snippet to the end of your
primary URL configuration::

   from django.conf import settings

   if settings.DEBUG:
       urlpatterns += patterns('django.contrib.staticfiles.views',
           url(r'^static/(?P<path>.*)$', 'serve'),
       )

Note, the beginning of the pattern (``r'^static/'``) should be your
:setting:`STATIC_URL` setting.

Since this is a bit finicky, there's also a helper function that'll do this for you:

.. function:: django.contrib.staticfiles.urls.staticfiles_urlpatterns()

This will return the proper URL pattern for serving static files to your
already defined pattern list. Use it like this::

   from django.contrib.staticfiles.urls import staticfiles_urlpatterns

   # ... the rest of your URLconf here ...

   urlpatterns += staticfiles_urlpatterns()

.. warning::

    This helper function will only work if :setting:`DEBUG` is ``True``
    and your :setting:`STATIC_URL` setting is neither empty nor a full
    URL such as ``http://static.example.com/``.