django

Шесть Python-пакетов, которые рекомендуется использовать в каждом веб-приложении на Django

  • воскресенье, 9 августа 2020 г. в 00:27:48
https://habr.com/ru/post/514348/
  • Python
  • Django


image


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


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


В то время как некоторые Python-пакеты предлагают потрясающую функциональность, необходимую для конкретного проекта, пакеты, обсуждаемые ниже, — наиболее ходовые из Django-пакетов.


Веб-фреймворк Django


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


Django считается клиент-серверным (прим. пер.: full-stack) веб-фреймворком, в котором база данных, сервер приложения, шаблонизатор, модуль аутентификации и диспетчер аккуратно скомбинированы для создания фреймворка высокого уровня. Эти отдельные компоненты добавляются в момент установки пакета, и зачастую их нужно просто немного настроить, чтобы они правильно функционировали.


Установка Django:


Терминал macOS


(env)User-Macbook:env user$ pip install django

Интерпретатор командной строки Windows


(env)C:\Users\Owner\desktop\env> pip install django

На момент данной статьи последняя версия Django — 3.0.8. Все, что вам нужно для установки последней версии — это команда pip install django.


Если вы хотите установить другую версию, то укажите ее номер, как показано в команде pip install django==2.1.15. Пожалуйста, обратите внимание, что там два знака равенства после имени пакета, а не один.


После завершения установки вам нужно будет начать конфигурирование своего веб-приложения на Django. Если вы хотите сразу перейти к построению своего веб-приложения на Django, то взгляните на краткие руководства: по установке Django и по его конфигурированию. Или, если вы только начали, и вам нужен пошаговый учебный материал, посмотрите на «Руководство по веб-приложениям на Django для начинающих».


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


(1) Django TinyMCE4 Lite


Терминал macOS


(env)User-Macbook:mysite user$ pip install django-tinymce4-lite

Интерпретатор командной строки Windows


(env) C:\Users\Owner\Desktop\Code\env\mysite>pip install django-tinymce4-lite

Как только вы закончили с базовой настройкой своего веб-приложения, вы можете установить замечательный Python-пакет django-tinymce4-lite. Этот пакет, фактически, — уменьшенная версия Django-приложения django-tinymce4, которая включает в себя виджет для рендеринга полей Django-формы в виде редакторов TinyMCE.


TinyMCE — это текстовый WSIWYG («что видишь, то и получишь») редактор, который конвертирует HTML-элементы в экземпляры редактора или в «простой текст». Этот Python-пакет настоятельно рекомендуется, если вы рассчитываете создать блог, так как вы можете легко редактировать текст, который затем форматируется в HTML в соответствии с текущим шаблоном.


env > mysite > mysite > settings.py


INSTALLED_APPS = [
    ...
    ...
    'tinymce',
]

TINYMCE_DEFAULT_CONFIG = {
    'height': 400,
    'width': 1000,
    'cleanup_on_startup': True,
    'custom_undo_redo_levels': 20,
    'selector': 'textarea',
    'browser_spellcheck': 'true',
    'theme': 'modern',
    'plugins': '''
            textcolor save link image media preview codesample contextmenu
            table code lists fullscreen  insertdatetime  nonbreaking
            contextmenu directionality searchreplace wordcount visualblocks
            visualchars code fullscreen autolink lists  charmap print  hr
            anchor pagebreak
            ''',
    'toolbar1': '''
            fullscreen preview bold italic underline | fontselect,
            fontsizeselect  | forecolor backcolor | alignleft alignright |
            aligncenter alignjustify | indent outdent | bullist numlist table |
            | link image media | codesample
            ''',
    'toolbar2': '''
            visualblocks visualchars |
            charmap hr pagebreak nonbreaking anchor |  code |
            ''',
    'contextmenu': 'formats | link image',
    'menubar': True,
    'statusbar': True,
}

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


env > mysite > mysite > urls.py


"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:

    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include ('main.urls')),
    path('tinymce/', include('tinymce.urls')), #add this

Затем добавьте путь к tinymce в URL-ы проекта.


env > mysite > main > models.py


from django.db import models
from tinymce import HTMLField

class MyModel(models.Model):
    ...
    content = HTMLField()

Наконец, вы можете быстро добавить TinyMCE в Django-модель, импортируя HTMLField наверху файла и потом вызывая его в поле модели. Если вы не уверены, как пользоваться Django-моделями, посмотрите статью «Как пользоваться Django-моделями» для получения более подробной информации.


