Как использовать статические файлы с django nonrel - PullRequest
10 голосов
/ 15 октября 2011

Я пытаюсь использовать проект Django nonrel для google app engine.Я настраиваю тестовый проект, как описано здесь .Я добавил новую папку в проект с именем «static» для моих статических файлов.И для файла app.yaml я добавил строки:

- url: /static   
static_dir: static

Я не могу добраться до своих статических файлов.Нужно ли выполнять дополнительную настройку?

Спасибо заранее.

Ответы [ 3 ]

13 голосов
/ 14 декабря 2011

Как уже отмечали люди, вы должны поместить свою директиву 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.Однако вы должны установить это только при загрузке (в противном случае эти файлы не будут доступны на сервере отладки)

11 голосов
/ 16 октября 2011

app.yaml не имеет ничего общего с Django, но он настраивает внешний интерфейс App Engine.Ответ зависит от того, хотите ли вы обслуживать статические файлы с помощью Django или внешнего интерфейса (что, в общем-то, дешевле и быстрее).

Если вы просто «добавили» свое отображение - url: /static в конец,переместите до подстановочного знака /.*.Поскольку все сопоставления обрабатываются сверху вниз, первое сопоставление сопоставлений выигрывает.

4 голосов
/ 16 октября 2011

Ну, я только что понял это.Просто используйте строку static_dir перед main.py.Так что app.yaml должен выглядеть так:

application: test
version: 1
runtime: python
api_version: 1

builtins:
- remote_api: on

inbound_services:
- warmup

handlers:
- url: /_ah/queue/deferred
  script: djangoappengine/deferred/handler.py
  login: admin

- url: /_ah/stats/.*
  script: djangoappengine/appstats/ui.py

- url: /media/admin
  static_dir: django/contrib/admin/media
  expiration: '0'

- url: /static
  static_dir: static

- url: /.*
  script: djangoappengine/main/main.py
...