2016-01-09 3 views
1

Я немного начинаю, когда дело доходит до Django и Google App Engine, и у меня возникли проблемы с настройкой путей проекта в настройках моего приложения. В частности, я пытаюсь ссылаться на файл CSS для использования с шаблоном. Моя структура каталогов выглядит следующим образом:Невозможно найти статический каталог в приложении Django

app/ 
    app/ 
     -'__init__'.py 
     -settings.py 
     -urls.py 
     -views.py 
     -wsgi.py 
img/ 
static/ 
    css/ 
     -style.css 
templates/ 
    -index.html 

Я думаю, что моя проблема заключается в настройках, основанных на работе я делал в течение последних нескольких часов. Я начал быть не может ссылаться на шаблон, но я понял, как сделать это, и позвольте мне объяснить, как:

В settings.py, у меня есть следующие элементы информации относительно шаблонов:

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__)) 

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates', 
) 

Это оказалось достаточно простым. Я устанавливаю PROJECT_PATH, который содержит путь к проекту и добавляет каталог шаблонов. Тем не менее, у меня все еще есть проблемы с тем же, что и для статических файлов, и это я потерял. Что касается статических файлов У меня есть следующие в настройках:

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__)) 

STATIC_ROOT = '' 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    PROJECT_PATH + '/static', 
) 

Теоретически эти значения по умолчанию должны работать хорошо до тех пор, пока каталог я использую называется «/ статический /», но он не работает так же, как шаблоны. Я попробовал несколько разных вещей, чтобы попытаться заставить эти значения указывать на правильный каталог, но только один раз я действительно был успешным, и я думаю, что это была комбинация использования абсолютных путей, то есть «Пользователи/имя пользователя/приложение/static/css/', которые не имеют смысла после развертывания проекта, потому что я не размещаю его на своем компьютере. Также я, вероятно, переместил статический каталог внутри подпапки приложения, что также не нужно. Что отличается от статических файлов по сравнению с файлами шаблонов? Почему я могу использовать PROJECT_PATH и добавлять '/ static' для достижения того же результата, что и с шаблонами?

Некоторые другая полезная информация из моего проекта:

app/urls.py: 

urlpatterns = patterns(
    '', 
    url(r'^$', views.index, name='index'), 
) + staticfiles_urlpatterns() 

и:

templates/index.html: 

<html> 

    <head> 
     {% load staticfiles %} 
     <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}" /> 
    </head> 

    <body> 
     <!--Some stuff--> 
    </body> 

</html> 

и:

app.yaml: 

application: siren-1157 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

handlers: 
- url: /.* 
    script: main.app 
- url: /static 
static_dir: static 

libraries: 
- name: django 
    version: "latest" 

EDIT: на основе некоторой обратной связи от @AlexMartelli I» ve добавил application_readable: true для app.yaml, в этом w ау:

- url: /static 
    static_dir: static 
    application_readable: true 

Некоторые другие ресурсы я использовал во время поиска и устранения неисправностей, с плохим эффектом:

Django -- Can't get static CSS files to load https://docs.djangoproject.com/en/1.4/howto/static-files/#configuring-static-files https://github.com/divio/django-shop/blob/master/example/settings.py

Некоторые другие вещи, которые я пробовал:

Изменить ссылочный метод в индексе.HTML:

от

{% static 'css/style.css'} 

к

{{ STATIC_URL }}css/style.css 

Changed project_path с множеством различных модулей бя

Измененного STATIC_ROOT, STATIC_URL и STATICFILES_DIRS к различным различным значениям, от абсолютного пути ('/ Users/username/app/static /') к относительному пути с использованием PROJECT_PATH или производной

Может ли кто-нибудь указать мне в правильном направлении, выяснив, как настроить каталоги? Я чувствую, что я рядом, но сейчас это сводит меня с ума.

+1

Поскольку вы упоминаете механизм приложения, можете ли вы показать нам свой 'app.yaml'? Если вы объявляете файлы как статические, они не будут доступны для кода вашего приложения, если вы не добавите 'application_readable: True' в соответствующую строфу - см. Https://cloud.google.com/appengine/docs/python/config/appconfig? hl = ru # Python_app_yaml_Static_file_handlers для всех деталей. –

+0

Позвольте мне проверить это @AlexMartelli. Я посмотрю, есть ли у меня ответ на этот вопрос. Может быть хорошо проверить. –

+0

@AlexMartelli Я добавил app.yaml на вопрос –

ответ

0

После некоторого дальнейшего поиска на других постах StackOverflow, я нашел тот, который имел следующее предложение:

Проверьте, вы можете перейти непосредственно к нужному файлу CSS. Например, если вы работаете на локальном хосте, попробуйте перейти на localhost: 8080/static/css/style.css Были ли у вас возможности просмотреть файл?

После этого I был фактически способен просматривать файл. Затем, по совпадению, пытаясь получить доступ к индексу снова, я был в состоянии увидеть CSS и был вознагражден следующим Вход:

INFO  2016-01-09 04:11:00,856 module.py:794] default: "GET /static/css/style.css HTTP/1.1" 200 2796 

Что могло случиться, что вручную доступа к файлу CSS, браузер был вынужден перезагрузить его и использовать для отображения индексной страницы.

Это ужасный ответ на, вероятно, ужасный вопрос, но, надеюсь, кто-то в будущем сочтет это полезным.

3

Учитывая следующий фрагмент из вашего app.yaml:

handlers: 
- url: /.* 
    script: main.app 
- url: /static 
static_dir: static 

, как описаны в Configuring with app.yaml#Static file handlers, веб-клиент, обращающийся ваше приложение будет получить эти статические файлы, но код собственного приложения будет не быть в состоянии получить доступ к ним , Измените ваш handlers: к

handlers: 
- url: /.* 
    script: main.app 
- url: /static 
    static_dir: static 
    application_readable: true 

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

+0

Отлично, дайте мне попробовать. На самом деле я редактировал свой вопрос с обновлением до моего app.yaml и сделал это изменение в моих исходных файлах. Я посмотрю, поможет ли это. Мне в основном удалось решить эту проблему, не добавляя application_readable boolean, но, возможно, с помощью этого метода он будет более чистым или более эффективным.Я узнаю. –

+1

@MichaelFourre, не более эффективный, поскольку, как я уже сказал, вы получаете две копии статических файлов. Он отличается тем, что он позволяет коду вашего приложения (и который включает шаблоны django и другие функции) также обращаться к статическим файлам, чтобы вы могли, если хотите, использовать богатые статические файлы django для части вашей статической обработки файлов, это все. –

+0

Полезно знать, спасибо. Как-то кажется, что я смог это сделать, даже не изменяя эту настройку в app.yaml, но, возможно, я просто не понимаю эту функцию. Спасибо за отзыв независимо от ответа. –

Смежные вопросы