(1) Pillow


Терминал macOS


(env)User-Macbook:mysite user$ pip install Pillow

Интерпретатор командной строки Windows


(env) C:\Users\Owner\Desktop\Code\env\mysite>pip install Pillow

Да, этот пакет не связан с Django, но он необходим, чтобы выгрузка файлов и изображений на сайт работала корректно в Django-проекте. Если вы планируете использовать поле для выгрузки на сайт медиаданных в своей Django-модели для, скажем, обложки статьи, то вам нужно будет установить Pillow. Это форк библиотеки Python Imaging Library для корректной выгрузки файлов.


env > mysite > mysite > settings.py


MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Сразу после установки вам нужно добавить URL к папке для медиафайлов и корневую директорию в файл settings.py.


env > mysite > mysite > urls.py


from django.contrib import admin
from django.urls import path, include
from django.conf import settings  # add this
from django.conf.urls.static import static  # add this

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
]

if settings.DEBUG:  # add this
    urlpatterns += static(settings.MEDIA_URL,
                          document_root=settings.MEDIA_ROOT)

Далее вам нужно добавить необходимые импорты в верхней части файла urls.py вашего проекта и указать URL-шаблон к папке для хранения медиафайлов. Имейте в виду, что выгрузка медиаданных на сайт не будет работать в эксплуатационном режиме с этой условной конструкцией. Вам нужно будет реконфигурировать свое местоположение выгрузки медиаданных, когда вы будете готовы приступить к развертыванию своего проекта.


env > mysite > main > models.py


from django.db import models

class MyModel(models.Model):
    ...
    image = models.ImageField(upload_to='images/')

Теперь, чтобы выгрузить изображение, перейдите в ваш файл с моделями и добавьте поле класса ImageField с 'images/' в качестве местоположения выгрузки. Выгруженные изображения будут затем добавлены в папку media > images, которая будет автоматически создана при выгрузке.


Для более подробной информации о правильном создании модели, доступе к местоположению выгрузки в админке Django и рендеринге модели в шаблоне обратитесь к материалу «Как использовать модели Django».


(3) Django Crispy Forms


Терминал macOS


(env)User-Macbook:mysite user$ pip install django-crispy-forms

Интерпретатор командной строки Windows


(env) C:\Users\Owner\desktop\code\env\mysite>pip install django-crispy-forms

Давайте поговорим о формах Django. У них отличная функциональность, но не самый лучший внешний вид. Вы можете установить в свой проект django-crispy-forms, чтобы быстро решить эту проблему.


env > mysite > mysite > settings.py


INSTALLED_APPS = [
    ...
    'crispy_forms',
]

CRISPY_TEMPLATE_PACK = 'uni_form'

Для корректной работы пакета вам нужно будет перейти в файл settings.py и добавить crispy_forms в список установленных приложений. Учтите, что между crispy и forms присутствует нижнее подчеркивание.


Затем вам нужно указать пакет crispy-шаблонов. Тот, что указан ниже (прим. пер.: ниже переменной INSTALLED_APPS), — пакет по умолчанию, но если вы используете CSS-фреймворк Bootstrap, посмотрите как интегрировать Bootstrap с django-crispy-forms.


env > mysite > main > templates > main > contact.html


{% load crispy_forms_tags %}

<form method="post">
    {% csrf_token %}
       {{form|crispy}}
       <button type="submit">Submit</button>
</form>

Пакет django-crispy-forms добавляется в проект в форме фильтра внутри {{form}} языка шаблонов Django. Эта форма не только будет вызывать все поля формы, но и форматировать каждое поле в соответствии с пакетом crispy-шаблонов, заданным в файле settings.py.


Обратитесь к статье «Рендерьте формы с помощью Django Crispy Forms» для более подробной информации касательно процесса рендеринга форм, и к статье «Создавайте контактную Django-форму с бэкендом электронной почты» для более общей информации о построении Django-форм.


(4) Django Tables


Терминал macOS


(env)User-Macbook:mysite user$ pip install django-tables2

Интерпретатор командной строки Windows


(env) C:\Users\Owner\desktop\code\env\mysite>pip install django-tables2

