Как сделать ответы на комментарии flask

Обновлено: 04.07.2024

[Перевод] Поваренная книга Flask Framework - Глава 8 предоставляет интерфейс администратора для приложений Flask

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

Эта глава будет содержать следующие подразделы:

  • Создайте простой интерфейс CRUD
  • Используйте расширение Flask-Admin
  • Зарегистрируйте модель во Flask-Admin
  • Создавайте собственные формы и поведения
  • Текстовая интеграция WYSIWYG
  • Создать роли пользователей

Введение

Создайте простой интерфейс CRUD

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

готов

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

Как это сделать

Сначала измените models.py, чтобы добавить новое поле в модель User: admin. Это поле поможет нам определить, является ли этот пользователь администратором.

Предыдущий метод is_admin () возвращает только значение поля администратора. При необходимости его можно настроить. Взгляните на следующий код:

В то же время мы создали две формы для использования в режиме администратора.
Теперь измените представление в views.py для завершения интерфейса администратора:

Предыдущий код admin_login_required Декораторы, эффекты и login_required Декоратор похож. Разница в том, что нужно использовать login_required , И проверьте, является ли текущий авторизованный пользователь администратором.

Далее следует обработчик, используемый для создания интерфейса администратора. заметка @admin_login_required Как пользоваться декораторами. Остальной контент такой же, как и то, что мы узнали раньше, теперь мы сосредоточимся только на просмотре и обработке аутентификации:

Предыдущий метод позволяет администраторам создавать новых пользователей в системе. Это поведение аналогично методу register (), но позволяет установить флаг администратора пользователя. Взгляните на следующий код:

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

Примечание переводчика

Исходный текст - user.delete (), теперь он изменен на db.session.delete (user).
Исходный вариант - if form.validate (), теперь он изменен на if form.validate_on_submit ():

принцип

Мы добавили пункт меню для приложения, в котором добавлена ​​ссылка на главную страницу администратора, и страница выглядела так:


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


Домашняя страница после входа администратора выглядит так:


Администратор может видеть список пользователей в системе, а также может создать нового пользователя. Сама страница списка пользователей также предоставляет возможности для редактирования и удаления пользователей.

незамедлительный

Чтобы создать первого администратора, вам необходимо создать пользователя с помощью консольных команд и установить для флага администратора значение True.

Используйте расширение Flask-Admin

Flask-Admin - это расширение, которое упрощает и ускоряет создание интерфейса администратора для приложений. Этот раздел посвящен использованию этого расширения.

готов

Во-первых, вам нужно установить расширение Flask-Admin:

Мы расширяем приложение из предыдущего раздела, чтобы использовать Flask-Admin для его завершения.

Как это сделать

Достаточно всего нескольких предложений, чтобы добавить простой интерфейс администратора в любое приложение Flask с помощью расширения Flask-Admin.
Нам нужно только добавить следующие предложения в конфигурацию приложения:

Простая инициализация приложения с помощью класса Admin, предоставляемого расширением Flask-Admin, предоставит только базовый интерфейс администратора, который выглядит следующим образом:


После этого нам нужно добавить это представление к объекту администратора в конфигурации Flask:

Домашняя страница администратора теперь выглядит так:


Следует отметить, что по умолчанию эта страница не имеет аутентификации, которую необходимо реализовать самостоятельно. Поскольку Flask-Admin не делает никаких предположений о системе аутентификации. Наше приложение использует Flask-Login для входа в систему, поэтому мы можем добавить метод is_accessible () в класс HelloView:

Примечание переводчика

Оригинальная книга current_user.is_authenticated() and current_user.is_admin() , Это сообщит об ошибке, это не функция и не может быть вызвана, поэтому вам нужно удалить ().

Больше

После завершения предыдущего кода появляется представление администратора, которое не требует аутентификации, и любой может получить к нему доступ. Это домашняя страница администратора. Чтобы открыть эту страницу только для администратора, нам нужно унаследовать AdminIndexView и завершить метод is_accessible ():

После этого вам нужно передать это представление как index_view объекту admin в конфигурации приложения, которая реализована следующим образом:

Этот метод делает все административные представления доступными только администратору. Мы также можем реализовать любые разрешения или правила условного доступа в is_accessible (), когда это необходимо.

Зарегистрируйте модель во Flask-Admin

