🗊Презентация Django. Уровни в Django

Нажмите для полного просмотра!
Django. Уровни в Django, слайд №1Django. Уровни в Django, слайд №2Django. Уровни в Django, слайд №3Django. Уровни в Django, слайд №4Django. Уровни в Django, слайд №5Django. Уровни в Django, слайд №6Django. Уровни в Django, слайд №7Django. Уровни в Django, слайд №8Django. Уровни в Django, слайд №9Django. Уровни в Django, слайд №10Django. Уровни в Django, слайд №11Django. Уровни в Django, слайд №12Django. Уровни в Django, слайд №13Django. Уровни в Django, слайд №14Django. Уровни в Django, слайд №15Django. Уровни в Django, слайд №16Django. Уровни в Django, слайд №17Django. Уровни в Django, слайд №18Django. Уровни в Django, слайд №19Django. Уровни в Django, слайд №20Django. Уровни в Django, слайд №21Django. Уровни в Django, слайд №22Django. Уровни в Django, слайд №23Django. Уровни в Django, слайд №24Django. Уровни в Django, слайд №25Django. Уровни в Django, слайд №26Django. Уровни в Django, слайд №27Django. Уровни в Django, слайд №28Django. Уровни в Django, слайд №29Django. Уровни в Django, слайд №30Django. Уровни в Django, слайд №31Django. Уровни в Django, слайд №32Django. Уровни в Django, слайд №33Django. Уровни в Django, слайд №34Django. Уровни в Django, слайд №35Django. Уровни в Django, слайд №36Django. Уровни в Django, слайд №37Django. Уровни в Django, слайд №38

Содержание

Вы можете ознакомиться и скачать презентацию на тему Django. Уровни в Django. Доклад-сообщение содержит 38 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Django
Саяпова Наталья, 222 группа
Описание слайда:
Django Саяпова Наталья, 222 группа

Слайд 2





Django
Это сильный web-framework, созданный на Python, который следует философии DRY (Don’t repeat yourself)
Он реализован на основе MVC (Model-View-Controller – модель-представление-контроллер).
Парадигма MVC – идея разделения приложений
Описание слайда:
Django Это сильный web-framework, созданный на Python, который следует философии DRY (Don’t repeat yourself) Он реализован на основе MVC (Model-View-Controller – модель-представление-контроллер). Парадигма MVC – идея разделения приложений

Слайд 3





Реляционные базы данных
Базы данных состоят из таблиц, где каждая таблица состоит из строк (например, записей, элементов, объектов) и столбцов (например, атрибутов, полей), напоминая своей организацией электронные таблицы. 
Запросы к базе данных осуществляются с помощью языка SQL(Structured Query language). 
Платформа Django содержит мощную систему ORM, которая классы представляет как таблицы, объект - как отдельные строки внутри этих таблиц, а атрибуты объектов - как столбцы таблиц.
Описание слайда:
Реляционные базы данных Базы данных состоят из таблиц, где каждая таблица состоит из строк (например, записей, элементов, объектов) и столбцов (например, атрибутов, полей), напоминая своей организацией электронные таблицы. Запросы к базе данных осуществляются с помощью языка SQL(Structured Query language). Платформа Django содержит мощную систему ORM, которая классы представляет как таблицы, объект - как отдельные строки внутри этих таблиц, а атрибуты объектов - как столбцы таблиц.

Слайд 4


Django. Уровни в Django, слайд №4
Описание слайда:

Слайд 5





Уровни в Django
Мodel — часть, касающаяся доступа к данным; соответствует уровню работы с базой данных;
View - часть, касающаяся решения о том, что и как отображать, соответствует представлениям и шаблонам;
Сontroller - часть, которая передает управление некоторому представлению в зависимости от того, что ввел пользователь, реализована самим фреймворком; говорит, какую функцию представления вызывать для данного URL.
Описание слайда:
Уровни в Django Мodel — часть, касающаяся доступа к данным; соответствует уровню работы с базой данных; View - часть, касающаяся решения о том, что и как отображать, соответствует представлениям и шаблонам; Сontroller - часть, которая передает управление некоторому представлению в зависимости от того, что ввел пользователь, реализована самим фреймворком; говорит, какую функцию представления вызывать для данного URL.

Слайд 6





