[python] djnago & pylons
От: monax  
Дата: 08.04.09 18:26
Оценка:
Django уже был опробован на небольших проектах, и, в целом, понравился. Подключение разных ORM и смена шаблонизаторов осталось для меня из разряда магических операций. В остальном же создание нужного мне функционала было удобным и быстрым.

Сейчас решил посмотреть в сторону pylons. У меня на данный момент впечатление складывается более приятное, чем от джанги. Причина — модульная структура, удобный ORM sqlalchemy.

Интересно обсудить кому что понравилось и какие впечатления у кого остались.
Re: [python] djnago & pylons
От: Cyberax Марс  
Дата: 08.04.09 18:37
Оценка: :)
Здравствуйте, monax, Вы писали:

M>Сейчас решил посмотреть в сторону pylons. У меня на данный момент впечатление складывается более приятное, чем от джанги. Причина — модульная структура, удобный ORM sqlalchemy.

M>Интересно обсудить кому что понравилось и какие впечатления у кого остались.
Я посмотрел на pylons — и не увидел его Серьёзно, там собственно pylons'а всего где-то 50 килобайт кода.

Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.
Sapienti sat!
Re: [python] djnago & pylons
От: Daevaorn Россия  
Дата: 08.04.09 18:44
Оценка: 23 (3)
Здравствуйте, monax, Вы писали:

M>Django уже был опробован на небольших проектах, и, в целом, понравился. Подключение разных ORM и смена шаблонизаторов осталось для меня из разряда магических операций. В остальном же создание нужного мне функционала было удобным и быстрым.


M>Сейчас решил посмотреть в сторону pylons. У меня на данный момент впечатление складывается более приятное, чем от джанги. Причина — модульная структура, удобный ORM sqlalchemy.


M>Интересно обсудить кому что понравилось и какие впечатления у кого остались.



Если не нравится некая монолитность джанги, то сейчас набирает популярность такая связка:

— Werkzeug — конвеер обработки запроса и http-related утилиты
— SQLAlchemy — ORM
— Jinja2 — шаблоны
— WTForms — формы
ну и всё остальное по вкусу.

Довольно перспективно.
Re[2]: [python] djnago & pylons
От: DemAS http://demas.me
Дата: 08.04.09 19:12
Оценка:
> Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.

Если хочется все контролировать — есть CherryPy
Posted via RSDN NNTP Server 2.1 beta
Re[2]: [python] djnago & pylons
От: monax  
Дата: 09.04.09 12:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я посмотрел на pylons — и не увидел его Серьёзно, там собственно pylons'а всего где-то 50 килобайт кода.


C>Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.


Не то чтобы хотелось всё контролировать, скорее наоборот, хочу, чтобы за меня уже всё было сделано. Просто хочется, чтобы была возможность менять шаблонизаторы, ОРМы, а также добавлять нужные мне библиотеки классов, если мне что-то ещё нужно в моей работе. Так что не в контроле дело, а в гибкости и дружелюбности. В джанго — да, много готового, и мне это очень нравится. А вот чтобы заменить что-то в джанго — это уже может сопровождаться сложностями (хотя вот недавно видел статью, где тестировали разные шаблонизаторы для джанго — значит можно и менять).
Re: [python] djnago & pylons
От: Foror http://foror.ru
Дата: 07.05.09 15:05
Оценка:
M>Интересно обсудить кому что понравилось и какие впечатления у кого остались.

Я разочаровался в питоне и особенно в джанге... После связки eclipse, maven, java, tapestry5 и hibernate3 как будто вернулся во времена ассемблера
Re[2]: [python] djnago & pylons
От: neFormal Россия  
Дата: 07.05.09 20:15
Оценка:
Здравствуйте, Foror, Вы писали:

M>>Интересно обсудить кому что понравилось и какие впечатления у кого остались.

F>Я разочаровался в питоне и особенно в джанге... После связки eclipse, maven, java, tapestry5 и hibernate3 как будто вернулся во времена ассемблера

