Время для чашки чая, начать разработку фреймворка Django

Python
Время для чашки чая, начать разработку фреймворка Django

Django — один из двух самых популярных веб-фреймворков в сообществе Python (второй — Flask). Благодаря мощным шаблонам и множеству готовых компонентов создание веб-приложений с помощью Django происходит быстро и без усилий. Однако именно потому, что он слишком силен, для его контроля требуется много усилий. Эта статья поможет вам быстро ознакомиться с фреймворком Django, внедрив веб-сайт публикации новостей, чтобы вы могли оседлать эту быструю лошадь и скакать на поле битвы веб-разработки.

намекать

Эта статья была написана с помощью Django версии 2.x, а версия 3.x уже была доступна на момент публикации. После авторского теста запуск Django 3.x в среде Python 3.7 приведет к тому, что администратор не сможет войти в систему. Вы можете перейти на Python 3.6 и ниже или установить Django 2.x.

Начало

Django был написан Адрианом Головатым и Саймоном Уиллисоном осенью 2003 года и официально выпущен в 2005 году. В то время они вдвоем делали веб-сайт для информационного агентства.быстрое развитиеИмеет относительно высокий спрос и надеется, что сможет развиваться в то же времяПозвольте нетехническим людям добавлять контент на сайт. Таким образом, это также делает Django двумя отличительными чертами:

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

Джанго получил свое название от гитариста Джанго Рейнхардта, произносится как JANG-goh (омоним «остроконечная собака»), но талисман Джанго на самом деле является крылатым пони.

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

Предварительные знания

В этом руководстве предполагается, что вы уже знаете:

  • Базовые знания языка Python 3, в том числе использование pip для установки пакетов
  • Понимать основы протокола HTTP, как взаимодействуют браузеры и серверы

цель обучения

После прочтения этого руководства вы усвоите суть фреймворка Django MTV:

  • M (модель): создание модели данных и выполнение миграции базы данных.
  • T (Шаблон): напишите базовый шаблон Django и передайте данные из представления.
  • V (представление): доступ к базе данных в представлении, реализация бизнес-логики, отображение шаблонов и доступ к таблице маршрутизации.

Хотя у Django все еще много очков знаний, после понимания MTV намного легче выучить следующие очки знаний.

Установите Django и включите скаффолдинг

В этой статье предполагается, что у вас установлены Python 3 и pip, поэтому вы можете установить Django напрямую с помощью pip:

pip install django
# 如果你用的是 Python 3.7,请安装 Django 2.2:
# pip install django==2.2

Не рекомендуется напрямую устанавливать Django глобально с помощью pip, и лучше всего использовать виртуальную среду. Чтобы снизить познавательную нагрузку для новичков, здесь упрощен процесс установки. Знаком сpipenvКонечно, старые водители, которые ждут инструментов виртуальной среды, могут использовать их сами.

После установки Django мы используем собственный инструмент создания шаблонов Django django-admin для создания проекта:

django-admin startproject django_news
cd django_news

Сгенерированный скелет проекта и роль каждого файла следующие:

django_news
├── django_news              // 项目全局文件目录
│   ├── __init__.py
│   ├── settings.py          // 全局配置
│   ├── urls.py              // 全局路由
│   └── wsgi.py              // WSGI服务接口(暂时不用纠结这个是神马)
└── manage.py                // 项目管理脚本

Мы используем manage.py для запуска сервера разработки:

python manage.py runserver

намекать

Если вы будете внимательны, вы увидите ярко-красную подсказку: У вас есть 17 непримененных миграций... (пропустите n символов). Не волнуйтесь, мы рассмотрим все тонкости в следующих шагах.

Следуем подсказкам, заходим через браузерlocalhost:8000, вы можете увидеть интерфейс приветствия:

намекать

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

Все готово, поводья в ваших руках!

Создайте свое первое пользовательское приложение Django

Как мы упоминали в предыдущем разделе, Django оченьмодульныйс кадр. В частности, приложение Django состоит из нескольких подприложений, которые мы обычно называем приложением (обратите внимание, что мы часто говорим не мобильное приложение APP, а аббревиатуру приложения), как показано на следующем рисунке.

