Как я научился ненавидеть 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. Мне дали пару хороших советов и подсказок. И я решил поделиться ссылкой на видео курсы по Python. Как по мне очень интересно. https://www.youtube.com/watch?v=UQi-L-_chcc&feature=fvst

20 сентября в офисе Яндекса пройдет научно-технический семинар, на котором Эдуард Бортников, исследователь из Yahoo! Research, выступит с докладом "Предсказание «узких мест» при выполнении команд в кластерах MapReduce". Эдуард расскажет, как предсказать замедления в инфраструктуре MapReduce с помощью машинного обучения и как с помощью предсказаний ускорить выполнение задач. После семинара будет возможность задать вопросы и пообщаться с докладчиком лично. Семинар пройдет на русском языке в офисе Яндекса по адресу ул. Льва Толстого, 16. Регистрация обязательна: Your text to link...

Здравствуйте, я полный новичок в Python и хочу все выучить сам. Книг нашел не очень много, есть только несколько видео из Ютуба, типа этого.

https://www.youtube.com/watch?v=QaYAOR4Jq2E&list=SPB10458C176C55C88&index=1&feature=plpp_video



Может кто-то подкинет ссылок на видео сайты или ресурсы с книгами.

Строго не судите. Просто родственник попросил сделать за ничего=) Имеются конечно косяки, а в целом работает


#!/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) 

#!/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) 

Строго не судите. Просто родственник попросил сделать за ничего=) Имеются конечно косяки, а в целом работает

Когда приблизительно 1,5 года назад я запустил свой первый сайт в Интернете, написанный мной на Django в порядке изучения технологии, я столкнулся с несколькими досадными неудобствами. Поскольку сайт делался без всякой CMS с использованием простейших доступных мне тогда средств, внесение изменений в вёрстку и содержимое было сопряжено с необходимостью заходить в мою панель на сервере хостинг-провайдера и менять там файлы шаблонов и модули python. Естественно, когда я находился на работе в офисе, я не мог этого сделать, поскольку "прокся" не позволяла мне подобных вольностей - портов с непонятными номерами и программ, работающих по непонятному протоколу SSH... Второе неудобство истекало из первого и умножало его - добавление пункта в главное меню требовало изменения шаблона и файла urls.py. Мне это быстро надоело и через какое-то время я уничтожил указанные проблемы написанием простейшей CMS на Django, которая позволяла мне менять контент и шаблоны через простейшие html- формы собственного изготовления и с использованием интерфейсов Aдминистратора Django. О том, как я поборол проблему корректировки шаблонов и какие задачки при этом пришлось решить - можно почитать тут.

Здравствуйте, уважаемые читатели! Суббота выдаётся хмурой на погоду и я решил не тратить время, а написать сегодня урок. Для изучения нам понадобится ещё раз вспомнить про операторы сравнения, которые мы говорили на прошлой неделе. Прекрасно понимаю, что многим уже не терпится втянуться и быстрее начать программировать что-то серьёзное, но без знания основ будет весьма проблематично двигаться дальше, поэтому, пожалуйста, наберитесь терпения:) Сегодня мы поговорим об одном из важнейших операторов в любом языке программирования. Оператора ветвления if....else

Здравствуй уважаемый читатель. Я хочу предложить тебе возможность постепенного, пошагового изучения универсального языка программирования — Python. Область применения данного языка действительно безгранична — программы, сайты, приложения для телефонов. Всё это можно делать используя язык Python. Язык Python. Курс для начинающих Уроки по языку будут появляться с периодичностью 1–2 раза в неделю. Каждый урок посвящён строго определённой тематики и является неким конспектом по данному вопросу с нескольких авторитетных ресурсов (книги, статьи, видео-уроки) и представлен в наиболее читаемом (по мнению автора) виде. Список уже написанных уроков ты сможешь найти чуть ниже. А пока я расскажу как следить за данным курсом. Вариантов несколько: 1. У курса есть свой собственный RSS канал, на который я рекомендую подписаться 2. У курса есть почтовые рассылки на которые можно подписаться через сайт Python для начинающих