Борьба с иерархией django - не обслуживает admin css

Я пытаюсь работать с учебником по django, но зациклился на отображении css, связанного с модулем администратора. Я работаю над окнами, с django 1.6, apache и MySQL.

Моя текущая иерархия выглядит следующим образом:

MySite
|
|---static
|   |--admin
|      |--css
|      |--img
|      |--js  
|---MyApp
|   |--__init__.py
|   |--admin.py
|   |--models.py
|   |--tests.py
|   |--views.py
|---MySite
|   |--__init.py
|   |--settings.py
|   |--testdb.py
|   |--urls.py
|   |--wsgi.py
|--manage.py

в файле settings.py я определил STATIC_URL как

STATIC_URL = '/MySite/static/'

Когда я просматриваю полученную страницу администратора, она показывает, что она ищет css в MySite/static/admin/css, где он находится, но не находит его там. Кажется, корень не правильный.

В моем urls.py у меня есть

admin.autodiscover()

urlpatterns = patterns('',  
    url(r'^admin/', include(admin.site.urls)),
)

ИЗМЕНИТЬ:

Мой файл Apache htttpd.conf полностью не тронут тем, что изначально было установлено XAMPP, за исключением того, что я включил *LoadModule wsgi_module modules/mod_wsgi.so* в соответствующее место и добавил

WSGIScriptAlias /MySite F:/Web_Django/MySite/MySite/wsgi.py
WSGIPythonPath F:/Web_Django/MySite
<Directory F:/Web_Django/MySite/MySite/>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>

Я включил весь файл по адресу http://pastebin.com/AD77f69c.


EDIT2:

Я обнаружил, что при использовании apache вам нужно реализовать файл wsgi.py немного по-другому. Теперь у меня есть следующее, но проблема остается.

import os
import sys

path = 'f:/web_django/Nutana/'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'Nutana.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Грэм Дамплтон, разработчик адаптера modwsgi для apache, предоставляет альтернативный файл wsgi, который, по его (и, по-видимому, многим другим) работает лучше, в старом сообщении в блоге (http://tinyurl.com/y8wr7gc), но у меня это не работает.


person marcp    schedule 17.12.2013    source источник
comment
попробуйте удалить /MySite/ из STATIC_URL, чтобы было просто STATIC_URL = '/static/'   -  person Aamir Adnan    schedule 17.12.2013
comment
Нет, это тоже не работает. В этом случае видимый путь, указанный на вкладке ресурсов инструментов разработчика Chrome, будет /static/admin/css/base.css с результатом 404. Путь к html-файлу указан как /MySite/admin/   -  person marcp    schedule 17.12.2013
comment
Я предполагаю, что на самом деле он ищет в MySite/MySite/static/admin/css. Положите его туда и посмотрите, найдете ли вы его.   -  person Rob L    schedule 17.12.2013
comment
Извините @RobL, это тоже не работает.   -  person marcp    schedule 17.12.2013
comment
Не пытайтесь работать с учебником через Apache. Есть причина, по которой он говорит вам использовать сервер разработки. Следуйте его рекомендациям, используйте сервер разработки, узнайте, как он работает, и затем изучите, как выполнять развертывание с помощью Apache.   -  person Daniel Roseman    schedule 18.12.2013
comment
@DanielRoseman, я уверен, что вы правы, и это путь наименьшего сопротивления, однако я предпочитаю все делать правильно с самого начала, и кажется, что переход на Apache является серьезным препятствием при сборке на сервере разработки. Для целей этого обсуждения вы можете заменить работу с учебником по django созданием моего первого веб-сайта, и та же проблема останется.   -  person marcp    schedule 18.12.2013
comment
Что ж, при всем уважении к августейшему мистеру Дамплтону, этой статье уже более трех лет, а за это время в Django было внесено немало улучшений. В частности, изменился макет проекта, и runserver теперь гораздо меньше хакает, чем раньше (так, например, настройки больше не импортируются дважды). Но еще важнее то, что вам придется на самом деле настроить Apache для обслуживания статических файлов, чего вы еще не сделали.   -  person Daniel Roseman    schedule 18.12.2013


Ответы (2)


Просто чтобы уточнить свой ответ: вы можете хранить свои файлы внутри проекта (для целей разработки), и когда вам нужно развернуть, вы используете команду

