Статические файлы django в корне URL

У меня есть общий вопрос о новой статической файловой структуре Django 1.3.

Мне очень нравится новая функциональность статического файла Django, представленная в Django 1.3. Обычно я устанавливаю STATIC_URL="/static/" и вводю тег шаблона {{ STATIC_URL }} в мои шаблоны. Прекрасно, что сервер разработки автоматически подает статические файлы, и весь мой контент обрабатывается, как и ожидалось.

The {{ STATIC_URL }} would be substituted in the template and might serve up files like this...
example.com/static/css/master.css
example.com/static/images/logo.png
example.com/static/js/site.js

Однако я работаю с устаревшим сайтом, на котором статический носитель монтируется в корне URL. Например, путь к статическим URL-адресам может выглядеть примерно так:

example.com/css/master.css
example.com/images/logo.png
example.com/js/site.js 

Он не использует "статическое" пространство имен URL.

Мне было интересно, есть ли способ заставить новую функциональность staticfile не использовать статическое пространство имен и не обслуживать указанные выше URL-адреса, но при этом сохранить преимущества новой среды staticfile (collectstatic, статические файлы, обслуживаемые сервером разработки и т. Д.). Я попытался установить STATIC_URL="" и STATIC_URL="/", но ни один из них не дал желаемого эффекта.

Есть ли способ настроить статические файлы для обслуживания статических файлов без пространства имен? Спасибо за внимание.

3 ответа

Решение

Вы можете вручную добавить дополнительные места, которые не существуют в static каталоги в вашем проекте:

urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
)

if settings.DEBUG:
    urlpatterns += static('/css/', document_root='app_root/path/to/css/')
    urlpatterns += static('/images/', document_root='app_root/path/to/images/')
    urlpatterns += static('/js/', document_root='app_root/path/to/js/')

Это отобразит медиа для сервера разработки DEBUG. И когда вы работаете с сервером производственного режима, вы, очевидно, будете обрабатывать эти статические местоположения с веб-сервера, а не отправлять запрос в django.

Почему бы не сохранить функциональность staticfiles и просто использовать перезаписи на уровне веб-сервера для обслуживания контента.

например:

rewrite /css /static permanent; (for nginx) 

это сделает каталог вашего проекта намного чище, а также упростит перемещение ваших статических каталогов в будущем, например, для перехода к вашему STATIC_URL в CDN.

Вот как вы настроили свой urls.py для обслуживания как index.html, так и других ваших статических файлов в / в Django 1.10 (при этом все еще в состоянии обслуживать другие представления Django):

from django.contrib.staticfiles.views import serve
from django.views.generic import RedirectView

urlpatterns = [

    # / routes to index.html
    url(r'^$', serve,
        kwargs={'path': 'index.html'}),

    # static files (*.css, *.js, *.jpg etc.) served on /
    url(r'^(?!/static/.*)(?P<path>.*\..*)$',
        RedirectView.as_view(url='/static/%(path)s')),
]

Посмотрите этот ответ, где я написал более полное объяснение такой конфигурации, особенно если вы хотите использовать ее для производства.

Другие вопросы по тегам