Как загрузить страницу .html с помощью Python в App Engine

В следующем примере данные .html находятся в том же файле, что и код Python (как переменная MAIN_PAGE_HTML).

Я хочу, чтобы содержимое .html было в отдельном файле.

Как представить HTML-страницу? Должен ли я всегда использовать Jinja2 для его загрузки?

Или есть более простой способ получить содержимое моего .html и передать его self.response.write?

import cgi from google.appengine.api import users import webapp2

MAIN_PAGE_HTML = """\ <html>   <body>
    <form action="/sign" method="post">
      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>   </body> </html> """

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.write(MAIN_PAGE_HTML)

class Guestbook(webapp2.RequestHandler):
    def post(self):
        self.response.write('<html><body>You wrote:<pre>')
        self.response.write(cgi.escape(self.request.get('content')))
        self.response.write('</pre></body></html>')

application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook), ], debug=True)

Мой файл .html содержит форму, которую пользователь может заполнить и отправить мне.


person learner    schedule 03.11.2014    source источник


Ответы (2)


Jinja2 это механизм шаблонов, в основном объединяющий переменные перед тем, как они будут переданы клиенту, но webapp2 включает механизм шаблонов сам по себе

import webapp2
import os #added
from google.appengine.ext.webapp import template #also added

class MainPage(webapp2.RequestHandler):
    def get(self):
        path = os.path.join(os.path.dirname(__file__), 'templates/index.html') 
        self.response.out.write(template.render(path, {}))        

class Guestbook(webapp2.RequestHandler):
    def post(self): #didn't change this
        self.response.write('<html><body>You wrote:<pre>')
        self.response.write(cgi.escape(self.request.get('content')))
        self.response.write('</pre></body></html>')

application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook), ], debug=True)

Таким образом, вы можете использовать шаблонизаторы webapp2, jinja или другие, но движок коробочного приложения предлагает только webapp2 (django) и jinja2

Для обслуживания статических файлов (изображений, js, css и т. д.) и в разделе обработчиков в вашем файле app.yaml

handlers:
- url: /images # in the html can access from localhost:8080/images
  static_dir: templates/images # folder template, subfolder images
- url: /js
  static_dir: templates/js  
- url: /css
  static_dir: templates/css  
- url: /fonts
  static_dir: templates/fonts  
- url: /assets
  static_dir: templates/assets  

в соответствии с этим файлом yaml это будет структура вашего проекта

-  MyAppFolder
-- Templates
---- images
---- js
---- css
---- fonts
---- assets
person Kristian Damian    schedule 04.11.2014

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

В качестве альтернативы, если вам нужен только статический контент, используйте статические страницы. (Обратите внимание, что в StackOverflow есть сообщения о том, как это сделать: например: обслуживание html в движке приложений Google Python)

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

person ChrisC73    schedule 03.11.2014
comment
извините, если у меня проблемы с этим. Итак, вы говорите, что я должен иметь возможность загружать свой домашний экран без использования class Guestbook(webapp2.RequestHandler):, и если это правильно, является ли это хорошей практикой? Спасибо. - person learner; 04.11.2014
comment
Да - ваша домашняя страница (в данном случае главная страница GET) может обслуживаться статически, которая затем запрашивает динамический URL-адрес (в вашем случае вызов POST "sign"). Однако URL-адреса должны быть различимы в app.yaml. Однако я не уверен, что считается «наилучшей практикой». - person ChrisC73; 04.11.2014