Уровни в Django
Мodel, уровень доступа к данным. Здесь сосредоточена вся информация о данных: как получить к ним доступ, как осуществлять контроль, каково их поведение, каковы отношения между данными.
Template (шаблон), уровень отображения. Здесь принимаются решения, относящиеся к представлению данных: как следует отображать данные на веб-странице или в ином документе.
View, уровень логики. Здесь расположена логика доступа к модели и выбора подходящего шаблона (или шаблонов). Это мост между моделями и шаблонами.
Описание слайда:
Уровни в Django Мodel, уровень доступа к данным. Здесь сосредоточена вся информация о данных: как получить к ним доступ, как осуществлять контроль, каково их поведение, каковы отношения между данными. Template (шаблон), уровень отображения. Здесь принимаются решения, относящиеся к представлению данных: как следует отображать данные на веб-странице или в ином документе. View, уровень логики. Здесь расположена логика доступа к модели и выбора подходящего шаблона (или шаблонов). Это мост между моделями и шаблонами.

Слайд 7





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

Слайд 8





Слабая связанность
У каждого компонента веб-приложения, созданного на базе Django, имеется единственное назначение, поэтому его можно изменять независимо от остальных компонентов. 
Есть возможность задействовать ту долю платформы Django, которая требуется, и заменять ее компоненты другими инструментами, которые лучше подходят для решения поставленных задач.
Описание слайда:
Слабая связанность У каждого компонента веб-приложения, созданного на базе Django, имеется единственное назначение, поэтому его можно изменять независимо от остальных компонентов. Есть возможность задействовать ту долю платформы Django, которая требуется, и заменять ее компоненты другими инструментами, которые лучше подходят для решения поставленных задач.

Слайд 9





Красивый URL
В Django невозможно породить конструкции типа:«index.php?func=user&subfunc=add&PHPSESSIONID=…» 
Имеется файл, в котором пишется список всех видов URL, которые привязываются к своим обрабатывающим функциям. Причем изменяемые части URL (id и тому подобные) передаются в обработчик в виде обычных параметров функции.
Описание слайда:
Красивый URL В Django невозможно породить конструкции типа:«index.php?func=user&subfunc=add&PHPSESSIONID=…»  Имеется файл, в котором пишется список всех видов URL, которые привязываются к своим обрабатывающим функциям. Причем изменяемые части URL (id и тому подобные) передаются в обработчик в виде обычных параметров функции.

Слайд 10





«Питоничность» Django
Использование краткого, но мощного синтаксиса.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Предпочтение явного перед неявным.
DRY – надо стараться исключать дублирование уже введенного в систему знания.
Описание слайда:
«Питоничность» Django Использование краткого, но мощного синтаксиса. Должен существовать один — и, желательно, только один — очевидный способ сделать это. Предпочтение явного перед неявным. DRY – надо стараться исключать дублирование уже введенного в систему знания.

Слайд 11





Django обладает немалым количеством уже написанных базовых вещей:
Django обладает немалым количеством уже написанных базовых вещей:
Сессии. Достаточно подключить в приложение нужный модуль, и в каждом запросе появится request.session, в которую можно класть любые данные, естественно, разные для каждого юзера.
Авторизация, поддерживающая: регистрацию, авторизацию, систему прав на объекты вашей модели данных, генерацию паролей, рассылку сообщений по e-mail.
Описание слайда:
Django обладает немалым количеством уже написанных базовых вещей: Django обладает немалым количеством уже написанных базовых вещей: Сессии. Достаточно подключить в приложение нужный модуль, и в каждом запросе появится request.session, в которую можно класть любые данные, естественно, разные для каждого юзера. Авторизация, поддерживающая: регистрацию, авторизацию, систему прав на объекты вашей модели данных, генерацию паролей, рассылку сообщений по e-mail.

Слайд 12





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

Слайд 13





Другие возможности Django
Подключаемая архитектура приложений, которыми можно компоновать целевую информационную систему.
Система фильтров (англ. middleware) для построения дополнительных обработчиков запросов.
Интернационализация приложений
Описание слайда:
Другие возможности Django Подключаемая архитектура приложений, которыми можно компоновать целевую информационную систему. Система фильтров (англ. middleware) для построения дополнительных обработчиков запросов. Интернационализация приложений

Слайд 14





