Как уже отмечали люди, вы должны поместить свою директиву static_dir
перед /.*
pattern
Однако, это не единственное, о чем вы должны знать.
Поставив этодиректива в app.yaml, вы заставляете веб-сервер AppEngine (будь то сервер разработки или рабочий сервер) обрабатывать путь /static
, и вам нужно, чтобы все статические файлы находились внутри статического каталога.Это означает, что вам придется запускать python manage.py collectstatic
каждый раз, когда вы что-либо изменяете в своих статических файлах (особенно если у вас есть / используются приложения со статическими файлами - например, например, admin
или django-tinymce
) только для того, чтобы проверить эти изменения налокальный сервер
Так как этого избежать?По умолчанию staticfiles предоставляет помощники для обслуживания этих файлов на сервере разработки без выполнения команды collectstatic каждый раз, проблема заключается в конфликте имен direcotry, описанном в предыдущем абзаце: Django не может перехватывать запросы к пути к вашим статическим файлам, так как они обрабатываются appserver.Вы можете решить эту проблему, используя различные пути на сервере разработки и производства:
# in settings.py
if DEBUG:
STATIC_URL = '/devstatic/'
else:
STATIC_URL = '/static/'
(djangoappengine устанавливает для DEBUG значение True на сервере разработки).Вы можете оставить ADMIN_MEDIA_PREFIX = '/static/admin/'
, но не забывайте запускать collectstatic хотя бы один раз перед использованием admin
Конечно, не забывайте использовать {{ STATIC_URL }}path/to.css
в шаблонах вместо /static/path/to.css
О, и я предполагаючтобы вы различали каталог для исходных статических файлов, над которыми вы работаете, и каталог, в котором должны быть собраны статические файлы.Я использую это в моем settings.py:
STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'sitestatic')
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'static'),
)
Это означает: вы помещаете свои статические поля в static
dir (и в static
dirs ваших приложений), collectstatic
собирает их в sitestatic
реж.Подходящая директива app.yaml
:
- url: /static
static_dir: sitestatic
Наконец, вы можете настроить app.yaml
на игнорирование каталогов static
и media
при загрузке приложения, поскольку все статические файлы будут собираться и передаваться изsitestatic
.Однако вы должны установить это только при загрузке (в противном случае эти файлы не будут доступны на сервере отладки)