Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Дополнительный курс по WEB-программированию. Ле...

Avatar for Vladimir Polyakov Vladimir Polyakov
December 03, 2013
210

Дополнительный курс по WEB-программированию. Лекция 3.

Avatar for Vladimir Polyakov

Vladimir Polyakov

December 03, 2013

Transcript

  1. Архитектура программного обеспечения — это структура программы или вычислительной системы,

    которая включает программные компоненты, видимые снаружи свойства этих компонентов, а также отношения между ними.
  2. Ключевые факты Классический подход; Страницы перезагружаются; Меньшая зависимость от клиента;

    Нагрузка на сервер; Часто, необходимость поддерживать несколько интерфейсов; Сейчас в чистом виде почти не встречается; Передача большего объема данных.
  3. Ключевые факты Современный подход; Страницы не перезагружаются; Возможность одновременного выполнения

    нескольких задач на странице; Увеличенные требования к ресурсам клиента; Меньшая нагрузка на сервер; Всегда имеется API; Пользователю приятно.
  4. M — Модель (англ. Model) Предоставляет знания: данные и методы

    работы с этими данными, реагирует на запросы, изменяя своё состояние. Не содержит информации, как эти знания можно визуализировать.
  5. V — Представление, вид (англ. View) Отвечает за отображение информации

    (визуализацию). В качестве представления обычно выступает Web- страница.
  6. C — Контроллер (англ. Controller) Обеспечивает связь между пользователем и

    системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
  7. Пассивная модель Модель не имеет никаких способов воздействовать на представление

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

    произошли изменения, а представления, которые заинтересованы в оповещении, подписываются на эти сообщения. Это позволяет сохранить независимость модели как от контроллера, так и от представления.
  9. virtualenv Загрузим из репозитория: $ c u r l -

    O h t t p s : / / p y p i . p y t h o n . o r g / p a c k a g e s / s o u r c e / v / v i r t u a l e n v / v i r t u a l e n v - 1 . 1 0 . 1 . t a r . g z $ t a r x v f z v i r t u a l e n v - 1 . 1 0 . 1 . t a r . g z $ c d v i r t u a l e n v - 1 . 1 0 . 1 $ [ s u d o ] p y t h o n s e t u p . p y i n s t a l l Создадим виртуальное окружение и активируем его: $ v i r t u a l e n v E N V $ s o u r c e b i n / a c t i v a t e Прочесть подробнее
  10. Установим Flask Вместе с virtualenv устанавливается менеджер пакетов — pip.

    Используем его для установки Flask: $ p i p i n s t a l l f l a s k
  11. Всё готово! Создадим папку для нашего проекта: $ m k

    d i r m y a p p Создадим основной файл проекта: $ t o u c h a p p . p y
  12. Hello world Запишем в app.py следующий код: f r o

    m f l a s k i m p o r t F l a s k a p p = F l a s k ( _ _ n a m e _ _ ) @ a p p . r o u t e ( ' / ' ) d e f i n d e x ( ) : r e t u r n ' h e l l o w o r l d ' i f _ _ n a m e _ _ = = ' _ _ m a i n _ _ ' : a p p . r u n ( ) Запустим сервер (сервер запустился на порту 5000): $ p y t h o n a p p . p y $ * R u n n i n g o n h t t p : / / 1 2 7 . 0 . 0 . 1 : 5 0 0 0 /
  13. Подробнее Импортируем класс Flask и создаем объект (сервер) f r

    o m f l a s k i m p o r t F l a s k a p p = F l a s k ( _ _ n a m e _ _ ) Описываем функцию, которая в данном примере является контроллером и обрабатывает запросы на '/' @ a p p . r o u t e ( ' / ' ) d e f i n d e x ( ) : r e t u r n ' h e l l o w o r l d '
  14. Выведем страницу новостей @ a p p . r o

    u t e ( ' / n e w s ' ) d e f n e w s ( ) : r e t u r n r e n d e r _ t e m p l a t e ( ' n e w s . h t m l ' )
  15. Сделаем страницу динамической @ a p p . r o

    u t e ( ' / n e w s ' ) d e f n e w s ( ) : n e w s = [ { ' t i t l e ' : ' f o o ' , ' d e s c r i p t i o n ' : ' b a r ' } ] r e t u r n r e n d e r _ t e m p l a t e ( ' n e w s . h t m l ' , n e w s = n e w s )
  16. Опишем модель для новостей c l a s s N

    e w s ( o b j e c t ) : i d n = N o n e t i t l e = ' ' d e s c r i p t i o n = ' ' d e f _ _ i n i t _ _ ( s e l f , i d n , t i t l e , d e s c r i p t i o n ) : s e l f . i d n = i d n s e l f . t i t l e = t i t l e s e l f . d e s c r i p t i o n = d e s c r i p t i o n @ s t a t i c m e t h o d d e f f i n d ( ) : # F i x t u r e s a r e p l a c e d i n t h e s a m e f i l e . # R e m o v e d f o r p u r p o s e o f r e a d i n g r e t u r n f i x t u r e s
  17. Перепишем route для новостей @ a p p . r

    o u t e ( ' / n e w s ' ) d e f n e w s ( ) : n e w s _ l i s t = N e w s . f i n d ( ) r e t u r n r e n d e r _ t e m p l a t e ( ' n e w s . h t m l ' , n e w s = n e w s _ l i s t )
  18. Добавим route для одной новости @ a p p .

    r o u t e ( ' / n e w s / < i n t : n e w s _ i d > ' ) d e f n e w s _ i t e m ( n e w s _ i d ) : n e w s = N e w s . f i n d _ o n e ( n e w s _ i d ) r e t u r n r e n d e r _ t e m p l a t e ( ' s i n g l e _ n e w s . h t m l ' , n e w s = n e w s ) Очевидно ничего не заработает :)
  19. Добавим еще один метод в модель @ s t a

    t i c m e t h o d d e f f i n d _ o n e ( i d n ) : r e t u r n n e x t ( ( x f o r x i n f i x t u r e s i f x . i d n = = i d n ) , N o n e )