Категории приложений Django

Приложения Django обычно делятся на три категории (согласно источнику):

  • встроенный: То есть приложение, которое поставляется с фреймворком Django, включая admin (фоновое управление), auth (аутентификация), session (управление сеансами) и т. д.
  • настроить: приложение, используемое для реализации нашей собственной бизнес-логики, здесь мы создадим приложение для отображения новостей.
  • третья сторона: То есть приложений, предоставляемых сообществом, чрезвычайно много, а их функции охватывают почти все аспекты, что может значительно снизить стоимость разработки.

Все приложения Django находятся в django_news/settings.py.INSTALLED_APPSОпределено в списке:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Внедрение пользовательских приложений

Без лишних слов давайте создадим наше первое пользовательское приложение под названием новости:

python manage.py startapp news

Сгенерированная структура папок новостного приложения выглядит следующим образом:

news                     // news 应用目录
├── __init__.py          // 初始化模块
├── admin.py             // 后台管理配置
├── apps.py              // 应用配置
├── migrations           // 数据库迁移文件目录
│   └── __init__.py      // 数据库迁移初始化模块
├── models.py            // 数据模型
├── tests.py             // 单元测试
└── views.py             // 视图

В этом подкаталоге на первый взгляд много файлов! Это потому, что Джанго всегда настаиваетразъединениеПринцип - свести к минимуму связь между кодами, разделить несвязанный код на несколько модулей и позволить одному и тому же модулю иметьсплоченность. Поверьте, после того, как вы с ним ознакомитесь позже, вы будете знать каждый модуль как свои пять пальцев.

На самом деле организационная структура каждого приложения Django соответствует закону MTV Django — Model (модель) + Template (шаблон) + View (представление). По своей сути MTV очень похож на знакомый MVC, но названия совершенно другие, как показано в следующей таблице:

Всем известный View представляет бизнес-логику в Django, то есть контроллер в MVC!

Добавить пользовательское приложение в глобальную конфигурацию

Наконец, мы добавляем новостное приложение в settings.py.INSTALLED_APPSсередина:

# ...

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'news',
]

На данный момент мы создали наше первое приложение Django! Но в этом приложении пока нет контента, и мы будем постепенно улучшать это приложение.

Понимание представлений: написание бизнес-логики

Возможно, вы заметили это, посетивlocalhost:8000/adminК фоновой системе управления уже можно получить доступ (хотя она перейдет к интерфейсу входа в систему). Затем мы также хотим иметь доступ к новостному приложению, которое мы только что создали. Поэтому на этом шаге мы:

  • Напишите немного бизнес-логики в представлении (View)
  • маршрут доступа, чтобы к нему можно было получить доступ

Система маршрутизации Django

Система маршрутизации Djangoглобальная маршрутизацияиМаршрутизация подприложенийсочинение. Проще говоря, в соответствии с URL-адресом, введенным пользователем, глобальная таблица маршрутизации сопоставляется и выбирает правильный маршрут субприложения, а затем выбранный маршрут субприложения соответствует и выбирает правильное представление (View). Весь процесс показан на рисунке ниже:

Например, когда пользователь обращается к example.com/apple/buy, глобальный маршрут сначала выбирает таблицу маршрутизации Apple в соответствии с /apple/buy, затем выбирает маршрут /buy из таблицы маршрутизации Apple в соответствии с /buy, а затем выполняет Представление BuyView, соответствующее /buy, возвращает результат пользователю.

напишите первый взгляд

После того, как у нас есть общее представление о процессе доступа к просмотру, мы можем приступить к работе. Сначала откройте news/views.py и напишите простую функцию просмотра, которая возвращает строку Hello World!:

from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello World!')

выше этогоindexМожно сказать, что эта функция является простейшей функцией представления, а фактическое представление большинства приложений намного сложнее, чем это. Джанго поддерживает обафункциональный вид(FBV, представление на основе функций) ипредставление на основе классов(CBV, представление на основе классов), которое здесь явно является FBV, получаетrequestОбъект запроса в качестве параметра возвращаетHttpResponseобъект.