Установка Django
Скачать Django можно отсюда: http://www.djangoproject.com/download/ 
Django работает с версиями Python 2.3 – 2.6
В системную переменную Path надо добавить(!) путь до Python
В командной строке из каталога Django вызываем: setup.py install
Проверка: в Python Shell
>>> import django
>>> django.VERSION
(1, 1, 2, 'final', 0)        #установка прошла успешно
Описание слайда:
Установка Django Скачать Django можно отсюда: http://www.djangoproject.com/download/ Django работает с версиями Python 2.3 – 2.6 В системную переменную Path надо добавить(!) путь до Python В командной строке из каталога Django вызываем: setup.py install Проверка: в Python Shell >>> import django >>> django.VERSION (1, 1, 2, 'final', 0) #установка прошла успешно

Слайд 15





Создание проекта
К системной переменной Path добавляем путь до django-admin.py;
В домашнем каталоге создаем папку, например, djangocode;
В командной строке из этого каталога вызываем: django-admin.py startproject mysite
В папке djangocode появилась папка mysite
Описание слайда:
Создание проекта К системной переменной Path добавляем путь до django-admin.py; В домашнем каталоге создаем папку, например, djangocode; В командной строке из этого каталога вызываем: django-admin.py startproject mysite В папке djangocode появилась папка mysite

Слайд 16





Проект
__init__.py. Пустой файл. Необходим для того, чтобы система рассматривала mysite как модуль Python. Обычно не изменяется.
manage.py. Позволяет запускать разные команды для администрирования сайта. Изменять не стоит. 
   Cmd: manage.py help
Описание слайда:
Проект __init__.py. Пустой файл. Необходим для того, чтобы система рассматривала mysite как модуль Python. Обычно не изменяется. manage.py. Позволяет запускать разные команды для администрирования сайта. Изменять не стоит. Cmd: manage.py help

Слайд 17





Проект
urls.py. URL для данного проекта. Вначале пуст.
settings.py. Файл настроек данного проекта. Здесь указывается, какая база данных используется, сколько хранятся cookies...
Описание слайда:
Проект urls.py. URL для данного проекта. Вначале пуст. settings.py. Файл настроек данного проекта. Здесь указывается, какая база данных используется, сколько хранятся cookies...

Слайд 18





Сервер разработки
Сервер разработки Django — это встроенный упрощенный веб-сервер, которым можно пользоваться в ходе разработки сайта. Он включен в состав Django для того, чтобы можно было быстро создать сайт, не отвлекаясь на настройку полноценного сервера.
   CMD: manage.py runserver
Описание слайда:
Сервер разработки Сервер разработки Django — это встроенный упрощенный веб-сервер, которым можно пользоваться в ходе разработки сайта. Он включен в состав Django для того, чтобы можно было быстро создать сайт, не отвлекаясь на настройку полноценного сервера. CMD: manage.py runserver

Слайд 19





Сервер разработки
Описание слайда:
Сервер разработки

Слайд 20





Сервер разработки
По умолчанию команда runserver запускает сервер разработки на порту 8000 и принимает запросы на соединения только с локального компьютера. 
    Cmd: manage.py runserver 8080
Задав также IP-адрес, вы разрешите серверу принимать запросы на соединение с другого компьютера. IP-адрес 0.0.0.0 разрешает серверу прослушивать все сетевые интерфейсы:
    Cmd: manage.py runserver 0.0.0.0:8000
   Теперь любой пользователь в локальной сети сможет увидеть ваш django-сайт, введя в адресной строке своего броузера ваш IP-адрес (например, http://192.168.1.103:8000/).
Чтобы узнать адрес своего компьютера в локальной сети:
    Cmd: ipconfig
Описание слайда:
Сервер разработки По умолчанию команда runserver запускает сервер разработки на порту 8000 и принимает запросы на соединения только с локального компьютера. Cmd: manage.py runserver 8080 Задав также IP-адрес, вы разрешите серверу принимать запросы на соединение с другого компьютера. IP-адрес 0.0.0.0 разрешает серверу прослушивать все сетевые интерфейсы: Cmd: manage.py runserver 0.0.0.0:8000 Теперь любой пользователь в локальной сети сможет увидеть ваш django-сайт, введя в адресной строке своего броузера ваш IP-адрес (например, http://192.168.1.103:8000/). Чтобы узнать адрес своего компьютера в локальной сети: Cmd: ipconfig

Слайд 21





Создание приложения
Cmd: manage.py startapp books
books/
 __init__.py 
models.py 
views.py
Описание слайда:
Создание приложения Cmd: manage.py startapp books books/ __init__.py models.py views.py

Слайд 22





Hello, world!
В views.py:
from django.http import HttpResponse
def hello(request):
    return HttpResponse('Hello, world!')
Необходимо сообщить Django, что при некотором URL должно активироваться представление hello.
Описание слайда:
Hello, world! В views.py: from django.http import HttpResponse def hello(request): return HttpResponse('Hello, world!') Необходимо сообщить Django, что при некотором URL должно активироваться представление hello.

Слайд 23





Конфигурация URL
Это оглавление сайта.
В urls(без комментариев): 
   from django.conf.urls.defaults import * 
   urlpatterns = patterns('', ) 
Привязка для представления hello:
   from django.conf.urls.defaults import * 
   from mysite.views import hello 
   urlpatterns = patterns('', ('^hello/$', hello), )
Описание слайда:
Конфигурация URL Это оглавление сайта. В urls(без комментариев): from django.conf.urls.defaults import * urlpatterns = patterns('', ) Привязка для представления hello: from django.conf.urls.defaults import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )

Слайд 24





Шаблоны
<html>
<head><title>Ordering notice</title></head> 
<body>
 <h1>Ordering notice</h1> 
<p>Dear {{ person_name }},</p>
<p> Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> 
<ul> 
{% for item in item_list %} 
    <li>{{ item }}</li> 
{% endfor %} 
</ul> 
</body>
</html>
Описание слайда:
Шаблоны <html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }},</p> <p> Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> </body> </html>