Теперь предположим, что вы хотите в своем Django-проекте создать динамическую таблицу, которая связывается с моделью. Установите django-tables2 — связанный с Django пакет для рендеринга таблиц.


env > mysite > mysite > settings.py


INSTALLED_APPS = [
    ...
    'django_tables2',
]

Добавьте «Django tables» в список установленных приложений.


env > mysite > main > models.py


from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100, verbose_name="full name")
    email = models.EmailField(max_length=200)

Затем создайте модель, которую вы хотите использовать в таблице.


После создания модели вам нужно будет отправить на выполнение команды python manage.py makemigrations и python manage.py migrate, чтобы добавить модель в базу данных и добавить объекты своей модели через админку Django. Посмотрите «Как использовать модели Django» для более подробной инструкции.


env > mysite > main > (новый файл) tables.py


import django_tables2 as tables
from .models import MyModel

class MyTable(tables.Table):
    class Meta:
        model = MyModel
        fields = ("name", "email", )

Теперь создайте новый файл с именем tables.py в папке приложения — в main, и в верхней части файла импортируйте django_tables2, например под именем tables. Затем создайте класс, который задает модель и имена полей.


env > mysite > main > views.py (представления-классы)


...
from django_tables2 import SingleTableView

from .models import MyModel
from .tables import MyTable

class ListView(SingleTableView):
    model = MyModel
    table_class = MyTable
    template_name = 'main/table.html'

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


env > mysite > main > urls.py (представления-классы)


from django.urls import path
from . import views

app_name = "main"

urlpatterns = [
    path("table", views.ListView.as_view()),
]

Затем убедитесь, что в файле urls.py приложения есть URL к таблицам. Если вы планируете узнать больше о представлениях-классах, взгляните на статью «Представления-классы Django».


env > mysite > main > views.py (представления-функции)


...
from django_tables2 import SingleTableView

from .models import MyModel
from .tables import MyTable

def list(request):
    model = MyModel.objects.all()
    table = MyTable(model)
    return render(request=request, template_name="main/table.html", context={"model":model, "table":table})

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


env > mysite > main > urls.py (представления-функции)


from django.urls import path
from . import views

app_name = "main"   

urlpatterns = [
    path("table", views.list, name="list"),
]

Затем добавьте URL к таблице в файле urls.py приложения.


env > mysite > main > templates > main > (новый файл) table.html


{ % load render_table from django_tables2 % }

<div >
    { % render_table table % }
</div >

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


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


*Если вы хотите добавить CSS фреймворка Bootstrap в таблицу:


env > mysite > main > tables.py*


import django_tables2 as tables
from .models import MyModel

class MyTable(tables.Table):
    class Meta:
        model = MyModel
        template_name = "django_tables2/bootstrap4.html"
        fields = ("name", "email",)

Добавьте имя шаблона, связанное с шаблоном Bootstrap, в файл tables.py. Этот и другие файлы шаблонов можно найти в папке Lib > site-packages > django_tables2 > templates > django_tables2 вашего проекта.


env > mysite > main > templates > main > (новый файл) table.html


{% extends "main/header.html" %}

{% block content %}

{% load render_table from django_tables2 %}

<div class="container">
    {% render_table table %}
</div>

{% endblock %}

Кроме того, вы можете унаследовать шаблон шапки, который загружает CDN-ы фреймворка Bootstrap. Это самый простой способ добавления Bootstrap во все ваши шаблоны с использованием одного и того же куска кода.


Если вам не понятно, как использовать тег extends с CDN-ми Bootstrap, посмотрите раздел «Django extends tag and block content» (прим. пер.: Django-тег extends и контент блока) в «Руководстве по веб-приложениям на Django для начинающих».


(5) Django Filter


Терминал macOS


(env)User-Macbook:mysite user$  pip install django-filter

Интерпретатор командной строки Windows


(env) C:\Users\Owner\desktop\code\env\mysite>  pip install django-filter

Теперь, когда у вас есть таблица, вам, вероятно, захочется иметь возможность искать определенный контент в пределах строк и фильтровать таблицу по результатам поиска. Пакет django-filter можно легко использовать поверх пакета django-tables2, чтобы получить эту возможность.


env > mysite > mysite > settings.py


INSTALLED_APPS = [
    ...
    'django_filters',
]

Добавьте Django-фильтры в установленные приложения. Обратите внимание, что в этом списке они называются django_filters, а не django_filter.


