Spec-Zone.ru › Django 4.0

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)

Здесь философия такова, что ваш сайт редактируется персоналом, клиентом или, возможно, только вами — и вам не нужно заниматься созданием интерфейсов back-end только для управления контентом.

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

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

Чистая и элегантная схема URL-адресов — важная деталь высококачественного веб-приложения. Django поощряет красивое проектирование URL-адресов и не добавляет ненужных элементов в 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/4.0/intro/overview/

Spec-Zone.ru

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