• Почему в России и СНГ так не популярен фреймворк Pyramid?

    Tark
    @Tark
    Pyramid'альный мир
    РНР ведь используют потому, что много разработчиков, а под CMS типа WordPress много няшных плагинов - всё это даёт надежду на быстрый запуск проекта, а вот с пирамидой всё придётся писать самому и с максимальной заточенностью. С другой стороны, вы можете рассказать про сервер о четырёх ядрах с гектаром памяти, который отрабатывает брутальные 30k rps/сутки (было упоминание о таком в одном из вопросов недавно) и скажете, что у вас всё будет работать на VDS с 400 мегабайтами памяти. Какая разница заказчику, на чём написан сервер, если всё работает?

    А что, документация на английском как-то затрудняет изучение?
    Ответ написан
    Комментировать
  • Как "прикрутить" простую авторизацию к flask-admin?

    Tark
    @Tark
    Pyramid'альный мир
    Ну... Первое, что приходит в голову, это сохранение данных для входа в переменных.

    def logged_in():
        # в сессии будет храниться информация о том, что пользователь вошёл
        return session.get('logged')
    
    # от этого класса должны наследоваться все классы админки - кроме индекса
    class MyView(BaseView):
        def is_accessible(self):
            return logged_in()
    
        def _handle_view(self, name, **kwargs):
            if not logged_in():
                # делать редирект в некоторых случаях не стоит
                return self.render('admin/login.html')
    
    class AdminIndex(AdminIndexView):
        @expose('/', methods=['GET', 'POST'])
        def index(self):
            if request.method == 'POST':
                frm = request.form.get
                login = frm('login')
                password = frm('pass')            
    
                # проверяете введённые данные...
                if ...
                    session.update({обновляете сессию})
                    session.modified = True
                    return self.render('admin/index.html')
                else:
                    return self.render('admin/login.html',
                                       error=u'Ошиблись паролем?..')
            # уже вошёл, но перешёл на /admin/
            if logged_in():
                return self.render('admin/index.html')
            return self.render('admin/login.html')
    
        # остальные методы класса


    А с чем возникли сложности?
    Ответ написан
    Комментировать
  • Как убрать Bad Request?

    Tark
    @Tark
    Pyramid'альный мир
    Дело в том, что если чекбокс не отмечен, то никакого параметра в POST/GET не передаётся.

    if request.form['op2']:  # Ой!
        pass
    
    if request.form.get('op2'):  # так гораздо лучше
        pass
    Ответ написан
  • Что эффективнее для небольшого приложения: C++ или Python?

    Tark
    @Tark
    Pyramid'альный мир
    Если вы хотите использовать SQLite, то выборка данных будет занимать намного больше времени, чем отрисовка данных на экране. Питон в 35 раз медленнее С++ в синтетических тестах, но разница между программами-скриптами при использовании файловой СУБД будет сравнима с погрешностью измерений. Берите Python, не сомневайтесь!
    Ответ написан
  • Mongo и PHP. Можно ли подсчитать кол-во вложенных документов ?

    Tark
    @Tark
    Pyramid'альный мир
    Подсчитать количество можно, используя механизм... аггрегации. Посмотрите на результат выполнения этого запроса:

    db.коллекция.aggregate([
        {'$match': запрос},
        {'$unwind': '$answer'},
        {'$group': {'_id': '$answer', 'number': {'$sum': 1}}}
    ]);


    Если нужно подсчитать количество вложенных документов в списке документов, а не только в одном, придётся немного расширить запрос.

    А что значит "реализовать поиск/отбор по вложенным документам"?
    Ответ написан
    5 комментариев
  • Как и куда правильно передавать соедние к базе данных в Tornado?

    Tark
    @Tark
    Pyramid'альный мир
    По логике вещей, модуль импортируется один раз - несмотря на то, сколько раз он был импортирован внутри скриптов приложения. Иначе это было бы несколько страшновато: я сам создаю соединение с базой данных в одном скрипте и заодно там же быстренько забираю нужную информацию из БД.

    Соединение с БД одно на весь воркер, инстанс приложения, если не сказано обратное (если вы не создаёте пул соединений внутри приложения). А если так, то какая разница, как это делать? В Торнадо принято так? Ну значит так и стоит сделать.
    Ответ написан
    Комментировать
  • Как сделать двойную группировку в MongoDB?

    Tark
    @Tark
    Pyramid'альный мир
    Есть $unwind, который разворачивает списки. К сожалению, пустые списки будут проигнорированы. $addToSet добавляет в набор только уникальные значения, лучше использовать $push, который суёт в список всё, что ему дадут.

    Чтобы в дате указать начало дня, можно воспользоваться $match: {created_at: {$regex: '*00:00:00*'}}
    Ответ написан
    Комментировать
  • Как перегрузить __getattribute__ класса через декоратор в Python?

    Tark
    @Tark
    Pyramid'альный мир
    А чего именно вы хотите достичь? Чтобы можно было... что? Вы часто и помногу переопределяете функцию __getattribute__ и вам хочется сократить код? Тогда как вариант...

    from functools import wraps
    
    
    def wrap(f):
        def tmp(self, name):
            # print name
            if name == 'test':
                return 'some test'
            elif name == 'another':
                return 'another test'
            else:
                return f.__call__(object, name)
        return tmp
    
    
    class Some(object):
        def __init__(self):
            self.some_value = 10
    
        @wrap
        def __getattribute__(self, name):
            if name == 'test1':
                return 'test string'
            return object.__getattribute__(self, name)
    
    value = Some()
    print value.test
    print value.another
    print value.test1


    ... выведет:
    some test
    another test
    test string


    ВАЖНОЕ УТОЧНЕНИЕ: я пришёл в Питон, когда уже была версия 2.7.2 и с ранними версиями не работал.
    ----------------------

    Ответили уже, как вижу. А я дописал декоратор так, чтобы оно работало, лол.

    # encoding: utf-8
    
    
    def wrap(f):
        def tmp(self, name):
            arg, lang = name.split('_')
            try:
                return object.__getattribute__(self, name)
            except AttributeError:
                return object.__getattribute__(self, arg)
        return tmp
    
    
    class Some(object):
        def __init__(self):
            self.language = 'Language'
            self.language_ru = u'Язык'
    
        @wrap
        def __getattribute__(self, name):
            return object.__getattribute__(self, name)
    
    value = Some()
    print value.language_ru
    print value.language_ch
    Ответ написан
  • Cервис бронирования на Node.js + MongoDB. Как хранить даты для максималь удобного поиска?

    Tark
    @Tark
    Pyramid'альный мир
    Возможно, лучше будет хранить в формате UTC гггг-мм-дд чч.мм.сс: тогда запрос "на день" можно сделать {'date': {'$regex': '^2014-04-20'}} и сразу же всё и получить.
    Ответ написан
  • Использование requests и кодировка полученной страницы - как исправить проблемы с русскими символами?

    Tark
    @Tark
    Pyramid'альный мир
    Если сделать
    r = requests.get('http://da.ru')
    print r.encoding

    то окажется, что кодировка там брутальная ISO-8859-1

    for y in parsed_body.xpath("//a"):
        url = y.get("href")
        anchor = y.text
        if anchor:
            print url, anchor.encode(r.encoding)

    Так всё нормально. Правда, у меня Python 2.7.3
    Ответ написан
    Комментировать
  • Как оптимизировать пересечение списка значений MongoDB?

    Tark
    @Tark Автор вопроса
    Pyramid'альный мир
    Мда. Использовался драйвер pymongo версии 2.5.2. Установил последний, 2.6.3, время получения данных сократилось до 3 мс, с пересечением - до 4 мс. Результат считаю удовлетворительным, а вопрос - закрытым. Эх!
    Ответ написан
    Комментировать