а в чём там преимущество в сравнении с джангой?.
...coding for chaos...
Re[3]: [python] djnago & pylons
От: Foror http://foror.ru
Дата: 08.05.09 08:22
Оценка: -3
F>а в чём там преимущество в сравнении с джангой?.

Если общими словами, то tapestry5 более ООП-нее чтоли и проще в понимании. Думал написать по этому поводу небольшую статью, может и напишу, когда будет время свободное. А пока вот небольшой пример — для затравки и флейма

В коде джанго:

class IfEqualNode(Node):
    def __init__(self, var1, var2, nodelist_true, nodelist_false, negate):
        self.var1, self.var2 = Variable(var1), Variable(var2)
        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
        self.negate = negate

    def __repr__(self):
        return "<IfEqualNode>"

    def render(self, context):
        try:
            val1 = self.var1.resolve(context)
        except VariableDoesNotExist:
            val1 = None
        try:
            val2 = self.var2.resolve(context)
        except VariableDoesNotExist:
            val2 = None
        if (self.negate and val1 != val2) or (not self.negate and val1 == val2):
            return self.nodelist_true.render(context)
        return self.nodelist_false.render(context)

def do_ifequal(parser, token, negate):
    bits = list(token.split_contents())
    if len(bits) != 3:
        raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
    end_tag = 'end' + bits[0]
    nodelist_true = parser.parse(('else', end_tag))
    token = parser.next_token()
    if token.contents == 'else':
        nodelist_false = parser.parse((end_tag,))
        parser.delete_first_token()
    else:
        nodelist_false = NodeList()
    return IfEqualNode(bits[1], bits[2], nodelist_true, nodelist_false, negate)

#@register.tag
def ifequal(parser, token):
    """
    Outputs the contents of the block if the two arguments equal each other.

    Examples::

        {% ifequal user.id comment.user_id %}
            ...
        {% endifequal %}

        {% ifnotequal user.id comment.user_id %}
            ...
        {% else %}
            ...
        {% endifnotequal %}
    """
    return do_ifequal(parser, token, False)
ifequal = register.tag(ifequal)


В коде tapestry5:

/**
 *   Outputs the contents of the block if the two arguments equal each other.
 *
 *   Examples::
 *
 *       <t:ifequal val1="user.id" val2="comment.user_id">
 *           ...
 *       <t:endifequal/>
 *
 *       <t:ifequal negate="true" val1="user.id" val2="comment.user_id">
 *           ...
 *           <t:paramenter name="else">
 *               ...
 *           <t:parameter/>
 *       <t:endifequal/>
 */
public class IfEqual {

    @Parameter(required=true)
    private Object val1;

    @Parameter(required=true)
    private Object val2;    

    @Parameter
    private Block _else;
    
    @Parameter
    private boolean negate;
    
    private boolean valueEquals;
    
    Block beginRender() {
        if (val1 != val2) {
            return _else;
        }
        
                valueEquals = true;
        return null;    
    }
    
    boolean beforeRenderBody() {
        return negate ? !valueEquals : valueEquals; 
    }
}


Надеюсь понятно, что я имел ввиду под более ООП-нее? Еще в питоне есть такая штука (которой все хвалятся почему-то) как отсутсвие перезагрузки конструкторов и методов. Т.е. в метод и конструктор можно передавать параметры как угодно и сколько угодно... Знаете, когда начинаешь исследовать чужой код (уровня Django), то это исследование становится кошмаром, помимо того, что не понятно какие типы можно передать в тот или иной метод, еще непонятно, а сколько собственно нужно передать туда параметров, какие есть вариации? И тут сразу вспоминаешь старую, добрую перезагрузку методов и конструкторов, т.к. для читателя-программиста всё очевидно по коду и не нужно лезть в документации или читать код метода, чтобы понять, что ему туда передать, чтобы он не сломался.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.