Подключить представление к маршруту

Затем нам нужно разрешить системе маршрутизации доступ к функции просмотра, которую мы только что написали. Поэтому сначала реализуйте таблицу маршрутизации новостей подприложения и создайте файл news/urls.py следующим образом:

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

Каждый модуль таблицы маршрутизации Django (urls.py) должен содержать соглашениеurlpatternsСписок используется для хранения таблицы отображения маршрутизации. Каждый элемент списка являетсяdjango.urls.pathКарта маршрутов, инкапсулируемая функцией, обычно получает следующие три параметра:

  • route: требуется, то есть фактический маршрут доступа, пустая строка равна/, пустой маршрут
  • view: требуется, представление, к которому будет обращаться этот маршрут
  • name: необязательно, название маршрута, удобное для последующего использования в шаблоне

Мы подключим только что написанную таблицу маршрутизации новостей к глобальной таблице маршрутизации. Так как мы хотим, чтобы новости отображались на главной странице (т.е. через/можно получить доступ без/news), поэтому URL-адрес маршрута новостного приложения в глобальном маршруте представляет собой пустую строку. Измените django_news/urls.py следующим образом:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('news.urls')),
]

использовать здесьdjango.urls.includeФункция обращается к таблице маршрутизации новостного приложения иincludeАргумент функции — строка пути к модулю маршрута.news.urls, устраняя необходимость в ручномimportБеда.

Уведомление

Порядок важен при добавлении правил маршрутизации, потому что попытки сопоставления выполняются сверху вниз, поэтому наиболее неоднозначные маршруты (т. е. пустые маршруты) следует размещать внизу.

Если ваш сервер разработки все еще работает (если нет, вы можете открыть его снова), посетитеlocalhost:8000, вы можете увидеть строку знакомых символов:

Понимание шаблонов: реализация веб-интерфейса

На предыдущем шаге мы узнали, как реализовать представление и поместить его в конфигурацию маршрутизации, чтобы пользователи могли получить к нему доступ. Далее мы реализуем шаблон Django в качестве внешнего интерфейса веб-страницы, чтобы предоставить пользователю более богатый контент.

намекать

Если у вас есть опыт разработки других шаблонов (или аналогичных технологий), таких как Jinja, EJS или JSP и т. д., шаблоны Django покажутся вам знакомыми. Если вы не знаете, что такое механизм шаблонов, не волнуйтесь, простое понимание — это шаблон, который может заполнять контент и даже добавлять логику кода.Аналогично HTML-документам, который в конечном итоге будет преобразован в документ HTML, который сможет распознать браузер.

Основы языка шаблонов Django

Шаблон Django — это, по сути, HTML-документ, но заполненный данными с помощью специального синтаксиса. Здесь мы объясним три наиболее часто используемых синтаксиса:

Интерполяция выражений

Наиболее часто используемый синтаксис, никто. заключив пару фигурных скобок{{}}Поместив выражение, вы можете передать содержимое переменной в выражении в представление и, наконец, отобразить его в коде HTML, содержащем конкретное содержимое переменной. Следует отметить, что поддерживаемые выражения поддерживают только следующие формы (которые можно свободно комбинировать):

<!-- 单个变量 -->
{{ variable }}

<!-- 获取字典的键或对象的属性 -->
{{ dict.key }}
{{ object.attribute }}

<!-- 获取列表中的某个元素 -->
{{ list.0 }}

Например, шаблон пишется так:

<h1>{{ name }}</h1>
<p>{{ news.title }}</p>
<p>{{ news.visitors.0 }}</p>

Если мы перейдем в следующий контекстный словарь в представлении:

{
    'name': 'Tuture',
    'news': {
        'title': 'Hello World',
        'visitors': ['Tom', 'Marc'],
    }
}

Тогда окончательный отображаемый HTML-код:

<h1>Tuture</h1>
<p>Hello World</p>
<p>Tom</p>

Условные операторы

Условный оператор определяется следующим образом:

{% if is_true %}
  <h1>It is true!</h1>
{% else %}
  <h1>It is false!</h1>
{% endif %}