В предыдущем разделе мы увидели, как использовать расширение Flask-Admin для создания интерфейса администратора в приложении. В этом разделе мы увидим, как создать интерфейс / представление администратора для существующей модели, чтобы можно было выполнять операции CRUD.

готов

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

Как это сделать

Использовать Flask-Admin для регистрации модели в интерфейсе администратора очень просто. Вам нужно добавить несколько строк такого кода:

Здесь в первой строке мы импортировали ModelView из flask_admin.contrib.sqla. flask_admin.contrib.sqla - это представление, предоставляемое Flask-Admin, которое наследует модель SQLAlehcmy. Это создаст новое административное представление для модели User. Вид выглядит так:


Глядя на предыдущий снимок экрана, многие люди могут подумать, что показывать пользователю хеш-значение пароля бессмысленно. В то же время механизм создания модели по умолчанию Flask-Admin не сработает при создании пользователя, потому что есть __init__() метод. Этот метод ожидает три поля, но логика создания модели в Flask-Admin очень общая и не будет предоставлять никакого значения при создании модели.
Теперь мы настроим некоторые действия Flask-Admin по умолчанию, чтобы изменить механизм создания пользователей и хэш-значение пароля в скрытом виде:

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

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

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

незамедлительный

Смотреть self._on_model_change(form, model, True) Одно предложение. Последний параметр True указывает, что вызов предназначен для создания новой записи.

Интерфейс администратора модели User будет выглядеть так:


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

Создавайте собственные формы и действия

В этом разделе мы будем использовать форму, предоставленную Flask-Admin, для создания настраиваемой формы. В то же время настраиваемое действие будет создано с использованием настраиваемой формы.

готов

В предыдущем разделе мы видели, что в форме обновления пользователя не было возможности обновить пароль. Форма выглядит так:


В этом разделе мы настроим эту форму, чтобы администратор мог изменять пароль для любого пользователя.

Как это сделать

Чтобы реализовать эту функцию, вам нужно только изменить views.py. Сначала мы начнем с импорта правил из формы Flask-Admin:

В предыдущем разделе form_edit_rules Устанавливаются два поля: имя пользователя и админ. Это означает, что модель User обновляет поля в представлении, которые может редактировать пользователь с правами администратора.

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

Приведенный выше код означает, что форма теперь имеет заголовок, который отделяет часть сброса пароля от других частей. После этого мы добавим два поля new_password и confirm, которые помогут нам безопасно изменить пароль:

scaffold_form() Необходимо изменить метод, чтобы эти два новых поля стали эффективными при отображении формы.
Наконец, мы реализуем метод update_model (), который будет вызываться при обновлении записи:

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

незамедлительный

Смотреть self._on_model_change(form, model, False) . Здесь последний параметр False означает, что этот вызов нельзя использовать для создания новой записи. Это также используется для создания пользователей в предыдущем разделе. В этом примере последний параметр установлен в True.

принцип

Форма обновления пользователя выглядит так:


Если пароли, введенные в два поля пароля, совпадают, пароль пользователя будет обновлен.

Текстовая интеграция WYSIWYG

готов

Мы начинаем с добавления нового поля примечаний к модели User, а затем используем CKEditor для интеграции этого поля для записи форматированного текста. Это добавит дополнительные библиотеки Javascript и классы CSS в обычное поле textarea, чтобы преобразовать его в поле textarea, совместимое с CKEditor.

Как это сделать

Сначала мы добавим поле заметок в модель User, которая выглядит так:

После этого мы создадим настраиваемый элемент управления wtform и поле:

В предыдущем настраиваемом элементе управления мы добавили класс ckeditor в элемент управления TextArea. Если вам нужно узнать больше об элементах управления WTForm, обратитесь к главе 5, Создание пользовательского элемента управления. Взгляните на следующий код:

В предыдущем коде мы устанавливаем элемент управления на CKTextAreaWidget. Когда это текстовое поле отображается, будет добавлен CSS-класс ckeditor.

Далее нам нужно изменить правила формы в классе UserAdminView.Мы можем указать шаблон, используемый при создании и редактировании формы. Нам также нужно переписать TextAreaField с помощью CKTextAreaField:

В предыдущем коде form_overrides позволяет полю CKTextAreaFiled заменять обычное поле textarea.

Остальное упоминается ранее templates/edit.html шаблон:

