Google AppEngine с самого начала: Представление

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

    Напомню, что мы закончили на обзоре контроллера для нашего примера и обещании, что в следующей части все начнется, и, наконец-то, все станет интересно и захватывающе. Станет обязательно. Итак —

    Представление


    Как вы знаете, такие слова как MVC уже давно стали даже не модными, а прям-таки подразумевающимеся (другой вопрос что понимает их всяк по своему). Наш пример не стал исключением — и теперь нам нужно объединить достижения контроллера и модели воедино и показать их пользователю. В этом нам немало поможет тот факт, что GAE внутри использует Django, механизм шаблонов которого является одним из самых лучших среди тех, которые я знаю. Одним из самых интересных, на мой взгляд, свойств шаблонов Django является то, что они поддерживают наследование.

    Действительно, зачастую дизайн двух функционально разных страниц веб-сайта отличается лишь незначительно и использует общие элементы — header, footer, меню и т.д. Обидно будет дублировать этот код — и в то же время, всяческие include-директивы это все-таки вчерашний день. В Django вы можете наследовать один шаблон от другого.

    Рассмотрим наш базовый шаблон, который можно найти в дереве исходников как templates/basic.html. Поскольку HTML на Хабр красиво вставляться не желает (и никакой Хабраредактор с этим справится не может), а некрасиво его читать — голову сломать можно, посмотрите его уж в SVN по ссылке выше. Суть не в этом. Суть в том, что в каких-то местах мы объявляем «заглушки»:
    1. <div id='content'>
    2. {% block content %} {% endblock %}
    3. </div>


    Содержимое этих заглушек объявляет шаблон, который наследует наш basic.html, например, как это показано в please_login.html:
    1. {# $Id: please_login.html 3 2010-01-25 12:14:40Z sigizmund $ #}
    2.  
    3. {% extends "basic.html" %}
    4.  
    5. {% block title %}
    6. HelloWorld! &mdash; a simple GAE application
    7. {% endblock %}
    8.  
    9. {% block content %}
    10. Welcome to HelloWorld! &mdash; a simple application to illustrate some features of GAE. To continue, <a href="{{ login_url }}">please login</a> using your Google credentials.
    11. {% endblock %}


    Мы не будем рассматривать наследование шаблонов в Django — примеров масса и найти их не составит никакого труда. Заметим только, что please_login.html определяет два блока — title и content; первый, соответственно, используется в заголовке, а второй — в теле страницы.

    Наверняка вы обратили внимание на конструкции вида:
    1. <a href="{{ login_url }}">...
    В принципе, ясно, что здесь имеет место быть подстановка аргументов в шаблон. Давайте посмотрим, как именно это происходит:
    1. class StartPage:
    2.     def __init__(self, request):
    3.         self.request = request
    4.     def render(self, out):
    5.         template_values = {'login_url' : users.create_login_url("/login")}
    6.         path = os.path.join('templates/please_login.html')
    7.         out.write(template.render(path, template_values))
    красивого кода опять не получилось, потому как подсветка в Хабраредакторе почему-то убивает отступы, что, в случае Питона, согласитесь, имеет некоторое значение

    Собственно, вот и вся магия. Мы создаем login URL так же как и раньше, и просто передаем его в качестве параметра шаблона механизму Джанги. Последний берет на себя все задачи разрешения наследования, соединения многих шаблонов воедино, подстановки блоков и значений, и на выходе мы получаем приятно выглядящую страницу:

    HelloWorld! — a simple GAE application

    Абсолютно аналогичным образом мы создаем представление для страницы залогиненного пользователя:
    1. {# $Id: welcome.html 3 2010-01-25 12:14:40Z sigizmund $ #}
    2.  
    3. {% extends "basic.html" %}
    4.  
    5. {% block title %}
    6. Welcome page for {{ username }}
    7. {% endblock %}
    8.  
    9. {% block content %}
    10. Dear {{ username }}!<br/><br/>
    11. Welcome to HelloWorld! &mdash; a simple application to illustrate some features of GAE. Now when you're logged in, you can <a href='/stats'>view your stats</a>. Alternatively, you can <a href="{{ logout_url }}">log out</a> and start all over again.<br/><br/>
    12. {% endblock %}
    и, соответственно,
    1. class WelcomePage:
    2.     def __init__(self, request):
    3.         self.request = request
    4.         self.user = users.get_current_user()
    5.  
    6.     def render(self, out):
    7.         template_values = {
    8.             'username' : self.user.nickname(),
    9.             'logout_url' : users.create_logout_url('/')
    10.         }
    11.  
    12.         path = os.path.join('templates/welcome.html')
    13.         out.write(template.render(path, template_values))
    На выходе мы получаем:
    Welcome page for sigizmund

    Ничего непредсказуемого нет. Единственное отличие от первого примера — здесь мы создаем logout url вместо login, и передаем имя пользователя чтобы «персонализировать» приветствие. Я думаю, если вы читали пост внимательно, для вас не составит труда представить себе, что именно должно быть в шаблоне и представлении для страницы статистики; проверить же себя можно, соответственно по адресам stats.html и view.py.




    Ну что ж — пора подвести некоторые итоги. Серия статей GAE from the beginning насчитывает уже четыре части, а мы только коснулись всего многообразия возможностей Google AppEngine. Дальше я, пожалуй, буду ждать комментарией пользователей и читателей, с вопросами, предложениями, идеями —, а через пару дней, отдохнув, напишу еще пару статей. О чем — это зависит только от вас!

    Внеклассное чтение


    1. Как я уже и говорил, начать стоит с официального AppEngine QuickStart почти наверняка по прочтению вы сможете написать что-то толковое. Если же по прочтению вы поймете, что чего-то явно не хватает, то вам надо посмотреть на …
    2. официальную документацию по AppEngine. Она действительно очень хорошо написана, и прочитать ее стоит.
    3. Наконец, про шаблоны Django вы можете прочитать на сайте django — уверен, что вам понравится и вы не остановитесь пока не прочтете всю документацию от корки до корки;-)

    Наконец, если у вас возникнут вопросы — пишите сюда, здесь явно есть специалисты получше чем я, и мы все вместе постараемся вам ответить.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 10

      –4
      >>О чем — это зависит только от вам!
      от Вас
        0
        Исправил.
        0
        Большое спасибо. Жаль только эта часть не пользуется большим успехом. Тем не менее надеюсь, что у Вас не отпадет желание продолжить. =)
          0
          Очень интересно, спасибо
            0
            Может напишите про бд? GQL, транзакции, memcache…
              0
              Присоединяюсь к просьбе о продолжении.
                0
                я вот тут задумал на Java свой другой проект переписать… ;)
                  0
                  Значит ли это что ответ — «будет!»? %)
                    0
                    Если у народа есть интерес — то будет. Вот на новой работе немного освоюсь и займусь ;)
                0
                Вообще хотелось бы подробностей (для начинающих питонистов) о Datastore и о взаимодействии с ним. Я в рамках изучения питона и appengine пытаюсь написать приложение, которое собирает по rss погодные данные и хранит в базе данных, что бы потом можно было смотреть статистику. Не могу толковых примеров найти нигде.

                Only users with full accounts can post comments. Log in, please.