Рубрики
Без рубрики

Понять Джанго: взгляды на взгляды

В предыдущей статье Django я освещал URL -адреса и разнообразие инструментов, которые дает Джанго … Tagged с Python, Django, Views.

Поймите Джанго (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)

Хотя это работает, у него много недостатков.

  1. HTML -кусок не используется повторно используемыми другими взглядами. Это не имеет большого значения для этого небольшого примера, но это было бы огромной проблемой, когда вы пытаетесь сделать много просмотров, которые используют много наценки и должны поделиться общим видом.
  2. Смешивание Python и HTML станет грязным. Нужны доказательства? Посмотрите на историю вычисления и узнайте о CGI Анкет Это было не красиво.
  3. Как вы можете объединить куски 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”