Обслуживание статических файлов — Django-nonrel в Appengine

Я успешно запустил базовое приложение Django-nonrel на Appengine. Шаблоны отображаются правильно, но статическое содержимое возвращает ответ 404.

Нет проблем со статическим содержимым на сервере разработки, запущенном с помощью `python manage.py runserver'.

Это соответствующие строки в static.py:

STATIC_URL = '/static/'
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',  # Refers to PROJECT_DIR/static
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',  # Appname/static
)

STATICFILES_DIRS = (os.path.join(PROJECT_DIR, 'static'),)

В соответствующем шаблоне:

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}Adding Objects{% endblock %}

{% block content %}
<p>Placeholder for Objects</p>
    <img src="{% static "test_pattern.gif" %}">
    <img src="{% static "sample_overlay.gif" %}">
{% endblock %}

При этом статические файлы в каталогах myproject/static и myproject/myapp/static успешно обслуживаются на сервере разработки (python manage.py runserver).

Это мой app.yaml:

application: appname
version: 1
runtime: python27
api_version: 1
threadsafe: yes

builtins:
- remote_api: on

inbound_services:
- warmup

libraries:
- name: django
  version: latest

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

- url: /_ah/stats/.*
  script: djangoappengine.appstats.application

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

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

Любая подсказка, как это исправить? Я не хочу, чтобы веб-сервер Appengine обрабатывал статические файлы, я хочу направлять все через Django (по крайней мере, сейчас). Следовательно, такое решение, как это не совсем приемлемо в моем случае.

РЕДАКТИРОВАТЬ: я могу легко обойти это с помощью этого в моем app.yaml и обслуживать все статические файлы из projectdir/static.

- url: /static
  static_dir: static

Но это решение кажется грязным, я бы хотел оставить все это Джанго.


person user1265125    schedule 03.06.2014    source источник


Ответы (1)


Ваше добавление сопоставления /static в app.yaml является правильным методом. Это не "грязно".

Кроме того, вы добавляете библиотеку django в app.yaml. Это неправильно. Django-nonrel использует собственную ветку Django, которую вы должны импортировать как каталог с вашим приложением. Добавление вызова django к библиотекам в app.yaml означает, что вы импортируете 2 версии Django, что может привести к странным ошибкам. Удалите вызов библиотеки Django в app.yaml и импортируйте версию Django, включенную в nonrel.

person GAEfan    schedule 03.06.2014
comment
Можете ли вы объяснить, почему это правильный метод, вкратце? На мой взгляд, Appengine просто делегирует всю ответственность Django через - url: /.*. Таким образом, Django должен иметь возможность обслуживать статические файлы самостоятельно. Или это вопрос того, как Appengine справляется с развертыванием? - person user1265125; 04.06.2014
comment
Кроме того, с другой стороны, я просто использовал образец django-testapp, предоставленный django-nonrel. Однако вы заметили, что если я удалю импорт django в app.yaml, мое приложение все равно будет работать. - person user1265125; 04.06.2014
comment
Чисто. app.yaml запускается первым, поэтому сразу же выдается правильный ответ. Альтернативой может быть переназначение/перенаправление в urls.py. Это требует больше времени на обработку при поиске перенаправления. Кроме того, он также будет обслуживать пользователя с ошибкой 301: - person GAEfan; 04.06.2014
comment
Кроме того, в зависимости от того, какую версию Django вы импортируете, вы можете обнаружить, что ваши статические медиа-адреса администратора неверны. В некоторых прошлых версиях путь был изменен на: django/contrib/admin/static/admin/. И я рекомендую использовать поставки nonrel последней версии, которая, по-моему, 1.5.5. - person GAEfan; 04.06.2014
comment
Google обслуживает статические файлы намного быстрее, и эти файлы можно обслуживать без запуска экземпляра для запуска django. Практически нет вариантов использования статического файла django, обслуживающего встроенную статическую поддержку appengines. - person Tim Hoffman; 04.06.2014