django-admin.py collectstatic¶

чтобы собрать ваши файлы в каталоге, описанном в settings.py> STATIC_ROOT

Одним из преимуществ является то, что вы можете использовать свои JS и CSS в обычном режиме, а когда придет время для развертывания, вы можете использовать расширение, такое как сжатие (http://django-compressor.readthedocs.org/en/latest/) для минимизации и отправки минифицированного в статический корень (который может находиться в CDN).

Дополнительная литература: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/

ИЗМЕНИТЬ

В Nginx вы бы использовали

location /myuser/static/ {                                         # STATIC_URL
    alias /home/myuser/projects/src/MyProject/static/;              # STATIC_ROOT
}

чтобы определить псевдоним для STATIC_ROOT.

Тогда сервер будет знать, где искать эти файлы, созданные с помощью Collect_static.

Я считаю, что с вами происходит то, что ваш сервер не знает, где найти ваши файлы внутри проекта. Другая проблема с использованием файлов, обслуживаемых внутри проекта, заключается в том, что вы теряете модульность. у вас не может быть разных статических каталогов (по одному для каждого модуля) внутри вашего проекта без необходимости создавать дополнительные псевдонимы на вашем сервере (больше беспорядка).

Кстати, с сервером разработки этого не происходит. он находит ваши файлы без необходимости настройки.

person LGama    schedule 18.12.2013
comment
Потому что вам нужно иметь статический репозиторий для обслуживания ваших файлов. Apache ищет каталог, настроенный в conf - person LGama; 19.12.2013
comment
Я думаю, это то, что я описал в своем ответе, не так ли? Когда у меня была папка /admin под MySite, я не мог заставить ее работать. Или я туплю? - person marcp; 19.12.2013
comment
вы не тупите, я тоже потратил довольно много времени на эту проблему. Отредактировал мой ответ, чтобы улучшить некоторые. - person LGama; 19.12.2013
comment
ОК, я переместил свою статическую папку в каталог MySite и изменил псевдоним apache '/ static', чтобы он указывал на нее, и это также работает. Клянусь, я пробовал это раньше. Но я не уверен, как я продвинусь вперед таким образом. - person marcp; 19.12.2013
comment
ни в коем случае, если вы используете необработанные источники в своих статических файлах. Если вы используете какой-либо вид сжатия или кэширования в своем проекте, у вас есть возможность сделать это, не затрагивая ваши источники, а также можете использовать CDN. - person LGama; 19.12.2013

ИЗМЕНИТЬ

Конечно, лучше иметь настройку проекта внутри самого проекта, по крайней мере локально. Это предполагает использование collectstatic для подготовки к перемещению сайта с моей машины для разработки. Следуя совету @LGama, я переместил его в проект и обновил псевдоним, как показано ниже.


@DanielRoseman прокомментировал, что мне «на самом деле нужно настроить Apache для обслуживания статических файлов», что, конечно же, я думал, что делаю! Вернувшись к файлам журнала ошибок apache и обратившись к этому аналогичному вопросу (Apache не обслуживает статические файлы администратора django), я подозреваю это из. В httpd.conf должен быть создан "статический" псевдоним. Я также переместил скрипт wsgi.py в отдельную папку по совету Грэма Дамплтона. Итак, теперь моя структура

f:\django_web/
   |---MySite
       |---static/
       |   |---admin/
       |       |--css
       |       |--img
       |       |--js  
       |---MyApp/
       |   |--__init__.py
       |   |--admin.py
       |   |--models.py
       |   |--tests.py
       |   |--views.py
       |---MySite/
       |   |--__init.py
       |   |--settings.py
       |   |--testdb.py
       |   |--urls.py
       |---Apache/
       |   |--wsgi.py
       |--manage.py

и моя конфигурация httpd включает:

Alias /static "F:/Web_Django/MySite/static/"
<Directory "F:/Web_Django/MySite/static/">
    Order allow,deny
    Options Indexes
    Allow from all
    IndexOptions FancyIndexing
</Directory>

WSGIScriptAlias /MySite F:/Web_Django/MySite/Apache/wsgi.py
WSGIPythonPath F:/Web_Django/MySite
<Directory F:/Web_Django/MySite/Apache/>
Order deny,allow
Allow from all
</Directory>

и все работает!

person marcp    schedule 18.12.2013