если переменнаяis_trueверно, то окончательный рендеринг<h1>It is true!</h1>, иначе это<h1>It is false!</h1>. Примечание: весь условный оператордолженот{% endif %}конец, и{% else %}дапо желаниюиз.

оператор цикла

Оператор цикла используется для отображения содержимого произвольно длинного списка в шаблоне. Его синтаксис следующий:

{% for elem in some_list %}
  <p>{{ elem }}</p>
{% endfor %}

Если входящийsome_listза['Apple', 'Banana', 'Orange'], то отображаемый HTML-код будет таким:

<p>Apple</p>
<p>Banana</p>
<p>Orange</p>

Реализовать первый шаблон Django

Когда придет время, давайте реализуем наш первый шаблон Django. Создайте каталог шаблонов в каталоге новостей, создайте каталог новостей в каталоге шаблонов и создайте файл index.html во внутреннем каталоге новостей:

mkdir -p news/templates/news
touch news/templates/news/index.html

считать

Звучит как хлопот, просто создайтеnews/templates, а затем поместите в него шаблон, так зачем создавать еще один каталог новостей? Это связано с тем, что механизм поиска шаблонов Django будет собирать все шаблоны во всех приложениях вместе.Если имена двух шаблонов конфликтуют, один из шаблонов не будет доступен правильно. Если вы поместите его в подпапку новостей, вы можете пройтиnews/index.htmlдоступ черезПространства именМеханизм предотвращения конфликтов.

Код шаблона выглядит следующим образом:

{% if news_list %}
  <ul>
  {% for elem in news_list %}
    <li>
      <h3>{{ elem.title }}</h3>
      <p>{{ elem.content }}</p>
    </li>
  {% endfor %}
  </ul>
{% else %}
  <p>暂无新闻</p>
{% endif %}

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

После того, как мы закончили писать шаблон, мы хотим отобразить его в представлении. Откройте файл news/views.py и измените код следующим образом:

from django.shortcuts import render


def index(request):
    context = {
        'news_list': [
            {
                "title": "图雀写作工具推出了新的版本",
                "content": "随随便便就能写出一篇好教程,真的很神奇",
            },
            {
                "title": "图雀社区正式推出快速入门系列教程",
                "content": "一杯茶的功夫,让你快速上手,绝无担忧",
            },
        ]
    }

    return render(request, 'news/index.html', context=context)

Здесь мы звонимdjango.shortcuts.renderдля рендеринга шаблона, эта функция обычно принимает три параметра (есть и другие, но нам здесь все равно):

  • request: объект запроса, прямо указать параметры представленияrequestПросто передай это
  • template_name: Имя шаблона, вот что мы только что создалиnews/index.html
  • context: объект контекста, переданный в шаблон, должен быть словарем, каждый ключ в словаре соответствует переменной в шаблоне. Здесь у нас есть фальшивые данные, притворяющиеся взятыми из базы данных.

вернутьсяlocalhost:8000, и посмотрите, есть ли контент на нашей домашней странице:

Идеально!

Понимание модели: связь с базой данных

Django's MTV, мы говорили о T (Шаблон) и V (Вид), и теперь мы подошли к последнему уровню: M (Модель). Модель данных представляет собой самую большую трудность в начале работы с Django. Требуется немного усилий, чтобы усвоить содержание этого шага, но поверьте мне, когда вы пройдете последний уровень M, вы действительно сможете приступить к разработке Django! Давайте сначала представим дизайн модели данных Django.

Дизайн моделей данных Django является образцовым, вот некоторые основные моменты:

  • Благодаря сильно развязанной конструкции можно легко переключаться между различными реляционными базами данных (SQLite по умолчанию, дополнительные MySQL, PostgreSQL, Oracle и т. д.).
  • Мощный модуль ORM (отображение отношений объектов) упрощает работу с базой данных с помощью Python, устраняя проблемы с использованием SQL.
  • Отличный механизм миграции базы данных (Migration), более удобно изменять схему данных (Schema) и можно адаптировать к изменяющимся функциональным требованиям.

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

Понимание ORM

