2012-01-04 4 views
0

Я новичок в этом, и я планирую перенести свои вещи с платного веб-сервиса на GAE (ничего динамического, просто статические страницы). Поверьте мне, я потратил бесчисленные часы, пытаясь сделать эту работу, но я в тупике, благодаря чему я достигаю одного результата, за исключением другого и наоборот.Статические страницы Google App Engine Python 2.5 и т. Д.

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

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

Файл ого (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) работ отлично (доставляет содержимое apples.html), но я не могу получить доступ к странице, если добавить суффикс, например mygaeid.appspot.com/apples.html или mygaeid.appspot.com/static/htmdir/apples.html и т. д., как только я добавлю суффикс, он не работает. В каталоге (htmdir) я разместил apples.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 и благодаря Дэйву я вернулся еще раз и внимательно прочитайте Бревно решения работает Wooble, но мне нужно было поставить htmdir (который содержит HTML) внутри директории под названием статичной. GAE является большим (и бесплатно) решением для статических сайтов

вашей помощи и обратной связи очень ценятся

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

ответ

4

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

Однако, если они действительно статичны, использование механизма шаблонов django для «рендеринга» - это глупо; просто добавьте сопоставления в app.yaml для отображения статических файлов, в том числе для отображения яблок.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 

(нет питон файлов нужно)

+0

@Octavio: Я отредактировал свой ответ, чтобы включить обработчики CSS/JS/image. – geoffspear

1

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

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

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

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

0

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

The app.yaml функции конфигурации в очень простой топ-> нижний процедурном порядке.

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

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 to mygaeid.appspot.com/htmdir/ .html. Обработчик * .html на шаге 5 никогда не попадает, потому что все * .html маршруты уже говорят.

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

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

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

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

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

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