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

Masonite Framework Tutorial серии Часть 4 – просмотры

Часть 4 серии учебника Python Framework. Говоря о взглядах!. Теги с Python, Framework, программированием, масонитом.

Казонит Использует традиционную архитектуру MVC (модель просмотра моделей). Хотя большинство рамки используют этот архитектурный рисунок, каждая рамка субъективно интерпретирует ее по-разному. Мы уже прошли через C (контроллер) в одном из предыдущих учебных пособий, поэтому теперь мы будем говорить о V (View).

Если вы исходите из рамок, таких как Django, вы можете быть использованы для представления кода Python, как функция (представления на основе функций) или класс Python (Views на основе класса), но в Masonite представление просто просто просто шаблон HTML. На протяжении всей документации и, возможно, эти учебные пособия слова «шаблоны» и «представления» используются взаимозаменяемо.

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

Наиболее распространенное использование случаев для представлений на бэкэнде, если он будет возвращать их и передавать им данные. Если вы исходите из каких-либо структуры, то это должно иметь большое значение для вас. Мы уже объяснили, как вернуть представления в предыдущем уроке, но для быстрого освещения это понравится:

def show(self):
    return view('template', {'key': 'value'})

Так что это действительно важно, чтобы отметить. Уведомление здесь мы используем встроенную функцию здесь. Эта структура придет с Welcomecontroller Из коробки, поэтому на первый взгляд это может показаться странным.

Они называются Встроенные функции помощника (Поскольку они используют встроенные Python) и предназначены для того, чтобы позволить вам быстро создавать прототипы, в которых вы можете позже войти и рефакторировать или оставить их. Я лично рефакторию после того, как все работает. Если вам не нравится встроиться внутри вашего приложения, и вы думаете, что это слишком много «магии», то вы можете удалить Помощникипроводов В вашем Поставщики список. Все встроенные функции HELPER добавляются к приложению через этот провайдер.

Если вам не нравится функции встроенного помощника, вы также можете разрешить через параметры контроллера:

def show(self, View):
    return View('template', {'key': 'value'})

Если это прямо здесь, немного запутано, то обязательно прочитайте документацию на Сервисный контейнер И как работает МОК и зависимость Resolver.

Это точно так же, как используя функцию помощника выше, но это разрешено с помощью Сервисный контейнер вместо. Если вы не знакомы с тем, как Сервисный контейнер Разрешит вещи, а затем обязательно прочитайте документацию здесь.

Объект разрешен на самом деле просто метод рендера на классе View. Если вы хотите быть супер потрясающим Pythonista и придерживайтесь импортирования вещей, которые вам нужны, вы можете решить, используя аннотации Python:

from masonite.view import View

def show(self, view: View):
    return view.render('template', {'key': 'value'})

Обратите внимание, что мы используем View.Render Метод здесь. Как указано ранее, Вид Ключ был просто псевдоним для этого метода визуализации на классе View.

Как вы возвращаете представления, полностью зависит от вас и вашей команды. Принимать решения, как вы видите. Я лично использую последний вариант и импортирую все мои занятия Но это полностью зависит от вас.

Первый параметр, используемый при возврате представлений, всегда является шаблоном. Все шаблоны расположены в Ресурсы/шаблоны каталог. Так что, если мы вернули так, как это:

from masonite.view import View

def show(self, view: View):
    return view.render('index', {'key': 'value'})

Это будет ищет Ресурсы/шаблоны/index.html файл и сделайте это.

Большинство шаблонов смогут быть расположены внутри Ресурсы/шаблоны Справочник без проблем, и вы, очевидно, вы можете пойти как можно больше каталогов, так как вам нужно, например, шаблон, как:

view.render('dashboard/users/settings/edit', ...)

Это будет смотреть на Ресурсы/шаблоны/приборная панель/пользователи/настройки/EDIT.HTML файл.

Некоторые шаблоны могут быть оказаны от сторонних пакетов или других каталогов. Например, мы могли бы сделать что-то вроде Установите счета-фактуры PIP И тогда может потребоваться вернуть представление на счета:

view.render('/invoices/templates/show', ...)

Обратите внимание на предыдущую передовую косушку. Это сигналы масониту, что вы должны начать искать этот шаблон в этом модуле. Это будет смотреть внутрь СЧЕТЫ модуль, а затем рендеринг Шаблоны/шоу файл.

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

view.render('/storage/templates/index', ...)

Прохождение в данные

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

Мы будем проходить в данные, которые мы делаем из нашего контроллера на наш взгляд, а затем до нашего представления о том, чтобы показать эти данные. Например, у нас может быть что-то вроде:

from masonite.view import View
from app.User import User

def show(self, view: View):
      user = User.find(1)
    return view.render('index', {'user': user})

И внутри нашего Ресурсы/шаблоны/index.html Файл мы можем сделать что-то вроде:

{{ user.email }}

Если вьющиеся скобки не имеют большого смысла, пока не волнуйтесь. Masonite использует jinja2, которую мы будем уходить более подробно с небольшим количеством. Если вы знакомы с Jinja2, то вы должны быть хорошими. Если нет, то это просто то, как мы отображаем данные в браузере. Jinja2 примет эти синтаксические семантики, а затем разбирать их с данными, которые мы передали ему.

Если вы знакомы с Jinja2, вы действительно можете пропустить этот раздел. Здесь нет ничего особенного. Если вы не тогда, вы можете продолжать читать.

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

Отображение данных

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

your-email@gmail.com

Не очень много для отображения данных помимо фильтрации, о которых мы немного поговорим.

Ниже приведены части Jinja2. Шаблон, что вам нужно знать.

Если заявления

Мы можем использовать какую-то логику в наших шаблонах, просто используя если операторы:

{% if user.email == 'joe@email.com' %}
    Hello Joe
{% elif user.email == 'bill@email.com' %}
    Hello Bill
{% else %}
    I don't know you
{% endif %}

Для петлей

{% for key in keys %}
    {{ key }}
{% endfor %}

Расширение видов

Мы можем «расширить» наше представление, чтобы мы могли иметь базовый шаблон, где все наши логические наследования. Если вы использовали какой-либо язык шаблона до того, что это сделает вам много смысла:

{% extends 'nav/base.html' %}

{% for key in keys %}
    {{ key }}
{% endfor %}

Это будет вводить nav/base.html Шаблон сверху и введите код под ним.

Шаблонные блоки

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




 
  {% block css %}{% endblock %}



Hey!

{% block content %}{% endblock %}

Hope to see you again soon!

И тогда наши дети шаблоны могут выглядеть так:


{% extends 'nav/base.html' %}

{% block css %}
  
{% endblock %}

{% block content %}
Some awesome content
{% endblock %}

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




 
  



Hey!

Some awesome content

Hope to see you again soon!

Включая файлы

Мы также можем включать файлы, так что это может быть что-то вроде боковой панели, где вся логика может храниться в одном шаблоне для этой боковой панели. Это может выглядеть что-то вроде:




 
  {% block css %}{% endblock %}



{% include 'snippets/sidebar.html' %}
{% block content %}{% endblock %}

Вы можете включить шаблоны в любом месте. Все включенные шаблоны наследуют все переменные из текущего шаблона.

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

Используя фильтры

Jinja2 поставляется с тем, что они называют «фильтрами», которые действительно просто функции, которые получают переменную, к которой она прикреплена, а затем возвращает это значение.

Вы можете применить фильтр в переменную с помощью символа трубы. Например:

{{ user.email|striptags|title }}

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

Строительные фильтры

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

Чтобы добавить фильтры на все наши шаблоны, мы можем просто использовать класс View. Лучшее место, чтобы поставить этот код внутри Поставщик услуг чей WSGI Атрибут установлен на Ложь . Это гарантирует, что фильтр не добавляется в нашу кодовую базу снова и снова и замените наш код. Если WSGI это Ложь Затем он будет загружен только в класс View, когда сервер впервые запускается.

Вы должны создать Поставщик услуг специально для всех ваших фильтров, но на данный момент мы просто будем использовать Умиделпровидер и просто наклейте код там. Для того, чтобы это работать, нам просто нужно добавить функцию в класс View. Мы можем связать фильтры к классу View, используя Фильтр Метод:

from masonite.view import View

def split_string(variable):
    return variable.split(',')

class UserModelProvider(ServiceProvider):

    wsgi = False

    ...

    def boot(self, Request, view: View):
        view.filter('split', split_string)

Вот и все! Нам просто нужно было связать функцию до класса View. Теперь мы можем использовать его в нашем шаблоне:

{{ user.email|split }}

Также как у нас есть некоторые функции помощника в нашем BackeND-коде, у нас есть некоторые функции помощника, уже введенные в наш шаблон для нас.

Запрос

Мы можем легко получить текущий объект запроса:

{{ request().path }}

Это просто класс запросов, введенный в представление.

Текущий пользователь

Мы можем получить текущий пользователь:

{{ user().email }}

Сессия

Это содержит класс сеанса:

{{ session().get('key') }}

Получение маршрутов

