Борба с йерархията на django - не обслужва администраторски css

Опитвам се да работя с урока за django, но се спрях да показвам css, свързан с администраторския модул. Работя на windows, с 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


РЕДАКТИРАНЕ 2:

Открих, че когато използвате 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 с build my first website и идентичният проблем ще остане.   -  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 admin), разбрах вън е. Трябва да има „статичен“ псевдоним, създаден в 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