• Как правильно упаковать Python приложения в DEB пакет?

    @marazmiki
    Укротитель питонов
    stdeb, например?
    Ответ написан
    Комментировать
  • Почему данные не сохраняются в БД MySQL?

    @marazmiki
    Укротитель питонов
    Поди, таблица в mysql создана в LATIN1?
    Ответ написан
    3 комментария
  • Как вывести сразу две переменные в шаблон django?

    @marazmiki
    Укротитель питонов
    В контекст шаблона передаётся словарь, ключи которого и есть переменные. Прекрасно подойдёт и вьюха, и шаблонный тег, и даже контекст-процессор.
    Ответ написан
    3 комментария
  • True False сортировка в Django?

    @marazmiki
    Укротитель питонов
    Попробуйте так:

    # urls.py
    url(r'^rozdil/true', 'wiki.views.stats', kwargs={'is_main': True}),
    url(r'^rozdil/false', 'wiki.views.stats', kwargs={'is_main': False}),
    Ответ написан
    3 комментария
  • Как декодировать пароль в Django?

    @marazmiki
    Укротитель питонов
    А зачем, чтобы когда база утечёт, злоумышленник смог легко расшифровать базу? Пароли должны криптоваться необратимо. А под восстановлением пароля обычно понимают создание нового. А старый уходит в историю
    Ответ написан
    2 комментария
  • Как вывести изображение в шаблон Django?

    @marazmiki
    Укротитель питонов
    Добавьте в контекст шаблона список слайдов:
    # views.py
    def slider(request):
        slides = Slide.objects.all()
        return render(request, 'main.html', {'slides': slides})
    а в шаблоне обращайтесь к каждому из слайдов списка
    {# main.html #}
    {% for slide in slides %}
    <div class="item lifted">
        <img class="lazyOwl" data-src="{{ slide.image.url }}">
        <div class="caption-content">
            <h1 class="caption lifted">{{ slide.header }} </h1><br>
            <p class="caption2 lifted">{{ slide.caption }}</p>
        </div>
    </div>
    {% endfor %}
    Ответ написан
    Комментировать
  • Чем отличаются STATIC_ROOT, STATIC_URL, MEDIA_ROOT, MEDIA_URL и подобные?

    @marazmiki
    Укротитель питонов
    В MEDIA_ROOT сохраняются файлы, которые загрузил пользователь. Или которые сгенерировались в результате работы скриптов. А STATIC_ROOT предназначен для хранения "нединамических" файлы, которые самостоятельно не изменяются в процессе работы и являются частью проекта. Стили, скрипты, картинки оформления, шрифты.

    А MEDIA_URL и STATIC_URL — урлы, по которым доступны директории для медиафайлов и статики соответственно

    Что касается слайдера: загружаемые файлы попадут в MEDIA_ROOT. А получить URL каждого кадра можно так:

    <img src="{{ slide.image.url }}">
    Ответ написан
    Комментировать
  • Как сделать ПРОСТУЮ очередь в Celery (Python)?

    @marazmiki
    Укротитель питонов
    Про то, как выполнять асинхронные задачи в последовательности написано в разделе canvas документации по celery. Там же и пример есть (копирую, чтобы сократить время)
    >>> from celery import chain
    # 2 + 2 + 4 + 8
    >>> res = chain(add.s(2, 2), add.s(4), add.s(8))()
    >>> res.get()
    # или даже так
    >>> (add.s(2, 2) | add.s(4) | add.s(8))().get()
    16

    здесь add, если не поняли, задача-пример, которая повсеместно встречается в документации. Она просто складывает два числа. А страшный метод .s() лишь короткая форма записи для .subtask(). В той же документации про canvas обо всём этом сказано в разделе Signatures.

    Что касается повторений заваленных задач, то там всё просто и в документации есть. Единственное, нужно настроить RESULT_URL. Обратите внимание, не BROKER_URL, а именно RESULT, многие почему-то путают
    Ответ написан
    Комментировать
  • Как правильно настроить virtualenvwrapper?

    @marazmiki
    Укротитель питонов
    Далее перехожу в папку с кодом проекта ~/web/proj и по-моему мнению у меня уже должно быть запущено виртуальное окружение

    Не должно. Автоматическая активация виртуальных окружений реализована в хороших решениях, а не бесполезных поделках типа виртуалэнввраппера :-)

    Как по мне, единственный плюс (хотя ещё как посмотреть, плюс ли это) виртуалэнввраппера — это то, что все виртуальные окружения хранятся в одной директории.

    Я считаю гораздо более удобной модель, которую Вы по сути описали: когда виртуальное окружение лежит непосредственно в директории проекта, разумеется, под гитигнором. И при входе в директорию проекта окружение автоматически активируется. При выходе, соответственно, деактивируется. Тоже автоматически.

    Пользуюсь этим подходом больше трёх лет, доволен как слон и искренне не понимаю тех, кто восторгается virtualenvwrapper'ом.
    Ответ написан
    6 комментариев
  • Почему django rest framework отвечает 401?

    @marazmiki
    Укротитель питонов
    Всё идёт ровно так, как и должно идти, и нет тут ни магии, ни волшебства (ну, разве чуть-чуть: в идеале нигде не должно работать, даже на убунте). И вот почему.

    Как Вы наверняка знаете, в обычном, привычном нам вебе, к коему относятся и ручные запросы из браузера, для идентификации клиента придумали такую штуку, как сессия: при первом посещении сервер выдаёт клиенту идентификатор, который клиент затем будет добавлять к каждому запросу (в случае джанги это сессионная кука sessionid). И на своей стороне создаёт хранилище для информации о конкретно этом клиенте.

    При каждом запросе сервер проверяет, передан ли от клиента тем или иным способом —а чаще всего это кука — ID сессии. Если передан, то сервер "опознаёт" пользователя. Если нет, то нет :-) Кука добавляется к запросу самим браузером, без явного участия пользователя, поэтому для нас, людишек, всё выглядит как будто само собой.

    Теперь про REST. Обычно API пишется чаще всего не для браузеров, а для сторонних серверов, в которых и кук-то зачастую не бывает. И такого понятия, как сессия, просто нет! Каждый запрос приходит как будто он от нового пользователя. Здесь идентифицироваться приходится ручками.

    Самый простой, но вместе с тем и самый глупый вариант — вместе с каждым запросом посылать логин и пароль. Другой не самый умный, но почему-то часто встречающийся вариант — захардкоженный секретный параметр: типа если в запросе есть переменная abcdef=123, то запрос считается достоверным.

    Логическое продолжение этого способа — та самая аутентификация через токены, которую Вы то включаете, то выключаете. Пользователь шлёт логин и пароль на отдельный URL, в ответ получает токен, который затем должен добавлять вручную к каждому запросу. Что-то напоминает, верно? :-)

    В случае с либеральным DRF можно наплевать на рекомендуемый принцип stateless — не сохранять информацию о состоянии клиента — и добавить поддержку сессий: т.е. сделать так, что если в запросе передаётся кука (а любой браузерный запрос, даже через XHR их вроде бы добавляет), то сервер должен определять пользователя.

    Включается это довольно просто: нужно использовать
    rest_framework.authentication.SessionAuthentication в качестве аутентификатора. Лучше всего сделать глобальную настройку (в документации всё есть), либо указать этот класс для отдельного endpoint.
    Ответ написан
  • Как совместить PHP-библиотеку и Rails-приложение?

    @marazmiki
    Укротитель питонов
    Ключевое слово — API :)

    Пусть rails-приложение будет, к примеру, сервером и по оговоренному адресу ожидать входящих данных. А php-приложение вместо того, чтобы слать email, шлёт HTTP-запрос на сервер rails.
    Ответ написан
    Комментировать
  • Как получить url в django?

    @marazmiki
    Укротитель питонов
    request.path, либо request.path_info
    Ответ написан
    Комментировать
  • Разница, что лучше/удобнее Django-cms ИЛИ FeinCMS ИЛИ Mezzanine?

    @marazmiki
    Укротитель питонов
    Мне кажется, что "лучше" или "удобнее" — субъективные метрики. И не очень абсолютные. К примеру, меня бесит grappelli (приложение, изменяющее внешний вид админки), а кому-то она наоборот нравится. Mezzanine, насколько я помню, grappelli использует. Мне это покажется дичайшим минусом, а кому-то плюсом.

    Личный опыт: довелось довольно плотно поработать с django-cms и fein. Они, в общем-то работают по одному принципу, хотя и используют разную терминологию (django-cms для расширения функциональности страницы плагины, которые помещаются в плейсхолдеры, а fein — контент-тайпы и области соответственно), суть примерно одна. Хоть и слегка по-разному реализовано.

    Сейчас ключевое отличие djnago-cms и fein в том, что первая, начиная вроде бы с версии 3.х, перешла целиком на фронтэнд-редактирование контента. Админки как таковой нет, вместо неё редирект на страницу с включенным редактированием. А Фейн управляется из админки, как и django-cms ранних версий.

    Для программиста обе cms относительно удобны и легки для разработки и предоставляют интерфейс для написания плагинов (или контент-тайпов, в зависимости от). Но если лезть глубоко под капот, то в django-cms всё гораздо сложнее в плане моделей и отношений. Поэтому очень мудрым шагом со стороны её разработчиков было предоставить "низкоуровневое" апи с функциями вида create_page(), которое на деле создаёт десяток записей в десяти таблицах :-)

    По поводу удобства редактирования контента, опять же субъективно: оба ужасны. Наверное, фейн даже в большей степени. Но при этом он более очевиден. Чего не скажешь о фронтэнд-редактировании django-cms, где вообще без поллитры не разобраться: сначала перевести страницу в режим редактирования, потом переключить непонятный тумблер контент\структура (или что-то такое, сейчас точно не помню), потом выбрать редактируемый плагин... потом не запутаться в кнопках сохранения и публикации, и так далее. Мой коллега придерживается мнения, что показывать такое пользователям просто нельзя.

    Кстати, пользователь легко сможет сломать дерево сайта (вплоть до вызова 500-й вместо захода на любую из страниц), просто активно перетаскивая в админке ноды дерева туда-сюда. Это касается и fein, и django-cms.

    Что до mezzanine. Запомнилось так: использует grappelli, зачем-то есть встроенные магазин и блог, которые сааавсем не на каждом сайте нужны. Плюсов не запомнил, снёс. Хотя сейчас, открыв ради любопытства документацию, вижу что-то про custom content types, так что, вероятно, будет всё то же самое, что и fein/django-cms, но в зелевноватых тонах grappelli. И с магазином :-)
    Ответ написан
    1 комментарий
  • Как в django-rest-framework переопределить Content-Type ответа?

    @marazmiki
    Укротитель питонов
    Мне кажется, что самый правильный ответ — не надо этого хотеть. Ни первое, ни, тем более, второе.
    Ответ написан
  • Heroku не видит ключа. Что делать?

    @marazmiki
    Укротитель питонов
    Рискну предположить, что сложность из-за кириллического юзернейма (точнее, пути к его домашней директории).
    Ответ написан
    Комментировать
  • Можно ли реализовать вычисление значения поля непосредственно в модели?

    @marazmiki
    Укротитель питонов
    Переделать-то можно, но тогда это это поле придётся добавлять в схему. А заполнять при сохранении:
    class Zzz(Superclass):
        aaa = models.ForeignKey(Aaa)
        bbb = models.ForeignKey(Bbb)
        ccc = models.ForeignKey(Ccc)
        # Объявили поле и на всякий случай запретили редактировать его из админки или через форму.
        ddd = models.IntegerField(editable=False, default=0) 
    
        @property
        def eee(self):
            return self.aaa, self.bbb, self.ccc
    
        def save(self, *args, **kwargs):
            # Непосредственно перед физическим сохранением вычисляем значение поля
            self.ddd = reduce((lambda x, y: x + y), [e.some_param for e in self.eee])
            return super(Zzz, self).save(*args, **kwargs)
    Ответ написан
    Комментировать
  • Javascript формы для django-rest-framework?

    @marazmiki
    Укротитель питонов
    Не очень понятно, на самом деле, каким образом использование DRF исключает использование форм :)

    Но если речь идёт о сервисе, "толстом клиенте" и бэкенде, который целиком RESTовый (где в принципе нет джангиных шаблонов), то самое простое — делать OPTIONS-запрос на страницу ресурса. Он в ответ выдаст схему, по которой довольно просто можно сгенерировать HTML. Наверняка и готовые решения есть по построению форм на основе JSON-схем.

    В случае angularjs схема вполне жизнеспособна.
    Ответ написан
  • Почему не подхватывается изображение в Django?

    @marazmiki
    Укротитель питонов
    Ребята в общем-то всё правильно сказали о раздаче статики. Я бы хотел дополнить топик ещё одним решением, которое мне нравится больше. Заключается оно в использовании wsgi-миддльвари dj-static.

    Чтобы подключить статику, нужно дописать в wsgi.py проекта
    from django.core.wsgi import get_wsgi_application
    from dj_static import Cling, MediaCling
    
    application = Cling(MediaCling(get_wsgi_application()))

    и всё. Править urls.py не надо.

    Очевидные плюсы — этой штукой можно раздавать статику даже в продакшн-окружении. Те, кто размещал джанго-проекты на хостинге heroku, так и поступают. И, как упоминалось выше, не нужно вносить дополнительные девелоперские url-схемы в urls.py.

    Очевидные минусы — дополнительная зависимость (хотя разве ж это минус?). Ставится через pip:

    $ pip install dj-static
    Ответ написан
    1 комментарий
  • Какую технологию выбрать для асинхронной передачи данных?

    @marazmiki
    Укротитель питонов
    Ответ написан
    Комментировать
  • Список стран и городов для профиля User в Django?

    @marazmiki
    Укротитель питонов
    Не уверен, есть ли прям такое готовое (если и есть, то это, на мой взгляд, идеологически неверно). Но легко собрать из отдельных батареек.

    Например, список стран есть в django-countries. Там, кажется, и флаги были. Решений по связанным селектам куча. Вот несколько штук из Гугла, которые вроде бы обновляются:

    django-clever-selects
    django-smart-selects
    django-selectable (отдельно про связанные списки)

    Базы городов... Вероятнее всего, искать нужно в открытых источниках типа geonames. Для него, к слову, и джанговая батарейка есть
    Ответ написан
    1 комментарий