Отказ от ответственности: я являюсь разработчиком этой платформы.

Установка Ретики

Перед установкой Retica рекомендуется создать виртуальную среду для вашего проекта. Создайте виртуальную среду с помощью следующей команды:

$~ python3 -m pip install --upgrade virtualenv 
$~ python3 -m venv env_name
$~ source env_name/bin/activate

Retica доступна через диспетчер пакетов pip.

$~ pip install retica

Если у вас не установлен pip, вы можете установить его, запустив:

$~ python -m ensurepip —upgrade

Создание нового проекта Retica

Фреймворк Retica поставляется с ReticaCLI, который представляет собой инструмент на основе терминала, который позволяет вам легко создавать новый проект или запускать существующие проекты.

Чтобы создать новый проект Retica, запустите:

$~ retica create
Project Name: Retica Blog
Project Description: A Blog Written In Python Using The Retica Framework
Project Author: Sushant Shah
Project Keywords: blog,python,retica,programming,technology
Import Frontend Libraries? (y/n) n
Creating project...

Структура папки:

Blog App/
  |- env/
  |- templates/
  |- plugins/
  |- app.py
  |- run.py

Сгенерированный app.py

import Retica
import Retica.Render
retica = Retica.Server(__name__)
templator = Retica.Render.TemplateRender(retica,template_dir="Templates")
libraries = {}
metadata = {
   'name': 'Retica Blog',
   'description': 'A Blog Written In Python Using The Retica Framework',
   'author': 'Sushant Shah',
   'keywords': 'blog,python,retica,programming,technology',
}
@retica.create_endpoint("/")
def index(request: Retica.Request.request, response: Retica.Response.response, **data):
    data['libraries'] = libraries
    data['metadata'] = metadata
    response.body = templator.render("index.jinja", data)

Создание веб-приложения для блога

Добавление базы данных sqlite3

Давайте начнем с добавления базы данных в наш проект. Мы будем использовать sqlite3, который поставляется со стандартной библиотекой Python для хранения наших данных.

У нас будет 2 отдельные базы данных:
1. Пользователи
2. Сообщения.

Чтобы импортировать пакет sqlite3 в наш проект, добавьте следующую строку в начало app.py.

import sqlite3

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

users_conn = sqlite3.connect("users.db")
posts_conn = sqlite3.connect("posts.db")
users = users_conn.cursor()
posts = users_conn.cursor()

Теперь давайте включим принудительное применение внешнего ключа.

users.execute("PRAGMA foreign_keys = ON")
posts.execute("PRAGMA foreign_keys = ON")

Наконец, давайте создадим классы User и Post в качестве удобного интерфейса для нашей базы данных. Мы также переместим весь код SQLite в метод __init__() классов. Для этого мы создадим файлы User.py и Post.py и импортируем их в наш проект.

User.py

Post.py

Внедрение JWT-аутентификации

JWT (веб-токен JSON) — это упрощенный токен, используемый для представления утверждений. В нашем проекте JWT будут представлять утверждения об идентичности, в частности, идентичности пользователя. Сначала установите пакет jwt, запустив:

$~ pip install jwt

Теперь давайте добавим методы JWT в наш класс User.

Замените ‘SPR_SCRT_PSSWD’ более надежным паролем, предпочтительно случайным паролем.

Теперь всякий раз, когда пользователь пытается войти в систему, мы будем генерировать JWT, используя метод get_jwt(). Этот токен будет храниться в файлах cookie пользователя. Если пользователь попытается открыть страницу, JWT будет передан на сервер вместе с другими файлами cookie, когда мы получим объект User с помощью метода get_user_from_jwt().

Создание конечных точек

Конечные точки относятся к конечным точкам URL-адресов, которые в Retica запускают выполнение функции для получения ответа от сервера. У нас будут следующие конечные точки:
1. '/': домашняя страница
2. '/post/new': страница нового сообщения
3. '/post/{post_id} ': страница сообщений
4. '/login': страница входа в систему
5. '/signup': страница регистрации
6. '/admin': страница администратора

Давайте начнем с создания конечных точек для нашего приложения блога. Здесь мы также будем создавать классы обработчиков. Классы обработчиков позволяют нам определять отдельные функции для каждого метода (GET, POST, UPDATE, DELETE и т. д.). Мы будем использовать их для новой страницы сообщения, страницы входа, страницы регистрации и страницы администратора.

Все конечные точки

Контроль доступа

Следующим шагом в обеспечении безопасности нашего блог-приложения является создание контроля доступа. Мы не хотим, чтобы кто-либо мог получить доступ к странице администратора. Для этого мы будем использовать атрибут conditional. Во-первых, мы создадим функцию, которая принимает только 1 аргументrequest и возвращает True, если запрос авторизован, и False в противном случае. Условие также может возвращать разные ответы в зависимости от правильности запроса. Пользовательские коды ошибок в условных выражениях скоро будут реализованы.

Теперь эту функцию можно передать в качестве аргумента декоратору create_endpoint.

@retica.create_endpoint("/admin", conditional=admin_only)

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

Заключительные комментарии

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