Upload
others
View
33
Download
0
Embed Size (px)
Citation preview
Python & Pycharm & Django (Pycharm Professional - для веб-разработки)
ТНК
2019
1
Python. Создание классов и объектов
Создание класса в Python начинается с инструкции class. Вот так будет выглядеть минимальный класс.
class C: pass
Класс состоит из: – объявления (инструкция class), – имени класса (нашем случае это имя C) и – тела класса, которое содержит атрибуты и методы (в нашем
минимальном классе есть только одна инструкция pass).
2
• Для того чтобы создать объект класса необходимо воспользоваться следующим синтаксисом:
имя_объекта = имя_класса() • Класс может содержать атрибуты и методы. Ниже
представлен класс, содержащий атрибуты color(цвет), width (ширина), height (высота).
class Rectangle: color = “green” width = 100 height = 100
3
Доступ к атрибуту класса можно получить следующим образом.
имя_объекта.атрибут
rect1 = Rectangle()
print(rect1.color)
4
Добавим к нашему классу метод.
Метод – это функция находящаяся внутри класса, выполняющая определенную работу, которая, чаще всего, предполагает доступ к атрибутам созданного объекта.
Например, нашему классу Rectangle, можно добавить метод, считающий площадь прямоугольника. Для того, чтобы метод в классе знал, с каким объектом он работает (это нужно для того, чтобы получить доступ к атрибутам: ширина (width) и высота (height)), первым аргументом ему следует передать параметр self, через который он может получить доступ к своим данным.
class Rectangle:
color = "green"
width = 100
height = 100
def square(self):
return self.width * self.height
5
Тогда, конечная программа, демонстрирующая работу с атрибутами и методами, будет выглядеть так:
class Rectangle: color = "green" width = 100 height = 100 def square(self): return self.width*self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect2 = Rectangle() rect2.width = 200 rect2.color = "brown" print(rect2.color) print(rect2.square())
6
Конструктор класса
• Конструктор класса позволяет задать определенные параметры объекта при его создании. Таким образом появляется возможность создавать объекты с уже заранее заданными атрибутами.
• Конструктором класса является метод: __init__(self)
• Например, для того, чтобы иметь возможность задать цвет, длину и ширину прямоугольника при его создании, добавим к классу Rectangle следующий конструктор:
7
class Rectangle: def __init__(self, color="green", width=100, height=100): self.color = color self.width = width self.height = height def square(self): return self.width * self.height rect1 = Rectangle() print(rect1.color) print(rect1.square()) rect1 = Rectangle("yellow", 23, 34) print(rect1.color) print(rect1.square())
8
Наследование
• В организации наследования участвуют как минимум два класса: класс родитель и класс потомок. При этом возможно множественное наследование, в этом случае у класса потомка есть несколько родителей. Не все языки программирования поддерживают множественное наследование, но в Python можно его использовать.
• Синтаксически создание класса с указанием его родителя/ей выглядит так: class имя_класса(имя_родителя1, [имя_родителя2,…, имя_родителя_n])
• Доработаем наш пример так, чтобы в нем присутствовало наследование.
9
class Figure: def __init__(self, color): self.color = color def get_color(self): return self.color class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width*self.height rect1 = Rectangle("blue") print(rect1.get_color()) print(rect1.square()) rect2 = Rectangle("red", 25, 70) print(rect2.get_color()) print(rect2.square())
10
В конструкторе ключевое слово super() используется как функция, вызывающая родительский конструктор.
Полиморфизм
• Полиморфизм, как правило, используется с позиции переопределения методов базового класса в классе наследнике.
• Проще всего это рассмотреть на примере. • Добавим в базовый класс метод info(), который печатает
сводную информацию по объекту класса Figure и переопределим этот метод в классе Rectangle, где добавим дополнительные данные и вывод.
11
class Figure: def __init__(self, color): self.color = color def get_color(self): return self.color def info(self): print("Figure") print("Color: " + self.color) class Rectangle(Figure): def __init__(self, color, width=100, height=100): super().__init__(color) self.width = width self.height = height def square(self): return self.width * self.height def info(self): print("Rectangle") print("Color: " + self.color) print("Width: " + str(self.width)) print("Height: " + str(self.height)) print("Square: " + str(self.square())) fig1 = Figure("green") print(fig1.info()) rect1 = Rectangle("red", 24, 45) print(rect1.info())
12
Создание и запуск первого проекта (web-приложения) Django
https://django.readthedocs.io/en/2.1.x/intro/tutorial02.html
Должны быть установлены Python и Pycharm Professional
13
Установите Python https://www.python.org/
14
Установите PyCharm Professional
Free individual licenses for students and faculty members
https://www.jetbrains.com/student/
15
Откройте Pycharm Professional
16
Документация по лекции
• https://www.jetbrains.com/help/pycharm/creating-and-running-your-first-django-project.html
17
Pycharm-Django Документация
18
Создайте новый проект
19
Зад
айте
пар
амет
ры
20
21
Что мы видим в представлении проекта?
• mysite Каталог - это контейнер для вашего проекта. В представлении проекта он обозначен жирным шрифтом.
• manage.py Это утилита командной строки, которая позволяет вам взаимодействовать с вашим проектом Django. Обратитесь к документации Django для деталей.
• Вложенный каталог mysite- это актуальный пакет Python для вашего проекта. • mysite/__init__.py: Этот пустой файл сообщает Python, что этот каталог следует
рассматривать как пакет Python. • mysite/settings.py: Этот файл содержит конфигурацию для вашего проекта Django . • mysite/urls.py: Этот файл содержит объявления URL для вашего проекта Django . • mysite/wsgi.py: Этот файл определяет точку входа для WSGI-совместимых веб-
серверов для обслуживания вашего проекта. Посмотрите, Как развернуть с WSGI для получения дополнительной информации.
22
Что мы видим в представлении проекта?
• Вложенный каталог polls содержит все файлы, необходимые для разработки приложения Django (на данный момент эти файлы пусты): – Опять же, polls/_init_.py говорит Python, что этот каталог должен рассматриваться как
пакет Python. – polls/models.py В этом файле мы создадим модели для нашего приложения. – polls/views.py В этом файле мы создадим представления .
• templates каталог сейчас пуст. Он должен содержать файлы шаблона. • Вложенный каталог на данный момент migrations содержит только файл
пакета _init_.py, но в будущем он будет использоваться для распространения изменений, которые вы вносите в свои модели (добавление поля, удаление модели и т. д.) в схему базы данных. Прочитайте описание миграций здесь .
• Обратите внимание, что вы можете создавать столько приложений Django, сколько вам нужно. Чтобы добавить приложение в проект, запустите startapp задачу manage.py утилиты ( задача « Инструменты (Tools) | Выполнить (Run) manage.py» , затем введите startapp в консоли).
23
Чтобы увидеть
все файлы
проекта:
24
Конфигурирование базы данных • Теперь, когда основа проекта готова, сделаем некоторую подстройку. • Откройте для редактирования settings.py. Для этого выберите файл в окне инструмента
«Проект» и нажмите F4. Файл открывается в собственной вкладке в редакторе. • Укажите, какую базу данных вы собираетесь использовать в своем приложении. • Для этого найдите DATABASES переменную: нажмите Ctrl+F, и в поле поиска начните вводить
искомое слово. • Затем в 'ENGINE'строке добавьте имя вашей системы управления базами данных после
точки (вы можете использовать любую, указанную после комментария, но для начала мы начнем с sqlite3.)
• В 'NAME'строке введите имя нужной базы данных, хотя она еще не существует.
25
Запуск сервера Django
• Поскольку мы сделали выбор sqlite3, нам не нужно определять другие значения (учетные данные пользователя, порт и хост).
• Давайте теперь проверим правильность наших настроек:
• запустите runserver задачу manage.py утилиты: – нажмите Ctrl+Alt+R и введите имя задачи в
manage.py консоли:
26
27
Ctrl+Alt+R
28
Создание моделей Откройте для редактирования файл models.py и обратите внимание, что оператор импорта уже существует. Затем введите следующий код:
from django.db import models
# the following lines added:
import datetime
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.DO_NOTHING,)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text 29
Создание базы данных проекта
Нужно создать таблицы для новой модели. Для этой цели мы будем использовать Ctrl+Alt+R для вызова manage.py консоли. Первая команда для выполнения makemigrations polls:
30
makemigrations polls
31
Созданные модели
Создан файл 0001_initial.py
32
manage.py@mysite > sqlmigrate pools 0001 С
озд
ани
е т
абл
иц
в Б
Д (
1)
33
manage.py@mysite > migrate
34
Со
здан
ие
таб
ли
ц в
БД
(2
)
Выполнение административных функций
Во-первых, создайте суперпользователя.
Для этого введите
createsuperuser команду в manage.py консоли, укажите свой
– адрес электронной почты и
– пароль
35
В аdmin.py появится запись:
36
Подготовка конфигурации запуска / отладки
На главной панели инструментов щелкните селектор конфигураций запуска / отладки и затем выберите «Edit Configurations» (или выберите «Run| Edit Configurations» в главном меню):
37
В диалоговом окне «Конфигурация запуска / отладки» присвойте этой конфигурации запуска / отладки имя (здесь оно есть mysite),
включите запуск приложения в браузере по умолчанию (установите флажок «Run browser» ) и укажите страницу сайта, которая будет открываться по умолчанию (вот эта страница http://127.0.0.1:8000/admin/)
38
Запуск админа сайта
Теперь, чтобы запустить приложение, нажмите Shift+F10
или щелкните на главной панели инструментов зеленую кнопку Run, чтобы открыть стандартную страницу входа на сайт Django
• Введите логин и пароль админа…
39
Страница администрирования
После входа отображается страница администрирования.
В ней есть раздел Аутентификация и авторизация (группы и пользователи) , но опросы недоступны. Почему так?
40
Что делать? • Нужно сообщить администратору,
что объекты Question имеют интерфейс администратора;
• для этого откроем файл polls/admin.py для редактирования (выберите его в представлении «Project» и нажмите F4) и введите следующий код:
41
from django.contrib import admin from .models import Question #this line added admin.site.register(Question)#this line added
В браузере обновите страницу и создайте опрос (+Add):
42
Редактирование admin.py
• у каждого вопроса есть несколько вариантов ответов, но они по-прежнему недоступны.
• Снова откройте для редактирования файл polls/admin.py и измените его следующим образом:
43
polls/admin.py from django.contrib import admin
from .models import Choice, Question
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 4
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]
admin.site.register(Question, QuestionAdmin)
44
Теперь откройте и посмотрите страницу
изменения вопроса (Change)
и заполните поля
вариантов ответов - Save
45
Написание представлений views
Откройте файл polls/views.py для редактирования и введите следующий код Python:
46
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")
Затем создайте новый файл в polls каталоге с именем urls.py
и введите следующий код:
47
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
Затем откройте для редактирования файл mysite/urls.py (который PyCharm уже создал для вас) и добавьте URL для страницы индекса.
Вы должны ввести следующий код:
48
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^pools/', include('pools.urls')), #this line added url(r'^admin/', admin.site.urls), ]
Теперь откройте страницу 127.0.0.1:8000/polls/
49
Добавим больше просмотров в файл polls/views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
50
Подключите новые представления в polls/urls.py
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]
51
Если вы откроете соответствующие страницы в браузере, то увидите, например:
52
Создание шаблонов Django. Замените содержимое polls/views.py следующим кодом:
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Question, Choice
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'pools/index.html', context)
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'pools/detail.html', {'question': question})
def results(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'pools/results.html', {'question': question}) def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'pools/detail.html', { 'question': question, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('pools:results', args=(question.id,)))
53
Кликните по файлу html. Появится лампочка. Если вы щелкнете по лампочке или нажмете Alt+Enter, соответствующий файл шаблона будет создан в папке
шаблонов. Или используйте команду выпавшего меню
54 Сделайте это для всех указанных html файлов в коде views.py
На данный момент файл index.html пуст. Добавьте в него следующий код :
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'pools/style.css' %}" />
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
55
Создание таблицы стилей Как вы можете видеть в файле index.html, есть ссылка на таблицу стилей style.css, но его пока нет: Решите эту проблему следующим образом: 1. Создайте каталог. Для этого в представлении
«Project» выберите приложение pools и нажмите Alt+Insert.
2. В появившемся всплывающем меню выберите « Directory»
3. и укажите имя структуры каталога static/polls. 4. Затем создайте таблицу стилей в этом
каталоге. Для этого выберите самый внутренний каталог polls, нажмите Alt+Insert, выберите опцию « Stylesheet» и введите имя файла css в открывшемся диалоговом окне.
5. Предоставьте некоторое содержимое для созданной таблицы стилей, в зависимости от ваших предпочтений. Например, мы хотели бы видеть маркированный список вопросов, окрашенных в зеленый цвет:
56
1-2 3
4
5
li a { color: green; }
Добавим url в файл pools/urls.py:
# ... urlpatterns = patterns('', # ... url(r'^(?P<pk>\d+)/$', PoolDetailView.as_view(), name='detail'), ) </pk>
57
Это значит, что представление PollDetailView будет вызываться, когда пользователь переходит, к примеру, по адресу: http://127.0.0.1:8000/polls/1
Добавим представление в файле polls/views.py:
# -*- coding: utf-8 -*- from django.shortcuts import render from django.views.generic import ListView, DetailView from .models import Question, Answer # ... class QuestionDetailView(DetailView): model = Question template_name = 'pools/detail.html'
58
Здесь мы создали класс представления, который расширяет встроенный в django класс DetailView, содержащий нужный функционал для отображения страницы.
• Детальное представление опроса должно быть формой с радиокнопками,
чтобы ответ пользователя можно было отправить на определенный url, при обращению к которому будет вызвано представление, где данные запишутся в БД.
• Обратите внимание на выражение: question.answer_set.all Вот таким образом в шаблоне можно получить список всех элементов связанной таблицы. В нашем случае у каждого Вопроса есть несколько Ответов. При помощи приведенного выражения мы можем по экземпляру вопроса получить список соответствующих ему ответов.
59
Создадим шаблон с радиокнопками по адресу poоls/templates/pools/detail.html:
<h1>{{ question.title }}</h1> {% if error_message %} <p><strong>{{ error_message }}</strong></p> {% endif %} <form action="" method="post"> {% csrf_token %} {% for answer in question.answer_set.all %} <input type="radio" name="answer" id="answer{{ forloop.counter }}" value="{{ answer.id }}" /> <label for="answer{{ forloop.counter }}">{{ answer.answer }}</label> {% endfor %} <input type="submit" value="Голосовать" /> </form>
60
Перейдем по адресу http://127.0.0.1:8000/poоls/ и посмотрим результат:
61
Опрос «Какой серверный…»
62
База данных проекта
63
64
65
База данных
66
Для тестирования приложения введите код в test.py
import datetime from django.urls import reverse from django.test import TestCase from django.utils import timezone from .models import Question def create_question(question_text, days): time = timezone.now() + datetime.timedelta(days=days) return Question.objects.create(question_text=question_text, pub_date=time) class QuestionViewTests(TestCase): def test_index_view_with_no_questions(self): """ If no questions exist, an appropriate message should be displayed. """ response = self.client.get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertContains(response, "No polls are available.") self.assertQuerysetEqual(response.context['latest_question_list'], [])
67
Решение проблем версий
• https://stackoverflow.com/questions/50116204/templatedoesnotexist-when-trying-to-override-template-name-in-detail-view
68
Рисуем графики
инструкция:
https://habr.com/post/126704/
69
https://www.highcharts.com/demo
70
Django + Charts
• https://www.fusioncharts.com/dev/getting-started/django/create-charts-in-django-using-database
• https://github.com/sikrigagan/Django-Charts
71
Примеры голосований
72 https://tproger.ru/news/python-developers-survey-2017/
Примеры голосований
73 https://tproger.ru/news/python-developers-survey-2017/
Проекты с кодом
• https://www.djangosites.org/with-source/
• https://bitbucket.org/pierangelo1982/fouremme_django/downloads/
Веб-приложение для электронной коммерции и блога с функциями аутентификации пользователя, PayPal Payments и Support Tickets.
• https://github.com/IreneG5/spss_online
74
• Подробное видео по созданию блога: https://www.youtube.com/watch?v=IZqBTPmxoew
75