env > mysite > main > (новый файл) filters.py


import django_filters
from .models import MyModel

class MyFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = MyModel
        fields = {'name', 'email'}

Теперь создайте в папке приложения — в main, новый файл с именем filters.py, и импортируйте django_filters. После чего укажите модель и поля модели, по которым вы хотите делать фильтрацию.


Вы решаете добавить django_filters.CharFilter в класс, где в примере выше фильтр отображает любые строки, в которых столбец name содержит указанный запрос.


Также вы можете использовать django_filters.CharFilter(lookup_expr='iexact'), если собираетесь фильтровать только по строгому совпадению с запросом.


env > mysite > main > views.py (представления-классы)


...
from django_tables2 import SingleTableMixin
from django_filters.views import FilterView

from .models import MyModel
from .tables import MyTable
from .filters import MyFilter

class ListView(SingleTableMixin, FilterView):
    model = MyModel
    table_class = MyTable
    template_name = 'main/table.html'
    filterset_class = MyFilter

Затем, в случае представления-класса, импортируйте FilterView из django_filters.views в верхней части файла и измените импорт django_tables2 с SingleTableView на SingleTableMixin. Также вам нужно будет импортировать свой кастомный фильтр из файла filter.py.


Представление-класс ListView теперь будет наследоваться от SingleTableMixin и FilterView и содержать атрибут filterset_class, которому присваивается кастомный фильтр.


env > mysite > main > templates > main > table.html


{% load render_table from django_tables2 %}

<div>
    <br>
    <form action="" method="GET">
        {{filter.form}}
        <button type="submit">Filter</button>
    </form>
    <br>
    {% render_table table %}
</div>

С представлениями-классами URL останется тем же, но вам нужно будет добавить HTML-элемент form и использовать язык шаблонов Django, чтобы вызывать фильтр и форму внутри шаблона. Также внутри формы вам нужна кнопка типа submit, чтобы отправлять свои запросы на фильтрацию. В способе рендеринга таблицы нет никаких изменений.


env > mysite > main > views.py (представления-функции)


...
from django_tables2.views import SingleTableMixin
from django_filter import FilterView

from .models import MyModel
from .tables import MyTable

def list(request):
    model = MyModel.objects.all()
    filterset_class = MyFilter(request.GET, model)
    table = MyTable(filterset_class.qs)
    return render(request=request, template_name="main/table.html", context={"model":model, "table":table, "filterset_class":filterset_class})

При использовании представлений-функций импортируйте те же классы, что и в случае с представлениями-классами, затем создайте экземпляр класса MyFilter и передайте в качестве аргументов атрибут «GET» запроса и модель. Передайте filterset_class как аргумент, содержащий выборку объектов (прим. пер.: queryset) в таблице, а потом укажите filterset_class в качестве контекста в вызове функции render.


env > mysite > main > templates > main > table.html


{% load render_table from django_tables2 %}

<div>
    <br>
    <form action="" method="GET">
        {{filterset_class.form}}
        <button type="submit">Filter</button>
    </form>
    <br>
    {% render_table table %}
</div>

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


Если вы собираетесь стилизовать форму, то либо прокрутите страницу вверх до раздела Django Crispy Forms, либо кликните на упомянутую ранее статью — «Рендерьте формы с помощью Django Crispy Forms».


(6) Python Decouple


Терминал macOS


(env)User-Macbook:mysite user$ pip install python-decouple

Интерпретатор командной строки Windows


(env) C:\Users\Owner\desktop\code\env\mysite> pip install python-decouple

Последний, и пожалуй, наиболее важный Python-пакет, который мы обсудим — это python-decouple. Этот пакет скрывает ваши конфиденциальные ключи конфигурациии информацию от хакеров.


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


env > mysite > (новый файл) .env


SECRET_KEY =sdjioerb43buobnodhioh4i34hgip
DEBUG =True

env > mysite > mysite > settings.py


from decouple import config

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', cast=bool)

Создайте новый файл с именем .env в папке проекта, затем импортируйте config в файле settings.py. После чего перенесите все настройки конфигурации и переменные, которые вы желаете скрыть, в файл .env и вызывайте каждую переменную, используя python-decouple формат config('variable').


Если вам нужна более подробная информация, посетите страницу «Обеспечьте безопасность конфиденциальных переменных в Django, используя Python Decouple».