Spec-Zone.ru › Django 3.2

Django в обзоре

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

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

Проектирование модели

Хотя вы можете использовать Django без базы данных, в нем реализован объектно-реляционный маппер, в котором вы описываете структуру базы данных на языке Python.

Синтаксис модели данных предлагает множество способов представления ваших моделей — до сих пор он успешно решал проблемы со схемой базы данных, которые возникали на протяжении многих лет. Вот быстрый пример:

mysite/news/models.py
from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

Установка

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

$ python manage.py makemigrations
$ python manage.py migrate
...\> py manage.py makemigrations
...\> py manage.py migrate

Команда makemigrations анализирует все доступные модели и создает миграции для тех таблиц, которых еще нет. migrate выполняет миграции и создает таблицы в вашей базе данных, а также по желанию обеспечивает более гибкое управление схемой.

Используйте бесплатный API

В результате у вас есть бесплатный и богатый Python API для доступа к данным. API создается динамически, без необходимости генерации кода:

# Import the models we created from our "news" app
>>> from news.models import Article, Reporter

# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.
>>> r.save()

# Now it has an ID.
>>> r.id
1

# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'

# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Reporter matching query does not exist.

# Create an article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()

# Delete an object with delete().
>>> r.delete()

Динамичный интерфейс администратора: это не просто шаблон — это целое здание

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

mysite/news/models.py
from django.db import models

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
mysite/news/admin.py
from django.contrib import admin

from . import models

admin.site.register(models.Article)

Философия заключается в том, что вашим сайтом пользуется персонал, клиенты или, возможно, только вы, и вам не нужно создавать интерфейсы на стороне сервера только для управления контентом.

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

Проектирование URL-адресов

Чистая и элегантная схема URL-адресов является важным элементом качественного веб-приложения. Django поощряет разработку красивых URL-адресов и не включает в них бесполезные компоненты, такие как .php или .asp.

Для проектирования URL-адресов приложения вы создаете модуль Python, называемый URLconf. Он представляет собой оглавление вашего приложения и содержит отображение между шаблонами URL-адресов и функциями обратного вызова Python. URLconf также служит для развязки URL-адресов от кода Python.

Вот как может выглядеть URLconf для примера Reporter/Article выше:

mysite/news/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]

В приведенном коде пути URL-адресов отображаются на функции обратного вызова Python («представления»). В строках путей используются теги параметров для «захвата» значений из URL-адресов. Когда пользователь запрашивает страницу, Django последовательно проверяет каждый путь и останавливается на первом совпадении с запрошенным URL-адресом. (Если ни один из них не соответствует, Django вызывает специальную функцию для обработки ошибок 404.) Это работает очень быстро, поскольку пути компилируются в регулярные выражения во время загрузки.

После совпадения одного из шаблонов URL Django вызывает указанную функцию представления, которая является функцией Python. Каждому представлению передается объект запроса — содержащий метаданные запроса — и значения, захваченные в шаблоне.

Например, если пользователь запросит URL «/articles/2005/05/39323/», Django вызовет функцию news.views.article_detail(request, year=2005, month=5, pk=39323).

Написание представлений

Каждое представление отвечает за выполнение одной из двух задач: Возврат объекта HttpResponse, содержащего содержимое запрошенной страницы, или поднятие исключения, такого как Http404. Остальное — на вашей совести.

Как правило, представление извлекает данные в соответствии с параметрами, загружает шаблон и отображает шаблон с извлеченными данными. Вот пример представления для year_archive из приведенного примера:

mysite/news/views.py
from django.shortcuts import render

from .models import Article

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

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

Проектирование шаблонов

В приведенном коде загружается шаблон news/year_archive.html.

Django имеет путь поиска шаблонов, который позволяет минимизировать дублирование шаблонов. В файле настроек Django вы указываете список каталогов для поиска шаблонов с помощью DIRS. Если шаблон отсутствует в первом каталоге, он проверяет второй и так далее.

Предположим, что шаблон news/year_archive.html был найден. Вот как он может выглядеть:

mysite/news/templates/news/year_archive.html
{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Переменные заключены в двойные фигурные скобки. {{ article.headline }} означает «Вывести значение атрибута заголовка статьи».

Но точки используются не только для поиска атрибутов. Они также могут выполнять поиск по ключам словарей, индексов и вызывать функции.

Обратите внимание, что {{ article.pub_date|date:"F j, Y" }} использует «трубу» в стиле Unix (символ «|»). Это так называемый фильтр шаблона, и это способ фильтрации значения переменной. В данном случае фильтр даты форматирует объект Python datetime в указанном формате (как в функции date PHP).

Вы можете объединить несколько фильтров. Вы можете написать собственные фильтры шаблонов. Вы можете написать собственные теги шаблонов, которые запускают пользовательский код Python в фоновом режиме.

Наконец, Django использует концепцию «наследования шаблонов». Именно это делает {% extends "base.html" %}. Это означает «Сначала загрузите шаблон с именем «base», в котором определены блоки, и заполните блоки следующими блоками». Короче говоря, это позволяет значительно сократить избыточность в шаблонах: каждый шаблон должен определять только то, что уникально для него.

Вот как может выглядеть шаблон «base.html», включая использование статических файлов:

mysite/templates/base.html
{% load static %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static 'images/sitelogo.png' %}" alt="Logo">
    {% block content %}{% endblock %}
</body>
</html>

Проще говоря, он определяет внешний вид сайта (с логотипом сайта) и предоставляет «отверстия», которые дочерние шаблоны должны заполнить. Это означает, что переработку сайта можно выполнить, изменив один файл — базовый шаблон.

Это также позволяет создавать несколько версий сайта с разными базовыми шаблонами, повторно используя дочерние шаблоны. Создатели Django использовали эту технику для создания существенно различных мобильных версий сайтов путем создания нового базового шаблона.

Обратите внимание, что вам не обязательно использовать систему шаблонов Django, если вы предпочитаете другую систему. Хотя система шаблонов Django особенно хорошо интегрирована с уровнем моделей Django, ничего не заставляет вас ее использовать. Так же, как вам не обязательно использовать API базы данных Django. Вы можете использовать другой уровень абстракции базы данных, читать файлы XML, читать файлы с диска или что-то другое. Каждая часть Django — модели, представления, шаблоны — отделена от следующей.

Это лишь верхушка айсберга

Это был лишь краткий обзор функциональности Django. Некоторые другие полезные функции:

  • Фреймворк кэширования, который интегрируется с memcached или другими бэкендами.
  • Фреймворк синдикации, который позволяет создавать ленты RSS и Atom путем написания небольшого класса Python.
  • Более привлекательные автоматически сгенерированные функции администратора — этот обзор лишь поверхностно коснулся этой области.

Следующие шаги — скачать Django, прочитать учебное пособие и присоединиться к сообществу. Спасибо за интерес!

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/intro/overview/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API