Здесь мы расширяем файл edit.html по умолчанию, предоставленный Flask-Admin, и добавляем в него JS-файл CKEditors, чтобы можно было использовать CKTextAreaField класса ckeditors.

принцип

После внесения этих изменений форма создания пользователя будет выглядеть так, обратите внимание на поле Примечания:


Создать права пользователя

До сих пор мы видели, что с помощью метода is_accessible () можно легко создать представление, доступное конкретному пользователю с правами администратора. Его можно распространить на различные типы сценариев, и определенные пользователи могут просматривать только определенные представления. В модели существует другой способ реализации ролей пользователей на более детальном уровне, где роль определяет, может ли пользователь выполнять все или часть операций CRUD.

готов

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

незамедлительный

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

Как это сделать

Сначала мы добавляем поле в модель пользователя: роли:

Здесь мы добавили новое поле: роли, это строковое поле длиной 4. Мы предполагаем, что значение этого поля для любого пользователя представляет собой комбинацию C, R, U и D. Если значение поля ролей - CRUD, пользователь имеет право выполнять все операции. Отсутствие полномочий не позволяет совершить соответствующее действие. Разрешение на чтение открыто для любого администратора.

Далее нам нужно внести некоторые изменения в класс UserAdminView:

В предыдущем коде мы добавили только поле ролей в формы создания и редактирования. Мы также унаследовали класс под названием ActionsMixin. Это необходимо для крупномасштабных обновлений (например, крупномасштабных удалений). Взгляните на следующий код:

В этом методе сначала проверьте, содержит ли поле текущих ролей пользователя созданное разрешение (есть ли C). Если нет, отобразите ошибку и вернитесь. Взгляните на следующий код:

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

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

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

принцип

Список пользователей выглядит так:


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


Существует множество способов создания REST API, наиболее распространенным из которых является приложение Django с DRF. Другие люди пробуют FastAPI.

Но если вы используете приложение на основе Flask, я недавно попробовал библиотеку Flask-RESTX, которая включает в себя несколько замечательных функций:

  1. Документация Swagger (черт возьми, да!)
  2. Маршаллинг ответа
  3. Cинтаксический анализ запросов
  4. Обработка ошибок, ведение журнала и поддержка blueprint. Аккуратная интеграция с Flask.

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

Начнем с инициализации blueprint и определения объекта api в новом модуле. Я назвал это как api.py .

Flask-RESTX поддерживает Flask Blueprint, и их очень просто реализовать.


Далее напишем базовые модели. Мой пример API будет управлять объектами Items и Details, поэтому мне нужно написать модели, которые будут отвечать за их представление в стандартном ответе API.

Последний шаг настройки - написание парсера запроса.

Таким же образом, как и раньше, мы используем синтаксический анализатор запросов Flask-RESTX для чтения и проверки значений, которые мы ожидаем получить в наших конечных точках. В этом случае я планирую реализовать два объектных API, которые будут добавлять элементы к нашим объектам базы данных. (Наша база данных - это простой объект в памяти 😅)

Пришло время реализовать наши API. Первый API, который я хочу создать, - это тот, который управляет элементами. Я назову это ItemApi , и маршрут будет / , что означает корень пространства имен items .

Это активирует две конечные точки:

  • GET /api/v1/items/ - Список item_model
  • POST /api/v1/items/ - Создание item_parser

Этот класс будет управлять одним ресурсом элемента. Итак, чтобы получить его данные и добавить детали, нам понадобится следующая реализация:

У меня есть новостной сайт на flask, и я хочу сделать систему лайков в нём, но не знаю как.

Форма для создания комментария


Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

Посмотрите другие вопросы с метками python flask или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.24.41249


Работая над проектами машинного обучения, я решил, что хотел бы разработать законченные приложения. Это потребует разработки API, чтобы мы могли публиковать значения и получать ответы на прогнозы. Это где Flask и Flask-RESTPlus входят в картину.

колбапозволяет выставлять функции Python как API.Колба-RESTPlusявляется расширением Flask, улучшающим его возможности. Это позволяет нам не только определять REST API, но и вводить Swagger UI для всех API.

В этой статье я объясню, как я разработал приложение Flask с несколькими API и фиктивными данными. Проект доступен какGitHub Repository,

Я начал этот процесс с создания виртуальной среды, используя pipenv , Вы можете прочитать больше об этом в моемстатьяпо сравнению виртуальных сред. Я установил Flask и Flask-RESTPlus.

