What is the most common way to configure static files in debug and production for Django

前端 未结 2 1408
青春惊慌失措
青春惊慌失措 2021-02-02 04:39

When developing a Django application in debug mode, I serve static files using the following code:

if settings.DEBUG:
    urlpatterns += patterns(\'\',
        (         


        
2条回答
  •  被撕碎了的回忆
    2021-02-02 05:18

    Using Django 1.3 django.contrib.staticfiles will take care of serving everything for you during development. You don't need to do anything particular in the urls.py. I wrote a little guide for myself after the Django 1.3 update that covers the settings to use:

    # idiom to get path of project
    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    # url prefix for user uploaded files, stuff that django has to serve directly
    MEDIA_URL = '/media/'
    # url prefix for static files like css, js, images
    STATIC_URL = '/static/'
    # url prefix for *static* /admin media
    ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
    # path to django-served media
    MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
    # path used for collectstatic, *where the webserver not django will expect to find files*
    STATIC_ROOT = '/home/user/public_html/static'
    # path to directories containing static files for django project, apps, etc, css/js
    STATICFILES_DIRS = (
        os.path.join(PROJECT_PATH, 'static'),
    )
    # List of finder classes that know how to find static files in various locations.
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    ) 
    # Required for all the magic
    INSTALLED_APPS = (
        'django.contrib.staticfiles',
    )
    

    Refer to the docs for details: http://docs.djangoproject.com/en/1.3/howto/static-files/.

    I use nginx and uwsgi for serving django apps in production (I use runserver for development). I symlink my /static and /media folders (from my django project) into /var/www/vhosts/domain.com/html for nginx to find. You could also use the collectstatic command instead of symlinking. If it can't find a static file it falls back to uwsgi (which is running the django app).

    Instead of uwsgi you could use fast-cgi, or proxy_pass or whatever you want. I prefer uwsgi because it has an incredible number of features and great performance. I run uwsgi as a daemon with: uwsgi --emperor '/srv/*/*.ini'. This is a fairly new option, it tells uwsgi to scan a given path for configuration files. When the emperor uwsgi daemon finds a configuration file it launches a new instance of uwsgi using the configuration found. If you change your configuration the emperor uwsgi daemon will notice and restart your app for you. You can also touch the config file to reload like with mod_wsgi, and it's really easy to setup new apps once you have everything configured initially.

    The path conventions I follow are:

    /srv/venv/ - virtualenv for project
    /srv/venv/app.ini - configuration for uwsgi
    /srv/venv/app.sock - uwsgi sock for django
    /srv/venv/app.wsgi - wsgi file for uwsgi
    /srv/venv/proj - django project
    /srv/venv/proj/settings.py - project settings file
    /srv/venv/proj/static - static files dir, linked into var/www/vhosts/domain.com/html
    /srv/venv/proj/static/admin - admin static files, linked as well
    /srv/venv/proj/media - media files dir
    /var/www/vhosts/domain.com/html - base directory for nginx to serve static resources from
    

    This is my nginx.conf:

    location / {
        root /var/www/vhosts/domain.com/html;
        index index.html index.html;
        error_page 404 403 = @uwsgi;
        log_not_found  off;
    }
    
    location @uwsgi {
        internal;
        include /etc/nginx/uwsgi_params;
        uwsgi_pass unix:/srv/venv/app.sock;
    }
    

    My uwsgi ini file (you can also use xml/yaml/etc):

    [uwsgi]
    home = /srv/%n
    pp = /srv/%n
    wsgi-file = /srv/%n/%n.wsgi
    socket = /srv/%n/%n.sock
    single-intepreter = true
    master = true
    processes = 2
    logto = /srv/%n/%n.log
    

    You should also check out gunicorn, it has really nice django integration and good performance.

提交回复
热议问题