Шесть Python-пакетов, которые рекомендуется использовать в каждом веб-приложении на Django
- воскресенье, 9 августа 2020 г. в 00:27:48
Есть бесчисленное множество Python-пакетов, которые легко добавить в любой проект. Но также есть несколько пакетов, которые вы просто не можете не использовать в любом веб-приложении на Django, потому что они зарекомендовали себя как чрезвычайно полезные и экономящие время.
Мы решили сосредоточиться на тех пакетах, которые в конечном итоге вы будете устанавливать регулярно, и рассказать об установке, а также конфигурациях, необходимых для их приведения в состояние готовности к работе.
В то время как некоторые Python-пакеты предлагают потрясающую функциональность, необходимую для конкретного проекта, пакеты, обсуждаемые ниже, — наиболее ходовые из Django-пакетов.
Но мы не можем перейти к Django-пакетам, не поговорив о веб-фреймворке Django.
Веб-фреймворк состоит из модулей, или пакетов, которые позволяют разработчикам быстро писать веб-приложения без необходимости иметь дело с конкретными деталями протокола и с другими особенностями организации веб-приложения.
Django считается клиент-серверным (прим. пер.: full-stack) веб-фреймворком, в котором база данных, сервер приложения, шаблонизатор, модуль аутентификации и диспетчер аккуратно скомбинированы для создания фреймворка высокого уровня. Эти отдельные компоненты добавляются в момент установки пакета, и зачастую их нужно просто немного настроить, чтобы они правильно функционировали.
Терминал 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, так что продолжим. Нам нужно многое обсудить.
Терминал 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-моделями» для получения более подробной информации.
Терминал 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».
Терминал 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-форм.
Терминал 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 для начинающих».
Терминал 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».
Терминал 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».