Упрощая жизнь c Django

в 15:52, , рубрики: django, python, tools, web-разработка, Веб-разработка, метки: , , ,

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

Пакет направлен на уменьшение необходимого boilerplate при использовании фреймворка джанго. На то, чтобы избавить от необходимости писать одно и то же раз за разом, сделать код короче и выразительней.

Итак, установим пакет:

pip install handy

и начнём. Что же мы получаем используя handy?

1. Избегаем возни с HttpResponse и render_to_response()
с помощью декоратора @render_to():

# Эта вьюха выдаст страницу сгенерированную по шаблону ‘app_name/foo.html’,
# где app_name - имя текущего приложения
@render_to()
def foo(request):
   return {
       'bar': Bar.objects.all()
       # Можно легко переопределить шаблон, HTTP код, тип контента и добавить куки
       'STATUS': 410,
       'CONTENT_TYPE': 'text/plain'
   }

2. JSON-вьюхи в пару строк:

@render_to_json()
def posts_by_tag(request, tag=None):
   posts = Post.object.values().filter(tag=tag)
   return list(posts)

3. И ещё более высокоуровневая обёртка для обработки более сложных асинхронных запросов:

@ajax
@ajax.login_required
@ajax.catch(Post.DoesNotExist)
def enable_post(request):
   post = Post.objects.get(pk=request.GET['id'])

   if post.author != request.user:
       # отправляет {"success": false, "error": "permission_denied"}
       raise ajax.error('permission_denied')

   post.enabled = True
   post.save()
   # ответ {"success": true, "data": null} при успешном выходе

4. Отправляем письмо сгенерированные по шаблону одной строчкой:

render_to_email(article.author.email, 'approved.html', {'article': article})

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

5. Коллекцию полей модели и соответствующих полей форм и виджетов::

DAYS = zip(range(7), 'Sun Mon Tue Wed Thu Fri Sat'.split())

class Company(models.Model):
   phones = StringArrayField('Phone numbers', blank=True, default='{}')
   workdays = IntegerArrayField('Work days', choices=DAYS)

company = Company(phones=['234-5016', '516-2314'], workdays=[1,2,3,4])
company.save()

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

Также есть JSONField для хранения произвольных данных и другие поля.

И ещё:
— middleware, которое срезает ненужные пробелы из html-ответов,
— общий master-slave роутер,
— небольшая обёртка для упрощения логирования,
— и пара текстовых и отладочных утилит

Делитесь опытом

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

Ссылки: Github, PyPi и документация на английском.

Автор: Suor

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js