Мы можем получить любой по имени у нас есть:

{{ route('route.name') }}

Это вернет что-то URL для имени маршрута. Если ваш URL-адрес маршрута – это что-то вроде /маршрут/имя/@ id id Тогда вам придется указать параметр маршрута в качестве второго параметра:

{{ route('route.name', {'id': 1}) }}

Способ запроса

Masonite поддерживает все формы способов запроса для включения Поставить , Патч , Удалить и Т. Д. Проблема в том, что HTML-формы только принимают Получить и ПОЧТА . Мы можем изменить метод запроса с помощью метода помощника:

{{ request_method('PUT') }}

При отправке это будет представить форму как Поставить Отказ

Возвращаться

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

{{ back(request().path) }}

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

{{ back(route('form.errors')) }}

То, как используется, находится внутри контроллера:

def show(self):
    if some error:
        request().back()

    do some other logic here

Masonite узнает, куда мы хотим вернуться из-за __назад Вход, который отправлен с использованием назад помощник.

Защита CSRF.

Все формы представлены, которые не являются Получить Запрос защищена атаками CSRF. Нам всегда нужно указывать токен CSRF на этих типах запросов:

{{ csrf_field|safe }}

Если вы забудете один, вы получите исключение, говорящее что-то эффекту недействительного или отсутствующего токена CSRF.

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

Сам по себе View – это основание, которое обрабатываются все представления. Из-за этого все, что касается таких взглядов, как добавление функций помощника, рендеринга, добавления фильтров, сред, и т. Д., являются частью класса View.

Этот класс загружен в контейнер с ViewClass псевдоним. Большинство привязки объектов к классу View должны быть сделаны внутри Поставщик услуг Где WSGI атрибут это Ложь Чтобы избежать применения от замедления.

Получение класса View.

Как и ранее заявляют, что класс View привязан к контейнеру с использованием ViewClass псевдоним Таким образом, мы можем разрешить такой класс:

    def boot(self, Request, ViewClass):
        ViewClass.share(..)

Или путем разрешения аннотации:

from masonite.view import View
...
    def boot(self, Request, view: View):
        view.share(..)

Общий вопрос

Если вы хотите поделиться переменной или функцией или что-то со всеми своими шаблонами, то мы используем Поделиться () метод.

Это берет словарь. Ключ – это то, что будет использоваться в шаблоне, и значение вернутся.

from masonite.view import View
...
    def boot(self, Request, view: View):
        framework = 'Masonite'
        view.share({'framework': 'Masonite'})

Теперь мы можем использовать это во всех шаблонах:

{{ framework }} 

Составляя

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

resources/
  templates/
    dashboard/
      show.html
      user.html
      base.html
    settings/
      show.html
      index.html

Если вам нужна только определенная переменная, которая будет доступна только в приборной панели user.html Шаблон тогда мы можем составить:

from masonite.view import View
...
    def boot(self, Request, view: View):
        framework = 'Masonite'
        view.compose('dashboard/user': {'framework': 'Masonite'})

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

Вы также можете указать подстановочный знак шаблонов:

from masonite.view import View
...
    def boot(self, Request, view: View):
        framework = 'Masonite'
        view.compose('dashboard/*': {'framework': 'Masonite'})

Это сделает эту пару ключ, доступную во всех шаблонах приборной панели, чтобы включить Приборная панель/Show.html , Приборная панель/user.html , Приборная панель/base.html. .

Среда

Среда можно подумать о просто как локации шаблонов. Вне коробки масонит поставляется только с 1 средой шаблона ( ресурсы/шаблоны ), которые нужны только базовый каталог для работы, но вы можете легко загрузить другие среды в:

from masonite.view import View
...
    def boot(self, Request, view: View):
        view.add_environment('invoices/templates')

Как это работает то, что оно смотрит в счета Модуль для каталога шаблонов. Это фантастическое для использования пакетов третьего лица, так как модуль не должен быть в вашей структуре файлов, но может быть в вашей среде Python.

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

Вы можете сделать что-то вроде:

$ pip install masonite-invoices

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

{% extends 'invoices/base.html' %}

{% include 'my/application/snippet.html' %}

Обратите внимание, что теперь мы объединяем несколько средов шаблонов, где исходит первая строка из Masonite-счеты Пакет и нижняя линия исходит из нашего приложения.

Спасибо за чтение! Обязательно дайте звезду на Masonite Github Repo страница или присоединиться к Официальный масонитовый слабый канал если у вас есть вопросы!

Оригинал: “https://dev.to/masonite/masonite-framework-tutorial-series-part-4—views-163c”