Проще говоря, ORM может преобразовывать объектно-ориентированный код в соответствующие операторы SQL для работы с базой данных. SQL является стандартным компьютерным языком для доступа к базам данных и их обработки, но очевидно, что его сложно поддерживать, когда он написан непосредственно в коде, и требования к пользователям также очень высоки, а эффективность запросов плохо написанного кода SQL очень низка. Таким образом, использование хорошо спроектированной ORM не только делает код более читабельным, но и помогает разработчикам выполнять оптимизацию запросов и экономит много усилий.

Давайте посмотрим на несколько простых примеров Django ORM:

# 查询所有模型
# 等价于 SELECT * FROM Blog
Blog.objects.all()

# 查询单个模型
# 等价于 SELECT * FROM Blog WHERE ID=1
Blog.objects.get(id=1)

# 添加单个模型
# 等价于 INSERT INTO Blog (title, content) VALUES ('hello', 'world')
blog = Blog(title='hello', content='world')
blog.save()

Считаете ли вы, что работать с ним гораздо удобнее, чем с SQL?

Общие сведения о миграции базы данных

Миграция базы данных означает преобразование модели, определенной в Django, в код SQL (т. е. файл миграции) и создание таблицы (или обновление таблицы) в базе данных. Просто посмотрите на картинку ниже:

Общий процесс разработки выглядит так:

  1. Определил новую модель данных с Django
  2. использоватьmakemigrationsкоманда для создания файла миграции (хранится в каталоге миграции вложенного приложения)
  3. использоватьmigrateкоманда для выполнения миграции
  4. Модель, определенная на шаге 1, оказывается неполной во время разработки, обновите модель данных.
  5. Перейти к шагу 2 и повторить цикл

Реализовать первую модель данных

Наконец наступила практическая часть. Сначала мы определяем модель данныхPost, включая заголовокtitleполя иcontentполе, код выглядит следующим образом:

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()

    def __str__(self):
        return self.title

После определения выполните следующую команду, чтобы создать файл миграции:

python manage.py makemigrations

Вы можете увидеть вывод следующим образом:

Migrations for 'news':
  news/migrations/0001_initial.py
    - Create model Post

И автоматически успешно создал скрипт миграции news/migrations/0001_initial.py. Затем мы выполняем миграцию базы данных:

python manage.py migrate

Результат показан ниже:

После завершения миграции базы данных мы можем создать суперпользователя для входа в фоновое управление:

python manage.py createsuperuser

Следуйте инструкциям, чтобы ввести имя пользователя и пароль. затем посетитеlocalhost:8000/admin, войдите на страницу входа в фоновую систему:

Введите имя пользователя и пароль, которые вы только что установили, и войдите на страницу управления фоном:

Эй, куда делись новостное приложение, которое мы только что создали, и модель Post?

Настройка интерфейса фонового управления

Это потому, что мы не реализовали интерфейс фонового управления новостного приложения. Заполните код в news/admin.py следующим образом:

from django.contrib import admin

from .models import Post

admin.site.register(Post)

Снова войдя в систему управления фоном, вы можете увидеть наше новостное приложение и модель Post:

Нажмите кнопку «+Добавить» в столбце «Сообщения», чтобы начать добавлять новости (необязательно):

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

Добавить запрос данных в представление

Наконец, мы добавляем в представление код для запроса из базы данных:

from django.shortcuts import render

from .models import Post


def index(request):
    context = { 'news_list': Post.objects.all() }
    return render(request, 'news/index.html', context=context)

Посетите домашнюю страницу веб-сайта, вы можете увидеть новости, только что добавленные в систему управления фоном:

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

Надеемся, что это руководство дало вам общее представление о некоторых наиболее важных концепциях и операциях Django. В Django также есть много-много продвинутых способов игры, таких как расширенные запросы в модели данных, индексация полей, замена базы данных и т. д., механизм наследования в шаблонах, внутренние теги и т. д., а также способы обработки различных запросов (POST, PUT и т. д.) в представлении ), мы объясним вам это один за другим в последующих уроках, скоро увидимся!

Хотите узнать больше интересных практических технических руководств? ПриходитьСообщество ТукеМагазин вокруг.