Как я научился ненавидеть Django Здравствуйте. Попытаюсь формализовать то, что меня постоянно раздражает в Django и заставляет придумывать разнообразные велосипеды и подключать кучу батареек только для того, чтобы сделать работу на данном фреймворке более удобной. Общепринято, что любой web-фреймворк состоит из следующих компонентов: Роутинг Шаблонизатор Формы ORM (если это не микро фреймворк) Работа с протоколом HTTP на уровне запроса и ответа Разнообразные утилиты Заранее оговорюсь, что Dango мне очень нравится, если бы не следующее… 1. Роутинг Представляет из себя стрельбу из пушки по воробьям в виде регулярных выражений. Понятно что с помощью них можно решать ряд нетривиальных задач, но абсолютно нельзя решить то, что дествительно требуется в роутинге. Это такие вещи как автоматическое извлечение данных (например инстанса модели по ее идентификатору), действительно точная валидация данных (а не только знание того, что в параметре будут только цифры). Примеры батареек для улучшения работы с роутингом: django-hosts, routr. 2. Шаблонизатор Шаблонизатор отличается такой килл фичей котрая постоянно раздражает, это написание шаблонных тегов на каждый чих. А также отсутствие обычных выражений, отсутствие обращения к словарю по ключу находящемуся в переменной, отсутствие вызова функции с параметром (без параметра можно), отсутсвие макросов, невозможность определить переменную, только один параметр в фильтре и т.д. Хорошо хоть недавно появилась конструкция elif. Как это можно решить? Заменить шаблонизатор на Jijna 2 (благо с появлением CBV это очень просто). Батарейки: django-jinja, coffin. 3. Формы Они просто нарушают MVC. Для того чтобы определить, например, css класс для поля, нужно передать его в виджет. Не будем же мы заставлять дизайнера править код? Отсутствие FormField делает жизнь еще веселее. Доставляет clean_fieldname который не видит полей, перечисленных позже него. Как это можно решить? Использовать те же WTForms. 4. ORM До сих пор не могу понять, как делается left join и как мне явно указать какой join делать. Ужасное наследование моделей. Из мелочей: отсутствие join по разным базам, невозможность создать модель без первичного ключа. Наконец то появится index_together. Как это можно решить? Использовать ту же peewee. 5. Работа с протоколом HTTP Отсутствие необходимых исключений (в том же WebOb любой HTTP ответ является в том числе и исключением). Неудобное обращений к заголовкам, нвозможность стандартно парсить uri, очень непонятно как получить тело запроса в первоначальном виде и т.д. Как это можно решить? Использовать тот же WebOb. Если все это сделать, что тогда останется от django кроме админки? Как это можно решить? Поставить flask-peewee. Спасибо за внимание.
Записи
добавить записьНедавно передо мной встала задача провести опрос клиентов Hosting4Django. Разместить опрос в социальных сетях не вариант, т.к. большинство клиентов отсутствуют среди подписчиков группы. Разместить новость на сайте? Хорошая идея, но далеко не все просматривают этот раздел. Немного поразмыслив я остановился на электронной почте. Но как сделать опрос, что будет забирать минимум времени клиентов и при этом сохранить эффективность?
Читать дальшеЗдравствуйте, в одном из своих прошлых постов я просил поделиться уроками для Python
20 сентября в офисе Яндекса пройдет научно-технический семинар, на котором Эдуард Бортников, исследователь из Yahoo! Research, выступит с докладом "Предсказание «узких мест» при выполнении команд в кластерах MapReduce".
Эдуард расскажет, как предсказать замедления в инфраструктуре MapReduce с помощью машинного обучения и как с помощью предсказаний ускорить выполнение задач. После семинара будет возможность задать вопросы и пообщаться с докладчиком лично.
Семинар пройдет на русском языке в офисе Яндекса по адресу ул. Льва Толстого, 16. Регистрация обязательна:
Здравствуйте, я полный новичок в Python и хочу все выучить сам. Книг нашел не очень много, есть только несколько видео из Ютуба, типа этого.
Может кто-то подкинет ссылок на видео сайты или ресурсы с книгами.
Блог им. duke565 → Скрипт для сортировки файлов(изображений) , собирающий их в отдельный папки в зависимости от даты
Строго не судите. Просто родственник попросил сделать за ничего=) Имеются конечно косяки, а в целом работает
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##########################################################################################################
'''
by duke565
Скрипт для сортировки изображений. Собирает файлы из папок и подпапок и разбрасывает их
по папкам указывая на них дату создания'''
##########################################################################################################
import os
from shutil import move
import time
##########################################################################################################
dirname = '/home/duke565/splav_2/' # основаная директория
try:
newdir = '/home/duke565/splavS/' # куда сложить
OrigNewDir = newdir
except:
newdir = dirname
def image_sort(dirname, newdir, recur= 0):
if not recur:print 'sorting started ...'
else: print 'sorting started in %s...'%dirname
if not newdir: newdir = dirname
imagelist = []
if os.path.isdir(dirname): #если это папка то
for x in os.listdir(dirname):
absx = dirname+os.sep+x # absx - путь до файла
if os.path.isfile(absx):
imagelist.append(absx) # если это файл, то записывает путь в лист
else:
image_sort(absx, newdir+os.sep+x, recur=1) #
for name in imagelist:
try:
file_date = time.localtime(os.stat(name).st_mtime)
except EnvironmentError, error:
print 'seems error: %s with '%error, name, '/n'
continue
imdir = '%s--%02d--%02d'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
imdir = os.path.join(OrigNewDir,imdir)
if os.path.split(dirname)[-1] == os.path.split(imdir)[-1]:
continue
elif not os.path.exists(imdir):
print 'making dir %s'%imdir
os.makedirs(imdir)
head,tail = os.path.split(name) # split orig path
replica = os.path.join(imdir,tail) #path file in new folder
if os.path.isfile(replica): # if file true then rename old
to_ext = '.JPG'
if to_ext[0] != '.':
to_ext = '.'+to_ext
root, ext = os.path.splitext(tail)
print "Renaming", tail, "to", root+'_1'+ext
path_orig = os.path.join(head, tail)
path_new = os.path.join(head, root+'_1'+to_ext)
os.rename(path_orig, path_new)
imagelist.append(path_new)
else:
try:
print '\n MOVE "%s" "%s"'%(name,imdir)
move(name,imdir)
except EnvironmentError:
print '\n Error with '+ name,
if not recur:
for root, dirs, files in os.walk(dirname):
if not files:
for name in dirs:
os.rmdir(os.path.join(root,name))
print 'sorting completed!'
image_sort(dirname, newdir)
Блог им. duke565 → Скрипт для сортировки файлов(изображений) , собирающий их в отдельный папки в зависимости от даты
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##########################################################################################################
'''
by duke565
Скрипт для сортировки изображений. Собирает файлы из папок и подпапок и разбрасывает их
по папкам указывая на них дату создания'''
##########################################################################################################
import os
from shutil import move
import time
##########################################################################################################
dirname = '/home/duke565/splav_2/' # основаная директория
try:
newdir = '/home/duke565/splavS/' # куда сложить
OrigNewDir = newdir
except:
newdir = dirname
def image_sort(dirname, newdir, recur= 0):
if not recur:print 'sorting started ...'
else: print 'sorting started in %s...'%dirname
if not newdir: newdir = dirname
imagelist = []
if os.path.isdir(dirname): #если это папка то
for x in os.listdir(dirname):
absx = dirname+os.sep+x # absx - путь до файла
if os.path.isfile(absx):
imagelist.append(absx) # если это файл, то записывает путь в лист
else:
image_sort(absx, newdir+os.sep+x, recur=1) #
for name in imagelist:
try:
file_date = time.localtime(os.stat(name).st_mtime)
except EnvironmentError, error:
print 'seems error: %s with '%error, name, '/n'
continue
imdir = '%s--%02d--%02d'%(file_date.tm_year,file_date.tm_mon,file_date.tm_mday)
imdir = os.path.join(OrigNewDir,imdir)
if os.path.split(dirname)[-1] == os.path.split(imdir)[-1]:
continue
elif not os.path.exists(imdir):
print 'making dir %s'%imdir
os.makedirs(imdir)
head,tail = os.path.split(name) # split orig path
replica = os.path.join(imdir,tail) #path file in new folder
if os.path.isfile(replica): # if file true then rename old
to_ext = '.JPG'
if to_ext[0] != '.':
to_ext = '.'+to_ext
root, ext = os.path.splitext(tail)
print "Renaming", tail, "to", root+'_1'+ext
path_orig = os.path.join(head, tail)
path_new = os.path.join(head, root+'_1'+to_ext)
os.rename(path_orig, path_new)
imagelist.append(path_new)
else:
try:
print '\n MOVE "%s" "%s"'%(name,imdir)
move(name,imdir)
except EnvironmentError:
print '\n Error with '+ name,
if not recur:
for root, dirs, files in os.walk(dirname):
if not files:
for name in dirs:
os.rmdir(os.path.join(root,name))
print 'sorting completed!'
image_sort(dirname, newdir)
Строго не судите. Просто родственник попросил сделать за ничего=) Имеются конечно косяки, а в целом работаетБлог им. Andrejus → Работаем с шаблонами Django без использования файлов шаблонов в файловой системе
Когда приблизительно 1,5 года назад я запустил свой первый сайт в Интернете, написанный мной на Django в порядке изучения технологии, я столкнулся с несколькими досадными неудобствами. Поскольку сайт делался без всякой CMS с использованием простейших доступных мне тогда средств, внесение изменений в вёрстку и содержимое было сопряжено с необходимостью заходить в мою панель на сервере хостинг-провайдера и менять там файлы шаблонов и модули python. Естественно, когда я находился на работе в офисе, я не мог этого сделать, поскольку "прокся" не позволяла мне подобных вольностей - портов с непонятными номерами и программ, работающих по непонятному протоколу SSH... Второе неудобство истекало из первого и умножало его - добавление пункта в главное меню требовало изменения шаблона и файла urls.py. Мне это быстро надоело и через какое-то время я уничтожил указанные проблемы написанием простейшей CMS на Django, которая позволяла мне менять контент и шаблоны через простейшие html- формы собственного изготовления и с использованием интерфейсов Aдминистратора Django. О том, как я поборол проблему корректировки шаблонов и какие задачки при этом пришлось решить - можно почитать
Здравствуйте, уважаемые читатели! Суббота выдаётся хмурой на погоду и я решил не тратить время, а написать сегодня урок. Для изучения нам понадобится ещё раз вспомнить про
Здравствуй уважаемый читатель. Я хочу предложить тебе возможность постепенного, пошагового изучения универсального языка программирования — Python. Область применения данного языка действительно безгранична — программы, сайты, приложения для телефонов. Всё это можно делать используя язык Python.
Язык Python. Курс для начинающих
Уроки по языку будут появляться с периодичностью 1–2 раза в неделю. Каждый урок посвящён строго определённой тематики и является неким конспектом по данному вопросу с нескольких авторитетных ресурсов (книги, статьи, видео-уроки) и представлен в наиболее читаемом (по мнению автора) виде. Список уже написанных уроков ты сможешь найти чуть ниже. А пока я расскажу как следить за данным курсом.
Вариантов несколько:
1. У курса есть свой собственный RSS канал, на который я рекомендую