Однако, если вы не хотите работать внутри pipenv окружение, вы можете просто использовать следующие команды.


импорт

Я начал с импорта Flask от flask , От flask_restplus Я импортировал Api определить приложение и Resource который принимается в качестве параметра в различных классах, определенных в проекте.

Определить приложение

Я определил приложение как колбу, используя метод Flask() который устанавливает имя с помощью __name__ , Далее я буду использовать Api инициализировать приложение.

Я определил namespace Вот. Концепция очень проста. Всякий раз, когда API определяются в заданном пространстве имен, они появляются под определенным заголовком в Swagger (мы рассмотрим Swagger позже в этой статье). В namespace первая переменная определяет путь, а вторая - описание этого пространства.

Определить API

Наконец, я определил конечные точки. Как наше пространство имен name_space Я определю URL через маршрут как @name_space.route("/") , Затем Flask-RESTPlus требует, чтобы мы определили все конечные точки в рамках данного маршрута внутри класса. Методы могут быть get() , put() , и многие другие.

Запустить приложение

Теперь все настроено. Файл сохранен какbasic.py, Я запускаю приложение с помощью следующей команды, используя pipenv ,

Используя pip, вы можете использовать следующую команду.

Swagger UI


Оба API видны под main Пространство имен с описанием Main APIs , Мы можем попробовать любой API и проверить их работу, нажав Try it out кнопка.

Попробуй API

я использоваллоконделать GET и POST запросы с терминала.


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


В Flask и Flask REST-Plus есть еще много всего. Давайте рассмотрим их еще глубже и лучше поймем. Следующий код доступен как app.py в репозитории GitHub.

Мы можем использовать POST-запрос для отправки данных и их сохранения. Затем мы можем использовать запрос GET для получения этих данных. Допустим, у нас есть проект, который управляет именами людей и хранит их. Мы создаем конечную точку GET для извлечения имени, используя id и конечная точка POST, чтобы сохранить имя против id ,

Импортировать больше библиотек

Мы уже импортировали Flask, Api и Resource. Мы также импортируем request от flask пакет. Это помогает нам получить объект запроса и затем извлечь из него такую ​​информацию, как данные JSON. Мы также импортируем fields от flask_restplus пакет для определения типа элементов, таких какстрока,

Добавить информацию о приложении

Мы также можем добавить дополнительную информацию в наше приложение Flask. Эта информация полезна и отображается в интерфейсе Swagger.

Мы можем определить version , title и description нашего приложения. Мы установили только одно пространство имен, а именно names , Заголовок Swagger UI теперь будет выглядеть как на рисунке ниже.


Определить модели

Всякий раз, когда мы хотим получать или отправлять информацию в определенном формате (JSON), мы выполняем это с помощью model , Уточняем название модели. Далее мы опишем ожидаемую информацию и свойства каждого ожидаемого значения.

Мы определяем название модели как Name Model Включает в себя один параметр, а именно name это обязательное поле, и определите его описание и текст справки. API, который будет использовать эту модель, будет ожидать JSON с ключом в виде name ,

Чтобы отслеживать все имена, я буду хранить их в list_of_names ,

Определить API

Давайте разберем приведенный выше фрагмент кода на более мелкие части, чтобы лучше его понять. Мы исследуем POST конечная точка. Функциональность GET было бы очень похоже.

Определить маршрут и класс

Определите документы для API


Параметры определены в верхней части. Все ожидаемые ответы с их описанием отображаются в нижней части.

Определите метод

Попробуйте приложение

Давайте запустим приложение.

ПОСЛЕ
Разбираем ответ на запрос, читаем name и хранить его против id в list_of_names , Мы также возвращаем статус и имя вновь добавленного человека.



Ошибка в запросе POST

Скажем, мы забыли поставить name параметр в объекте данных. В этом случае мы получим ошибку.



ПОЛУЧИТЬ
Мы просто передаем id что мы хотим получить имя, и мы получаем статус и имя человека обратно, если таковые имеются.


Ошибка в запросе GET

Скажем, у нас нет ни одного человека против Id 2. Если мы попытаемся получить эту информацию, она выдаст ошибку.



В этой статье мы рассмотрели создание API с использованием Flask и Flask-RESTPlus. Обе они являются отличными библиотеками для разработки, а также документирования API на Python и взаимодействия с API с помощью Swagger.

Читайте также: