In this post what I mean by file is any content that is not dynamically generated. There are basically two types of files a web application deals with:
- Files that are hard coded in templates or in code. We will call them
STATIC files.
- Files that are referenced in the code but only known in the run time. We will call them
MEDIA files.
Now of course all these files are static and most of them can be classified as media, but I chose those terms because that more or less how they are referred to in Django documentation.
Since files are stored on disk or some other storage backend it is best to serve them on a fast HTTP server and let Django handle only dynamic content.
How to configure STATIC/MEDIA related settings
Let’s look at some code first and we can comment on it afterwards. I use the following setup in my projects:
import os
_PATH = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(_PATH, 'files', 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(_PATH, 'files', 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(_PATH, 'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
ADMIN_MEDIA_PREFIX = '/static/admin/'
_PATH should be obvious. But the way I use it is a little tricky here. Basically I am using a files directory that contains media, for MEDIA files, and static, for STATIC files, directories. This seperation is essential. You will pull your hair if you don’t seperate those two from the beginning. This will allow you to reuse them easily if you deploy a new version to a different location.
But why is files under the project directory? Because we need to check-in STATIC files? NO! It is just a convenience for the development environments. I strongly suggest overriding MEDIA_ROOT and STATIC_ROOT in your deployment settings and basically move the files directory outside of the project path. STATIC files that we check-in resides in <_PATH>/static. django.contrib.staticfiles app collects your STATIC files from your project specific directories and within your apps and copies everything in the right places inside STATIC_ROOT.
To sum up the points above:
- Check-in
STATIC files in a folder within your project directory (see STATICFILES_DIRS & FileSystemFinder). If you are developing an app AppDirectoriesFinder will collect static files within the static directory in your app directory.
- Seperate the directories, where your
MEDIA files are saved and where your STATIC files are collected (see STATIC_ROOT & MEDIA_ROOT).
- Keep your
STATIC_ROOT and MEDIA_ROOT outside of your project directory in production environment.
One more thing to note is STATIC_URL and MEDIA_URL should both have a trailing slash. This will save you a lot of trouble later.
Next part deals with serving files in development environment and referencing them in code and templates.
If you enjoyed this post please tell me a little bit about yourself.
Related posts:
- Working with files in Django – Part 2
- Working with files in Django – Part 3
- My PyCon APAC 2011 Presentation: Optimizing Media Performance with django_compressor
- I Am Discontinuing Telvee
- Drawing Gradients with PyGame
In this post what I mean by `file` is any content that is not dynamically generated. There are basically two types of files a web application deals with:
* Files that are hard coded in templates or in code. We will call them `STATIC` files.
* Files that are referenced in the code but only known in the run time. We will call them `MEDIA` files.
Now of course all these files are static and most of them can be classified as media, but I chose those terms because that more or less how they are referred to in [Django documentation](https://docs.djangoproject.com/en/1.3/).
Since files are stored on disk or some other [storage backend](https://docs.djangoproject.com/en/1.3/ref/files/storage/) it is best to [serve them on a fast HTTP server](https://docs.djangoproject.com/en/1.3/howto/static-files/#serving-static-files-from-a-dedicated-server) and let Django handle only dynamic content.
## How to configure STATIC/MEDIA related settings
Let's look at some code first and we can comment on it afterwards. I use the following setup in my projects:
import os
_PATH = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(_PATH, 'files', 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(_PATH, 'files', 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(_PATH, 'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
ADMIN_MEDIA_PREFIX = '/static/admin/'
`_PATH` should be obvious. But the way I use it is a little tricky here. Basically I am using a `files` directory that contains `media`, for `MEDIA` files, and `static`, for `STATIC` files, directories. This seperation is essential. You will pull your hair if you don't seperate those two from the beginning. This will allow you to reuse them easily if you deploy a new version to a different location.
But why is `files` under the project directory? Because we need to check-in `STATIC` files? NO! It is just a convenience for the development environments. I strongly suggest overriding `MEDIA_ROOT` and `STATIC_ROOT` in your deployment settings and basically move the `files` directory outside of the project path. `STATIC` files that we check-in resides in `/static`. [`django.contrib.staticfiles`](https://docs.djangoproject.com/en/1.3/ref/contrib/staticfiles/) app collects your `STATIC` files from your project specific directories and within your apps and copies everything in the right places inside `STATIC_ROOT`.
To sum up the points above:
* Check-in `STATIC` files in a folder within your project directory (see `STATICFILES_DIRS` & `FileSystemFinder`). If you are [developing an app](http://www.muhuk.com/2010/01/developing-reusable-django-apps/) `AppDirectoriesFinder` will collect static files within the `static` directory in your app directory.
* Seperate the directories, where your `MEDIA` files are saved and where your `STATIC` files are collected (see `STATIC_ROOT` & `MEDIA_ROOT`).
* Keep your `STATIC_ROOT` and `MEDIA_ROOT` outside of your project directory in production environment.
One more thing to note is `STATIC_URL` and `MEDIA_URL` should both have a trailing slash. This will save you a lot of trouble later.
[Next part](/2011/11/working-with-files-in-django-part-2/) deals with serving files in development environment and referencing them in code and templates.
If you enjoyed this post please [tell me a little bit about yourself](http://www.muhuk.com/about-you/).
Tags: django, media, python
This entry was posted
on Monday, November 21st, 2011 at 18:47 and is filed under Programming.
You can follow any responses to this entry through the RSS 2.0 feed.
Both comments and pings are currently closed.