Слайд 25





Шаблоны
Информация, которая передается шаблону для отображения, называется контекстом.  Объект Context похож на словарь. Контекст заполняется либо автоматически(добавление - extra_context), либо самостоятельно(метод render, вспомогательная функция render_response)
Описание слайда:
Шаблоны Информация, которая передается шаблону для отображения, называется контекстом. Объект Context похож на словарь. Контекст заполняется либо автоматически(добавление - extra_context), либо самостоятельно(метод render, вспомогательная функция render_response)

Слайд 26





Шаблоны
>>> from django.template import Context, Template 
>>> t = Template('My name is {{ name }}.') 
>>> c = Context({'name': 'Stephane'}) 
>>> t.render(c) 
u'My name is Stephane.'
Описание слайда:
Шаблоны >>> from django.template import Context, Template >>> t = Template('My name is {{ name }}.') >>> c = Context({'name': 'Stephane'}) >>> t.render(c) u'My name is Stephane.'

Слайд 27





Шаблоны
from django.template import Template, Context
from django.http import HttpResponse 
import datetime 
def current_datetime(request): 
    now = datetime.datetime.now() 
    fp = open('/home/djangouser/templates/mytemplate.html') 
    t = Template(fp.read()) 
    fp.close() 
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)
Описание слайда:
Шаблоны from django.template import Template, Context from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() fp = open('/home/djangouser/templates/mytemplate.html') t = Template(fp.read()) fp.close() html = t.render(Context({'current_date': now})) return HttpResponse(html)

Слайд 28





Шаблоны
Загрузка
В settings.py:
TEMPLATE_DIRS = ( ‘G:/home/django/mysite/templates', )
from django.template.loader import get_template
#...
    t = get_template('current_datetime.html')
#...
Описание слайда:
Шаблоны Загрузка В settings.py: TEMPLATE_DIRS = ( ‘G:/home/django/mysite/templates', ) from django.template.loader import get_template #... t = get_template('current_datetime.html') #...

Слайд 29





Шаблоны
Тег Include
<html> <body> 
{% include "includes/nav.html" %} 
<h1>{{ title }}</h1> 
</body> </html>
Наследование
Тег {%block%} {% endblock %}
{% extends "base.html" %} – «дочерность»
Описание слайда:
Шаблоны Тег Include <html> <body> {% include "includes/nav.html" %} <h1>{{ title }}</h1> </body> </html> Наследование Тег {%block%} {% endblock %} {% extends "base.html" %} – «дочерность»

Слайд 30





Модели
from django.db import models 
class Publisher(models.Model): 
    name = models.CharField(max_length=30) 
    address = models.CharField(max_length=50) 
    website = models.URLField() 
class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 
class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author)   #многие ко многим
    publisher = models.ForeignKey(Publisher)       #один ко многим
    publication_date = models.DateField()
Описание слайда:
Модели from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) #многие ко многим publisher = models.ForeignKey(Publisher) #один ко многим publication_date = models.DateField()

