Django уже был опробован на небольших проектах, и, в целом, понравился. Подключение разных ORM и смена шаблонизаторов осталось для меня из разряда магических операций. В остальном же создание нужного мне функционала было удобным и быстрым.
Сейчас решил посмотреть в сторону pylons. У меня на данный момент впечатление складывается более приятное, чем от джанги. Причина — модульная структура, удобный ORM sqlalchemy.
Интересно обсудить кому что понравилось и какие впечатления у кого остались.
Здравствуйте, monax, Вы писали:
M>Сейчас решил посмотреть в сторону pylons. У меня на данный момент впечатление складывается более приятное, чем от джанги. Причина — модульная структура, удобный ORM sqlalchemy.
M>Интересно обсудить кому что понравилось и какие впечатления у кого остались.
Я посмотрел на pylons — и не увидел его
Серьёзно, там собственно pylons'а всего где-то 50 килобайт кода.
Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.
> Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.
Если хочется все контролировать — есть CherryPy
Posted via RSDN NNTP Server 2.1 beta
Здравствуйте, Cyberax, Вы писали:
C>Я посмотрел на pylons — и не увидел его Серьёзно, там собственно pylons'а всего где-то 50 килобайт кода.
C>Т.е. pylons рулит, если хочется всё самому контролировать, а DJango даёт кучу всего готового.
Не то чтобы хотелось всё контролировать, скорее наоборот, хочу, чтобы за меня уже всё было сделано. Просто хочется, чтобы была возможность менять шаблонизаторы, ОРМы, а также добавлять нужные мне библиотеки классов, если мне что-то ещё нужно в моей работе. Так что не в контроле дело, а в гибкости и дружелюбности. В джанго — да, много готового, и мне это очень нравится. А вот чтобы заменить что-то в джанго — это уже может сопровождаться сложностями (хотя вот недавно видел статью, где тестировали разные шаблонизаторы для джанго — значит можно и менять).
M>Интересно обсудить кому что понравилось и какие впечатления у кого остались.
Я разочаровался в питоне и особенно в джанге... После связки eclipse, maven, java, tapestry5 и hibernate3 как будто вернулся во времена ассемблера
Здравствуйте, Foror, Вы писали:
M>>Интересно обсудить кому что понравилось и какие впечатления у кого остались.
F>Я разочаровался в питоне и особенно в джанге... После связки eclipse, maven, java, tapestry5 и hibernate3 как будто вернулся во времена ассемблера
а в чём там преимущество в сравнении с джангой?.
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), то это исследование становится кошмаром, помимо того, что не понятно какие типы можно передать в тот или иной метод, еще непонятно, а сколько собственно нужно передать туда параметров, какие есть вариации? И тут сразу вспоминаешь старую, добрую перезагрузку методов и конструкторов, т.к. для читателя-программиста всё очевидно по коду и не нужно лезть в документации или читать код метода, чтобы понять, что ему туда передать, чтобы он не сломался.