Статические файлы 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="/", но ни один из них не дал желаемого эффекта.

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


person Joe J    schedule 27.06.2012    source источник


Ответы (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.

person jdi    schedule 27.06.2012
comment
Спасибо, джиди. В шаблонах я все еще {{ STATIC_ROOT }} или просто оставлю его как /css/, /images/, /js/.... ? - person Joe J; 27.06.2012
comment
Он больше не будет частью статического приложения, потому что его нельзя получить через python manage.py collectstatic. Вы бы просто использовали простые URL-адреса, например: /css/foo.css. Они обслуживаются явно из отдельных мест. Они могут даже существовать вне пространства проекта django. - person jdi; 28.06.2012
comment
document_root не должен начинаться с «/», вы должны указать корневой каталог вашего проекта django, например: urlpatterns += static('/css/', document_root='app_root/path/to/css/') - person Orlando Pozo; 08.03.2013

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

например:

rewrite /css /static permanent; (for nginx) 

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

person blsmth    schedule 27.06.2012

Вот как вы настраиваете свой 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')),
]

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

person metakermit    schedule 10.11.2016