Поймите Джанго (16 серии деталей)
В предыдущем Понять Джанго Статья, я освещал URL -адреса и разнообразие инструментов, которые Django дает нам для описания внешнего интерфейса в Интернете для вашего проекта. В этой статье мы рассмотрим основной строительный блок, который заставляет эти URL -адреса работать: представление Django.
Что такое вид?
Представление – это кусок кода, который получает HTTP -запрос и возвращает HTTP -ответ. Взгляды описывают всю цель Джанго: ответить на запросы, представленные в приложении в Интернете.
Вы можете заметить, что я немного расплывчаюсь на «кусок кода». “Это было преднамеренно. Причина в том, что взгляды бывают разных форм. Чтобы вызвать представления функции будет только частью истории. Называть их классы была бы другая глава в истории.
Даже если я попытался вызвать представления Callables, Я все еще не изобразил бы их точно из -за способов, которыми определенные типы представлений подключаются к приложению Django.
Давайте начнем с функций, так как я думаю, что они являются самым джентльменным введением в взгляды.
Функциональные представления
Вид функции именно такого, функция. Функция принимает экземпляр Httprequest
как вход и возвращает Httpresponse
(или один из его многочисленных подклассов) в качестве вывода.
Классический пример «Hello World» будет выглядеть так, как указано ниже.
# application/views.py from django.http import HttpResponse def hello_world(request): return HttpResponse('Hello World')
Если вы добавили это представление в конфигурацию URL, о которой мы узнали в последней статье, то вы можете посетить браузер на URL и найти текст «Hello World» на странице браузера.
Может быть, вы не найдете это очень захватывающим, но я делаю, и я думаю, что вы должны! Структура сделала для нас так много работы, и Наш Работа состоит в том, чтобы написать просто пару линий Python. При подключении к веб -серверу в Интернете ваше приветствие может охватить любого, кто имеет доступ к сети. Это ошеломляет и стоит размышлять.
Джанго делает для нас большую часть тяжелой работы. Сырой HTTP -запрос аккуратно вписывается в Httprequest
класс. Наш пример представление не использует эту информацию, но она доступна, если нам это нужно. Точно так же мы не используем большую часть Httpresponse
, но он выполняет всю работу, чтобы убедиться, что она может появиться в браузере пользователя и доставить наше сообщение.
Чтобы увидеть, что мы можем сделать с взглядами, давайте внимательно посмотрим на Httprequest
и Httpresponse
чтобы получить представление о том, что происходит.
Httprequest
Httprequest
это класс Python. Экземпляры этого класса представляют HTTP -запрос. HTTP – это протокол передачи, который Интернет использует для обмена информацией. Запрос может быть в различных форматах, но стандартный запрос может выглядеть как:
POST /courses/0371addf-88f7-49e4-ac4d-3d50bb39c33a/edit/ HTTP/1.1 Host: 0.0.0.0:5000 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 155 Origin: http://0.0.0.0:5000 Connection: keep-alive Upgrade-Insecure-Requests: 1 Pragma: no-cache Cache-Control: no-cache name=Science &monday=on &tuesday=on &wednesday=on &thursday=on &friday=on
Этот пример из побочного проекта, который использует школьные данные. Я отрисовал некоторые строки из запроса, поэтому он будет лучше подходить на экране, и я сделал небольшое переформатирование, чтобы сделать контент немного яснее.
Когда Django получит такой запрос, он проанализирует данные и сохранит данные в Httprequest
пример. Запрос предоставляет удобный доступ ко всем частям необработанных данных с полезными атрибутами для наиболее часто используемых параметров. Учитывая пример, запрос будет иметь:
Метод
– Это соответствует методу HTTPПост
и может быть использован, чтобы действовать на добрый запроса пользователь отправил.content_type
– Этот атрибут инструктирует Джанго о том, как обрабатывать данные в запросе. Пример значения будетПриложение/X-WWW-FORM-URLENCODED
Чтобы указать, что это данные о подаче пользователя.Пост
– Для запросов POST Django обрабатывает данные формы и хранит данные в словаре, подобную структуре.запрос. Post ['name']
было быНаука
В нашем примере.Получить
– Для запроса GET, что -нибудь добавлено в строку запроса (то есть контент после?
персонаж, такой какСтудент = Мэтт
в/courses/? Студент = Мэтт
хранится и в словарном атрибуте.Заголовки
– Вот где все заголовки HTTP, такие какХост
,Принятие языка
и остальные хранятся.
Другие атрибуты доступны для Httprequest
, но этот список заставит вас начать работу.
Я также должен отметить, что Httprequest
Случай – это обычное место для прикрепления дополнительных данных. Запросы Джанго проходят через многие части в рамках. Это делает объекты отличными кандидатами для дополнительных функций, которые вам могут потребоваться. Например, если вам нужно управление пользователями (которое мы рассмотрим в будущей статье), то есть код, который может прикрепить request.user
Атрибут для представления пользователя в вашей системе. Это очень удобно
Мне нравится думать о Httprequest
объекты как общий интерфейс для большинства входов, которые использует мой код.
Httpresponse
Другой основной интерфейс, который ваши представления будут использовать прямо или косвенно, – это Httpresponse
интерфейс.
Ваша работа в качестве пользователя Django состоит в том, чтобы ваши взгляды вернули какое -то Httpresponse
Анкет Экземпляр ответа будет включать всю необходимую информацию для создания действительного ответа HTTP для браузера пользователя.
Некоторые из общих Httpresponse
Атрибуты включают:
status_code
– Это код состояния HTTP. Коды статуса – это набор чисел, которые HTTP определяет, чтобы сообщить клиенту (например, браузер) об успехе или неудаче запроса.200
это обычный код успеха. Любой номер от400
и UP будет указывать на некоторую ошибку, как404
когда что -то не найдено.Контент
– Это контент, который вы предоставляете пользователю. Ответ хранит эти данные как байты. Если вы поставляете данные Python String, Django будет кодировать байты для вас.
>>> from django.http import HttpResponse >>> response = HttpResponse('Hello World') >>> response.content b'Hello World'
Работая с просмоткой Django, вы не всегда будете использовать Httpresponse
напрямую. Httpresponse
имеет различные подклассы для общего использования. Давайте посмотрим на некоторые:
Httpresponsedirect
– Вы можете отправить пользователя на другую страницу. Возможно, пользователь купил что -то на вашем сайте, и вы хотели бы, чтобы он увидел страницу квитанции своего заказа. Этот подкласс идеально подходит для этого сценария.Httpresponsenotfound
– Это подкласс, используемый для создания404 не найден
отклик. Django предоставляет несколько вспомогательных функций, чтобы вернуть это, чтобы вы не могли использовать этот подкласс напрямую, но хорошо знать, что он доступен.Httpresponseforbidden
– Этот тип ответа происходит, когда вы не хотите, чтобы пользователь получил доступ к части вашего веб -сайта.JsonResponse
– Я еще не сосредоточился на JSON в этой серии, но это формат данных, который близко соответствует типам данных Python и может использоваться для общения с JavaScript.
>>> from django.http import JsonResponse >>> response = JsonResponse({'hello': 'world'}) >>> response.content b'{"hello": "world"}'
Помимо подклассов, у Джанго есть другие методы для возвращения Httpresponse
экземпляры, не создавая его самостоятельно. Наиболее распространенная функция – оказывать
.
рендер
это инструмент для работы с шаблонами. Шаблоны являются темой следующей статьи, но вот краткий обзор.
Вы можете написать представление на веб -страницу и включить много HTML в свой Python. HTML – это язык разметки интернет -страниц, который мы используем для описания формата страницы.
Этот взгляд может выглядеть как:
from django.http import HttpResponse def my_html_view(request): response_content = """Hello World! This is a demo.
""" return HttpResponse(response_content)
Хотя это работает, у него много недостатков.
- HTML -кусок не используется повторно используемыми другими взглядами. Это не имеет большого значения для этого небольшого примера, но это было бы огромной проблемой, когда вы пытаетесь сделать много просмотров, которые используют много наценки и должны поделиться общим видом.
- Смешивание Python и HTML станет грязным. Нужны доказательства? Посмотрите на историю вычисления и узнайте о CGI Анкет Это было не красиво.
- Как вы можете объединить куски HTML вместе? Нелегко.
С шаблонами мы можем отделить макет от логики.
# application/views.py from django.shortcuts import render def my_html_view(request): return render(request, "template.html", {})
И у нас будет еще один файл с именем Шаблон.html
Содержит:
Hello World! This is a demo.
Важная часть этой статьи не о самих шаблонах. Стоит отметить, что рендер
возвращает Httpreponse
экземпляр, который будет содержать визуализированный шаблон в качестве контента.
Что завершается Httprequest
и Httpresponse
Анкет С этими строительными блоками мы теперь можем посмотреть на другие способы, которыми вы можете просмотреть Django для вашего проекта.
Просмотреть классы
К настоящему времени мы видели эти отношения с взглядами:
HttpRequest -> view -> HttpResponse
Просмотры не должны быть функциями исключительно. Джанго также предоставляет инструменты для просмотра из классов. Эти типы представлений происходят из Джанго Просмотр
класс.
Когда вы пишете представление на основе класса (часто сокращается для CBV), вы добавляете методы экземпляра, которые соответствуют методам HTTP. Посмотрим пример:
# application/views.py from django.http import HttpResponse from django.views.generic.base import View class SampleView(View): def get(self, request, *args, **kwargs): return HttpResponse("Hello from a CBV!")
получить
Метод в классе соответствует Получить
Http -запрос. Точно так же вы бы написали Пост
Метод, чтобы ответить на Пост
Http -запрос и так далее. С определением этой точки зрения, мы можем подключить его к URLConf:
# project/urls.py from django.urls import path from application.views import SampleView urlpatterns = [ path("", SampleView.as_view()), ]
Обратите внимание, что мы не проходим SampleView
к Путь
как есть. Путь
Ожидает вызов, поэтому мы должны позвонить as_view
который является методом класса, который возвращает функцию, которая будет вызывать код в нашем классе.
На данный момент я был бы вполне не впечатлен, если бы я был на вашем месте. Зачем нам добавлять весь этот код шаблона, когда вы можете выполнять функцию и выполнять? Если бы это была полная история, я бы абсолютно согласился с вами. Это не добавляет ничего за пределами функциональной версии. Во всяком случае, это есть больше, чтобы помнить, что, вероятно, более запутанно.
Где просмотры на основе классов начинают сиять, когда используют некоторые другие классы за пределами начальных Просмотр
класс.
Django включает в себя множество классовых просмотров для использования для различных целей. Мы можем исследовать некоторые из них с нашим ограниченным воздействием полной структуры.
Из видов коробки
Я не буду исчерпывать все классные взгляды, потому что их много. Кроме того, если вы присоединяетесь к этой серии статьи с самого начала и никогда раньше не делали Django, то в ваших знаниях все равно будут отверстия (которые мы подключаем вместе!), И некоторые взгляды не будут иметь большого смысла.
RedirectView
Это то, что нужно использовать, когда вы хотите отправить пользователей вашего сайта в другое место. Ты мог Сделайте представление, которое возвращается а Httpresponsedirect
экземпляр, но этот класс на основе класса может справиться с этим для вас.
На самом деле, вы можете использовать RedirectView
без подкласса. Проверь это:
# project/urls.py from django.urls import path from django.views.generic.base import RedirectView from application.views import NewView urlpatterns = [ path("old-view-path/", RedirectView.as_view(url="https://www.somewhereelse.com")), path("other-old-path/", RedirectView.as_view(pattern_name='new-view')), path("new-path/", NewView.as_view(), name='new-view'), ]
RedirectView
может использовать URL
для полного URL или он может использовать pattern_name
Если вам нужно перейти к визу, который переместился где -то еще в вашем проекте.
as_view
Это то, что позволим нам избежать подкласса RedirectView
Анкет Аргументы переданы as_view
Переопределить любые атрибуты класса. Следующие два RedirectView
Использование эквивалентно:
# project/urls.py from django.urls import path from django.views.generic.base import RedirectView from application.views import NewView class SubclassedRedirectView(RedirectView): pattern_name = 'new-view' urlpatterns = [ path("old-path/", SubclassedRedirectView.as_view()), path("old-path/", RedirectView.as_view(pattern_name='new-view')), path("new-path/", NewView.as_view(), name='new-view'), ]
Шаблон
Ранее в статье мы кратко увидели, как мы можем отделить макет веб -страницы от логики, необходимой для создания страницы с шаблонами.
Шаблоны настолько часто используются, что Django предоставляет класс, который знает, как создать правильный ответ не более чем название шаблона.
Пример выглядит так:
# application/views.py from django.views.generic.base import TemplateView class HomeView(TemplateView): template_name = 'home.html'
Мы рассмотрим представления шаблонов более подробно в следующей статье, когда мы погрузимся в шаблоны.
Другие классы просмотра
Другие классовые взгляды Джанго служат различным целям. У Джанго есть взгляды, которые будут:
- Отображать и обрабатывать HTML -формы, чтобы пользователи могли вводить данные и отправлять данные в приложение.
- Вытащите данные из базы данных и покажите индивидуальную запись пользователю (например, веб -страницу, чтобы увидеть факты об отдельном фильме).
- Вытащите данные из базы данных и покажите информацию из коллекции записей для пользователя (например, показывая актеры актеров из фильма).
- Позвольте пользователю создавать или обновить данные, которые будут сохранены в базе данных.
- Покажите данные из определенных временных диапазонов, таких как дни, недели и месяцы.
Поскольку мы продолжаем исследовать Джанго, я расскажу об этих взглядах, когда их связанная тема (например, формы) является основной темой статьи. На данный момент, когда вы разрабатываете свои собственные взгляды, постарайтесь помнить, что у Джанго, вероятно, есть классный взгляд, чтобы помочь вашей работе.
Полезный вид декораторы и микшины
Прежде чем закончить экскурсию по видам, давайте обсудим несколько полезных декораторов и классов микшина.
Декораторы являются особенностью Python (и многих других языков), которые позволяют вам расширить функцию с дополнительными возможностями. Декоратор может обернуть функцию вида, чтобы обеспечить новое поведение для обзора. Это полезно, когда у вас есть общая функциональность, которую вы хотите добавить ко многим представлениям, не копируя и не вставляя много кода.
Classin Classin служит очень похожей цели в качестве декораторов, но ведут себя с множественной особенностью наследования Python классов, чтобы «смешать» новое поведение с существующим классом.
Декораторы Знать
Когда вы работаете с видами на основе функций, возникает проблема при обработке различных методов HTTP. Некоторые представления будут обрабатывать несколько методов, таких как:
# application/views.py from django.http import HttpResponse def multi_method_view(request): if request.method == 'GET': return HttpResponse('Method was a GET.') elif request.method == 'POST': return HttpResponse('Method was a POST.')
В этом представлении используется Запрос
экземпляр Метод
Атрибут для проверки метода HTTP запроса. Что если вы хотите, чтобы ваше представление ответило только на один метод HTTP? Допустим, вы хотите ответить только на пост. Мы могли бы написать:
# application/views.py from django.http import Http404, HttpResponse def guard_clause_view(request): if request.method != 'POST': raise Http404() return HttpResponse('Method was a POST.') # OR def if_clause_view(request): if request.method == 'POST': return HttpResponse('Method was a POST.') else: raise Http404()
Оба эти методы работают, но код немного грязный из -за дополнительного отступления. Вместо этого мы можем использовать reft_post
Декоратор и позвольте Джанго проверить метод для нас.
# application/views.py from django.http import HttpResponse from django.view.decorators.http import require_POST @require_POST def the_view(request): return HttpResponse('Method was a POST.')
В этой версии указывается ожидание заранее с декоратором и заявляет о контракте, с которым будет работать вид.
Другой общий декоратор, с которым вы можете столкнуться, – это Login_Required
декоратор. Когда мы доберемся до предмета управления пользователями, вы увидите, что мы сможем сделать защищенный представление для приложения, включив этот декоратор.
# application/views.py from django.contrib.auth.decorators import login_required from django.http import HttpResponse @login_required def the_view(request): return HttpResponse('This view is only viewable to authenticated users.')
Последний пример полезного встроенного декоратора- user_passes_test
Анкет Это еще один декоратор, используемый с системой управления пользователями, который позволяет нам контролировать который Пользователям должно быть разрешено получить доступ к представлению. Например, мы могли бы представить, что могут получить доступ только пользователи на уровне персонала.
# application/views.py from django.contrib.auth.decorators import user_passes_test from django.http import HttpResponse @user_passes_test(lambda user: user.is_staff) def the_view(request): return HttpResponse('Only visible to staff users.')
Декоратор принимает вызов, который примет один аргумент пользовательского объекта. Представление будет доступно только в том случае, если возвратное значение тестового вызова оценивается в Верно
Анкет
Я пытаюсь показать эти примеры, так это то, как отдельные декораторы могут быстро увеличить ваши взгляды новыми функциями. И из -за того, как декораторы работают, чтобы обернуть функции, вы можете «сложить» их вместе.
# application/views.py from django.contrib.auth.decorators import user_passes_test from django.http import HttpResponse from django.view.decorators.http import require_POST @require_POST @user_passes_test(lambda user: user.is_staff) def the_view(request): return HttpResponse('Only staff users may POST to this view.')
Микшины Знать
Классы Mixin представляют собой представления на основе классов, поскольку декораторы для просмотров на основе функций. Это не полностью Правда, поскольку взгляды на основе классов также могут использовать декораторы, но это должно дать вам представление о том, где подходят микшины.
Как Login_Required
и user_passes_test
Декораторы, у нас есть смешанные эквиваленты LoginRequiredMixin
и UserpassesteStmixin
. Возможно, у вас есть некоторые представления шаблона, которые должны быть доступны только для аутентифицированных пользователей или пользователей на уровне персонала. Эти взгляды могут выглядеть как:
# application/views.py from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.views.generic.base import TemplateView class HomeView(LoginRequiredMixin, TemplateView): template_name = 'home.html' class StaffProtectedView(UserPassesTestMixin, TemplateView): template_name = 'staff_eyes_only.html' def test_func(self): return self.request.user.is_staff
Вы можете видеть, что эти виды похожи на их коллеги декоратора с немного другим рисунком использования.
Одна вещь, которую стоит отметить с микминами, – это их размещение. Из -за того, как Python обрабатывает множественное наследство, вы должны обязательно включить классы Mixin слева в список классов. Это гарантирует, что Python будет вести себя надлежащим образом с этими классами.
Есть много других классов микшина. Фактически, большинство встроенных классовых просмотров Джанго построены путем составления различных классов микшина вместе. Если вы хотите посмотреть, как они построены, проверьте Классные классовые представления который представляет собой сайт, показывающий встроенные CBV, а также микшины и атрибуты, доступные для этих классов.
Резюме
Это обертка в поле зрения. Мы смотрели:
- Просмотреть функции
Httprequest
иHttpresponse
- Просмотреть классы
- Некоторые встроенные вспомогательные виды
- Декораторы и микшины, которые перегружают виды.
В следующей статье мы увидим, как просмотры могут смешивать статический макет с динамическими данными, которые мы предоставляем с помощью шаблонов. Шаблоны-это рабочая лошадка для ваших пользовательских интерфейсов на основе Django. Мы увидим:
- Как настроить шаблоны для вашего сайта
- Способы вызвать шаблоны из просмотров
- Как использовать данные
- Как справиться с логикой
- Встроенные функции, доступные для шаблонов
- Настройка шаблонов с вашими собственными расширениями кода
Если вы хотите следить за сериалом, пожалуйста, не стесняйтесь подписаться на мою новостную рассылку, где я объявляю весь свой новый контент. Если у вас есть другие вопросы, вы можете связаться со мной в Интернете в Твиттере, где я нахожусь @mblayman Анкет
Эта статья впервые появилась на mattlayman.com Анкет
Поймите Джанго (16 серии деталей)
Оригинал: “https://dev.to/mblayman/understand-django-views-on-views-4f82”