Статические страницы Google App Engine, каталоги Python 2.5 и т. Д. - PullRequest
0 голосов
/ 05 января 2012

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

Я уверен, что это простой ответ и что я нарушаю некоторые основные принципы. Я хочу, чтобы на странице движка приложения (mygaeid.appspot.com) была статическая целевая страница, чтобы другие страницы были доступны с добавлением суффикса, например mygaeid.appspot.com/oranges.html mygaeid.appspot.com/grapes.html и т. д.

Я не могу этого добиться, так что я могу получить и другие страницы, когда добавляю суффикс, например, mygaeid.appspot.com/apples.html; mygaeid.appspot.com/oranges.html, но не целевая страница ИЛИ с несколько иным yaml целевая страница (mygaeid.appspot.com) работает, но нет доступа к другим страницам (mygaeid.appspot.com/oranges.html и т.д.), которые имеют суффикс.

Файл py (abcdefg.py) находится ниже и является общим для двух следующих yamls:

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
  def get (self, q):
    if q is None:
      q = 'htmdir/apples.html'

    path = os.path.join (os.path.dirname (__file__), q)
    self.response.headers ['Content-Type'] = 'text/html'
    self.response.out.write (template.render (path, {}))


def main ():
  application = webapp.WSGIApplication ([('/(.*html)?', MainHandler)], debug=True)
  util.run_wsgi_app (application)

if __name__ == '__main__':
  main ()

При использовании следующего yaml целевая страница (mygaeid.appspot.com) работает отлично (с доставкой содержимого apple.html), но я не могу получить доступ к странице, если добавляю суффикс, например, mygaeid.appspot.com/apples.html или mygaeid.appspot.com/static/htmdir/apples.html и т. д., как только я добавляю суффикс, он не работает. В каталоге (htmdir) я поместил apple.html вместе с другими html-страницами, например. oranges.html и т. д., и я не могу получить к ним доступ с помощью этого yaml.

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.(html))
  static_files: static/htmdir/\1
  upload: static/htmdir/(.*\.(html))

- url: /css
  static_dir: css

- url: /js
  static_dir: js

- url: /images
  static_dir: images

- url: .*
  script: abcdefg.py

Если я изменю yaml следующим образом, целевая страница (mygaeid.appspot.com) не работает, но когда я добавляю суффиксы, она работает отлично, например. mygaeid.appspot.com/apples.html; mygaeid.appspot.com/oranges.html и т. д. доставьте соответствующие страницы:

- url: /(.*\.(html))
  static_files: htmdir/\1
  upload: htmdir/(.*\.(html))

Наконец, если я полностью обойдусь без каталогов и использую тот же файл abcdefg.py (без каталога), следующий очень простой yaml на самом деле выдаст нужные мне результаты, но это очень неуправляемо, так как все файлы помещены в корневой каталог.

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.(png|js|css))
  static_files: \1
  upload: (.*\.(png|js|css))

- url: .*
  script: abcedfg.py

любая помощь будет очень признательна при выяснении этого. спасибо


спасибо wooble и спасибо dave. Я вернулся еще раз и внимательно прочитал логи. Решение Wooble работает, но мне нужно было поместить htmdir (содержащий html) в директорию, называемую static. GAE - отличное (и бесплатное) решение для статических сайтов

Ваша помощь и отзывы очень важны

SiteDirectory
-mygaeid
  -static
    -htmdir
  -js
  -css
  -images
 app.yaml
 index.yaml
(py file was removed)

Ответы [ 3 ]

4 голосов
/ 05 января 2012

Если вы объявите файлы как статические в app.yaml, они не будут доступны обработчикам вашего приложения.

Однако, если они действительно статичны, использование движка шаблонов django для их рендеринга является глупым; просто добавьте сопоставления в app.yaml для отображения статических файлов, в том числе одно для отображения apple.html для /:

application: mygaeid
version: 1
runtime: python
api_version: 1

handlers:
- url: /(.*\.html)
  static_files: static/htmdir/\1
  upload: static/htmdir/.*\.html

- url: /css
  static_dir: css

- url: /js
  static_dir: js

- url: /images
  static_dir: images

- url: /
  static_files: static/htmdir/apples.html
  upload: static/htmdir/apples\.html

(без файлов python)

1 голос
/ 05 января 2012

У Вуби правильный ответ.Позвольте мне сформулировать это по-другому.

Когда вы помещаете .html в static_files, они обслуживаются отдельными службами, предназначенными для обслуживания статического контента.Ваше приложение не сможет видеть эти файлы.Приложение может видеть только файлы, которые являются ресурсами.

Шаблоны Django должны быть ресурсами, а не статическими файлами.В противном случае приложение не сможет их увидеть, и template.render(path, ... не удастся выполнить.

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

0 голосов
/ 28 ноября 2013

Есть технические причины, по которым он работает таким образом

Конфигурация app.yaml работает очень простым процедурным способом сверху - снизу.

Сопоставление происходит в следующем порядке:

1. - url: /(.*\.(html))
  static_files: static/htmdir/\1
  upload: static/htmdir/(.*\.(html))

2. - url: /css
  static_dir: css

3. - url: /js
  static_dir: js

4. - url: /images
  static_dir: images

5. - url: .*
  script: abcdefg.py

Проще говоря, если файл имеет суффикс .html, он сопоставляется на шаге 1 и перенаправляет этот запрос с mygaeid.appspot.com/.html на mygaeid.appspot.com/htmdir/. .html. Обработчик * .html на шаге 5 никогда не срабатывает, потому что все маршруты * .html уже используются.

Кроме того, поскольку ответы уже рассмотрены, каталоги, помеченные как статические, не будут доступны локально для обработчиков вашего приложения. Я постараюсь устранить технические причины, по которым.

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

Есть веская причина, по которой статические запросы учитываются отдельно и стоят дешевле, чем обычные запросы приложений. Каждый раз, когда вы запрашиваете статический файл, вы, по сути, извлекаете файл из CDN GAE. Если бы вам нужно было получать только статические файлы, то у вашего сервера не было бы никаких оснований для спулинга.

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

Примечание. Также следуйте указаниям других ответов. Не помечайте папку с шаблонами как статическую. Когда ваше приложение перейдет к загрузке шаблона - вместо того, чтобы брать его из соседнего каталога - оно должно будет отправить веб-запрос и извлечь файл из удаленного местоположения. Очевидно, что выборка удаленного файла вместо локального увеличит время загрузки и задержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...