Как использовать статические файлы с django nonrel

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

- url: /static   
static_dir: static

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

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


person syloc    schedule 15.10.2011    source источник
comment
Вы случайно не туда свои шаблоны кладете?   -  person Dave W. Smith    schedule 16.10.2011


Ответы (3)


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

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

person Igor Kharin    schedule 16.10.2011

Как уже указывали люди, вы должны поместить свою директиву static_dir перед шаблоном /.*

Однако это не единственное, о чем вы должны знать.

Поместив эту директиву в app.yaml, вы заставляете веб-сервер AppEngine (будь то сервер разработки или производства) обрабатывать путь /static, и вам нужно, чтобы все статические файлы находились внутри статического каталога. Это означает, что вам придется запускать python manage.py collectstatic каждый раз, когда вы меняете что-либо в своих статических файлах (особенно если у вас есть/используете приложения со статическими файлами, например, admin или django-tinymce), просто для проверки этих изменений на локальном сервере.

Так как этого избежать? По умолчанию staticfiles предоставляет хелперы для обслуживания этих файлов на сервере разработки без запуска collectstatic каждый раз. Проблема заключается в конфликте имен каталогов, описанном в предыдущем абзаце: Django не может перехватывать запросы к пути к вашим статическим файлам, так как они обрабатываются сервером приложений. Вы можете решить эту проблему, используя разные пути на сервере разработки и рабочем сервере:

# 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 (и в каталоги static ваших приложений), collectstatic собирает их в каталог sitestatic. Соответствующая директива app.yaml

- url: /static
  static_dir: sitestatic

Наконец, вы можете настроить app.yaml так, чтобы каталоги static и media игнорировались при загрузке вашего приложения, поскольку все статические файлы будут собираться и обслуживаться из sitestatic. Однако вы должны установить это только во время загрузки (иначе эти файлы не будут доступны на сервере отладки)

person LXj    schedule 14.12.2011
comment
Вам также может понадобиться добавить вспомогательные url-шаблоны staticfiles и использовать тег шаблона 'static' для шаблонов, отображаемых без RequestContext — см. документы. Кроме того, убедитесь, что пути к статическим файлам, обслуживаемым помощником разработчика staticfiles, не совпадают ни с какими записями static_dir или static_files в app.yaml. GAE различает «статические» и «сценарные» файлы, и сервер приложений разработчика будет блокировать Django от динамического обслуживания файлов, которые он считает статическими, чтобы соответствовать производственным процессам, где он заблокирован по соображениям безопасности. (SDK GAE 1.7.5) - person jgiles; 18.02.2013
comment
не забудьте установить статическую вспомогательную функцию в urls.py docs.djangoproject.com/en/dev/howto/static-files/ - person taelimoh; 20.11.2015

Ну, я только что понял это. Просто используйте строку 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
person syloc    schedule 16.10.2011