За время использования 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