Слайд 31





Модели
MIDDLEWARE_CLASSES = ( #'django.middleware.common.CommonMiddleware', #'django.contrib.sessions.middleware.SessionMiddleware', 
#'django.contrib.auth.middleware.AuthenticationMiddleware', ) 
INSTALLED_APPS = ( #'django.contrib.auth', #'django.contrib.contenttypes', #'django.contrib.sessions', 
#'django.contrib.sites', 
'mysite.books', )
Описание слайда:
Модели MIDDLEWARE_CLASSES = ( #'django.middleware.common.CommonMiddleware', #'django.contrib.sessions.middleware.SessionMiddleware', #'django.contrib.auth.middleware.AuthenticationMiddleware', ) INSTALLED_APPS = ( #'django.contrib.auth', #'django.contrib.contenttypes', #'django.contrib.sessions', #'django.contrib.sites', 'mysite.books', )

Слайд 32





Модели
manage.py validate – корректность задания модели
manage.py sqlall books – посмотреть, что передано в базу данных
manage.py syncdb – синхронизация моделей с базой данных
Описание слайда:
Модели manage.py validate – корректность задания модели manage.py sqlall books – посмотреть, что передано в базу данных manage.py syncdb – синхронизация моделей с базой данных

Слайд 33





Модели 
>>> from books.models import Publisher
>>> p1 = Publisher(name='Addison-Wesley', address='75 Arlington Street‘, website='http://www.apress.com/')
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.‘, website='http://www.oreilly.com/')
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
Publisher_list = Publisher.objects.filter(name = ‘O’Reilly’)
Описание слайда:
Модели >>> from books.models import Publisher >>> p1 = Publisher(name='Addison-Wesley', address='75 Arlington Street‘, website='http://www.apress.com/') >>> p1.save() >>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.‘, website='http://www.oreilly.com/') >>> p2.save() >>> publisher_list = Publisher.objects.all() >>> publisher_list [<Publisher: Publisher object>, <Publisher: Publisher object>] Publisher_list = Publisher.objects.filter(name = ‘O’Reilly’)

Слайд 34





Модели
class Author(models.Model): 
first_name = models.CharField(max_length=30) 
last_name = models.CharField(max_length=40) 
email = models.EmailField() 
def __unicode__(self): return '%s %s' % (self.first_name, self.last_name)
>>> from books.models import Author 
>>> author_list = Author.objects.all() 
>>> author_list [<Author: Mark Twain>]
Описание слайда:
Модели class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() def __unicode__(self): return '%s %s' % (self.first_name, self.last_name) >>> from books.models import Author >>> author_list = Author.objects.all() >>> author_list [<Author: Mark Twain>]

Слайд 35





Почему Django?
Python
Бесплатность
Разделение логики и представления
Диспетчер URL 
Шаблонизатор
ORM
Интерфейс администратора
Аутентификация и авторизация
Кэширование
Удобная интернационализация проектов
Работа с электронной почтой
Большое сообщество разработчиков, доступная документация.
Описание слайда:
Почему Django? Python Бесплатность Разделение логики и представления Диспетчер URL  Шаблонизатор ORM Интерфейс администратора Аутентификация и авторизация Кэширование Удобная интернационализация проектов Работа с электронной почтой Большое сообщество разработчиков, доступная документация.

Слайд 36





Google App Engine
Google предоставляет свои сервера
Ограничения:
Нет доступа на запись в файловую систему сервера. Единственный способ сохранять данные — внутреннее хранилище, нереляционная, высокомасштабируемая база данных.
Описание слайда:
Google App Engine Google предоставляет свои сервера Ограничения: Нет доступа на запись в файловую систему сервера. Единственный способ сохранять данные — внутреннее хранилище, нереляционная, высокомасштабируемая база данных.

Слайд 37





Google
Google
Yandex
Youtube
Описание слайда:
Google Google Yandex Youtube

Слайд 38





Литература
[1] : Django - Разработка веб-приложений на Python (Джефф Форсье) [2009]
[2] : Django - Подробное руководство, 2-e издание (Адриан Головатый) (2010)
Описание слайда:
Литература [1] : Django - Разработка веб-приложений на Python (Джефф Форсье) [2009] [2] : Django - Подробное руководство, 2-e издание (Адриан Головатый) (2010)



Похожие презентации
Mypresentation.ru
Загрузить презентацию