Ответы пользователя по тегу Django
  • Redirect в django?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    from django.shortcuts import redirect

    у вас можно модифицировать первую строчку кода вот таким образом:
    from django.shortcuts import render_to_response, redirect
    Ответ написан
    3 комментария
  • Через какой сервис лучше всего организовать рассылку по почте?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Посоветую sparkpost, полтора года назад переводил проекты на основном месте работы на него. Если ничего не изменилось за это время - то там всё ок, на бесплатном аккаунте лимитов - за глаза.
    PYPI package, есть интеграция с Django

    UPD:
    Мда, кое-что за это время всё же изменилось. Полтора года назад лимит на бесплатном аккаунте был 100к писем в месяц, сейчас 15к.
    Ответ написан
    3 комментария
  • Разлогинивание пользователя при повторном входе на другом компьютере?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    https://github.com/pcraston/django-preventconcurre...
    Мельком глянул, принцип работы: уничтожает предыдущую сессию пользователя, если она была, тем самым "разлогинивая" его на предыдущем устройстве.
    Ответ написан
    Комментировать
  • Как установить Python/Django на cPanel?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Можно потратить время более продуктивно, например, с DO

    Сам не люблю, когда вместо ответа на конкретный вопрос начинают критику и восхваление куликом своего болота, но может не стоит оно того - django + shared-хостинг с cPanel? Тем более, как вы пишете, вы уже "обшарили все сайты". Может вы и не хотите сильно углубляться в настройку и администрирование серверов - так и не надо сильно, но базовые скиллы в этом точно никому не помешают - больше и не надо для простой настройки своего дроплета/VPS по пошаговой инструкции.
    Ответ написан
    Комментировать
  • Как сделать переодичные задачи с celery, выставляемые пользователем?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    В той же документации указывается на возможность написания своих классов шедулеров вместо дефолтного PersistentScheduler
    Там же пишут о django-celery-beat - удобном решении для админки, в котором можно редактировать расписание заданий.
    Ответ написан
    Комментировать
  • Как использовать сессии на двух сайтах в django?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Два сайта на разных доменах не могут увидеть куки друг друга (браузер просто не отправит чужие куки), и соответственно - сессию тоже не удастся разделить.

    Если есть ресурсы сделать всё хорошо, то можно заморочиться с OAuth2. Этот протокол, грубо говоря, позволяет авторизоваться на одном из сайтов с помощью другого. Например, так во всём интернетике работает авторизация по соцсетям. Есть хорошая библиотека django-allauth, которая поддерживает авторизацию для очень многих провайдеров.

    Если вам использование какой-нибудь соцсети не подходит (то есть вы сами хотите выступать как провайдер), то в вашем случае я вижу 2 варианта:
    • авторизовываться на одном из этих двух сайтов с помощью второго. То есть, один из сайтов будет провайдером OAuth2
    • то же самое, но сделать для этого отдельный проект (который и будет провайдером OAuth2), чисто для авторизации на ваших двух сайтах. Так работают, например, проекты TM: для авторизации на сайтах habrahabr.ru, geektimes.tu, toster.ru и т.д. используется id.tmtm.ru
    Ответ написан
    Комментировать
  • Демон в celery для django: какнастроить?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Прежде всего хочу обратить внимание вот на это:
    Выбрал вариант с celeryd

    Если вы "выбирали" между celeryd или celerybeat, то тут выбор бессмысленен: celeryd - демон для выполнения заданий, celerybeat - следит за расписанием заданий, отправляя их в заданное время на выполнение. Так что, если у вас есть надобность выполнять задания по расписанию, настраивать надо оба демона.

    Теперь немного ответов на вопросы.

    CELERY_APP - что сюда вписывать?

    Это экземпляр класса celery.Celery, вот путь до него и надо прописать, в формате package[.subpackages].module:variable. Например, у меня есть файл project/celery.py, в котором создаётся экземпляр таким образом:
    from celery import Celery
    
    app = Celery('project')

    И я впишу в CELERY_APP значение project.celery:app
    У вас наверняка подобный код тоже есть в проекте, если вы делали по документации

    И как создать celery-пользователя? Погуглил, но не понял ответа.

    Я для всего проекта использую одного пользователя, того, под которым django выполняется (у меня webapp)

    И почему CELERYD_CHDIR="/opt/Myproject/"? Так и не понял, зачем нужен редирект куда-то (а я так понял, это адрес, куда переместиться во время работы). Зачем это нужно и помешает ли сохранять получаемые данные (сохранять изображения в папках) по относительным адресам в django-проекте?

    Эту опцию не использую, вместо неё у меня используется WorkingDirectory на уровне systemd, но смысл абсолютно тот же.
    Это не редирект, это просто указание рабочей папки, относительно которой будет запускаться ваш демон. При правильной настройке работа проекта в режиме celery-воркера ничем не должна отличаться от работы проекта в веб-режиме. На уровне кода никаких ветвлений на тему "если я демон - то делай так, а если нет - делай эдак" быть не должно (и я даже не знаю, как их вообще делать).

    CELERY_BIN="/usr/local/bin/celery"
    Прошел по пути, никакого celery там не увидел.

    Ну блин, куда вы установите celery, там его исполняемый файл и будет. Например, у меня все python-зависимости, куда входит и celery, установлены в virtual env'е, и путь до него такой: /home/webapp/Env/project-backend-3.5/bin/celery

    2. Что делать после настройки? В документации указано что-то про django-настройки и пояснено значение переменных, прилагается несколько кусков кода, но даже с переводчиком не могу понять их назначения.

    Что делать после того, как я сделаю оба файла celeryd пригодными для работы?

    После настройки - запускать, тестировать, отлаживать. Всё как обычно.

    CELERYD_SU_ARGS="-l"
    Что это? Зачем это?

    Не знаю, и видимо, не нужно. Там даже написано, что не рекомендуется.

    Вот мои конфиги (для systemd), делал на основе конфигов из официальной репы celery.

    Файл сервиса celeryd (/etc/systemd/system/celery.service):
    [Unit]
    Description=Celery Service
    After=network.target redis.target
    
    [Service]
    Type=forking
    User=webapp
    Group=webapp
    EnvironmentFile=-/etc/systemd/celery.conf
    WorkingDirectory=/home/webapp/project_dir/project/src
    PermissionsStartOnly=true
    ExecStartPre=-/bin/mkdir -p ${CELERYD_STATE_DIR}
    ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYD_STATE_DIR}
    ExecStart=/bin/sh -c '${CELERY_BIN} multi start \
        ${CELERYD_NODES} \
        -A ${CELERY_APP} \
        --pidfile=${CELERYD_PID_FILE} \
        --logfile=${CELERYD_LOG_FILE} \
        --loglevel=${CELERYD_LOG_LEVEL} \
        ${CELERYD_OPTS}'
    ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait \
        ${CELERYD_NODES} \
        --pidfile=${CELERYD_PID_FILE}'
    ExecReload=/bin/sh -c '${CELERY_BIN} multi restart \
        ${CELERYD_NODES} \
        -A ${CELERY_APP} \
        --pidfile=${CELERYD_PID_FILE} \
        --logfile=${CELERYD_LOG_FILE} \
        --loglevel=${CELERYD_LOG_LEVEL} \
        ${CELERYD_OPTS}'
    
    [Install]
    WantedBy=multi-user.target


    Файл сервиса celerybeat (/etc/systemd/system/celerybeat.service):
    [Unit]
    Description=CeleryBeat Service
    After=network.target redis.target rabbitmq.target
    
    [Service]
    Type=simple
    User=webapp
    Group=webapp
    EnvironmentFile=-/etc/systemd/celery.conf
    WorkingDirectory=/home/webapp/project_dir/project/src
    PermissionsStartOnly=true
    ExecStartPre=-/bin/mkdir -p ${CELERYBEAT_STATE_DIR}
    ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYBEAT_STATE_DIR}
    ExecStartPre=/bin/rm ${CELERYBEAT_SCHEDULE}
    ExecStart=/bin/bash -c '${CELERY_BIN} beat \
        -A ${CELERY_APP} \
        --workdir=${CELERYBEAT_WORKDIR} \
        --pidfile=${CELERYBEAT_PID_FILE} \
        --logfile=${CELERYBEAT_LOG_FILE} \
        --loglevel=${CELERYBEAT_LOG_LEVEL} \
        --schedule=${CELERYBEAT_SCHEDULE}'
    ExecStop=/bin/systemctl kill celerybeat.service
    
    [Install]
    WantedBy=multi-user.target


    Файл конфигурации сервисов celeryd и celerybeat (/etc/systemd/celery.conf):
    # See
    # http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#available-options
    
    # Common Celery Settings
    CELERY_BIN="/home/webapp/Env/project-backend-3.5/bin/celery"
    CELERYD_USER="webapp"
    CELERYD_GROUP="webapp"
    CELERY_APP="project.celery:app"
    
    # Common env settings
    DJANGO_SETTINGS_MODULE=settings.production
    LC_ALL=ru_RU.UTF-8
    LC_LANG="ru_RU.UTF-8"
    LANG=ru_RU.UTF-8
    
    # Worker settings
    CELERYD_NODES="w1 w2 w3 w4 w5 w6"
    CELERYD_OPTS="-Q:w1 default --autoscale:w1=8,4 \
    -Q:w2 queue2 --autoscale:w2=6,2   \
    -Q:w3 queue3 --autoscale:w3=8,2 \
    ....................
    -Q:w6 queue6 --autoscale:w6=6,2       "
    
    CELERYD_MULTI="multi"
    CELERYD_STATE_DIR="/var/run/celery"
    CELERYD_PID_FILE="/var/run/celery/%n.pid"
    CELERYD_LOG_FILE="/var/log/celery/%n.log"
    CELERYD_LOG_LEVEL="INFO"
    
    # Beat settings
    CELERYBEAT_STATE_DIR="/var/run/celerybeat"
    CELERYBEAT_PID_FILE="/var/run/celerybeat/beat.pid"
    CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"
    CELERYBEAT_LOG_LEVEL="INFO"
    CELERYBEAT_SCHEDULE="/var/run/celerybeat/schedule"
    CELERYBEAT_WORKDIR="/home/webapp/project_dir/project/src"
    Ответ написан
    5 комментариев
  • Как отправить письмо через 5 минут после return?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    В голой Джанге отложенная отправка письма в рамках обработки http-запроса видится мне очень костыльной, в любом случае, делегировать отправку письма каким-нибудь способом нужно внешнему сервису.

    Если письмо отправляется с помощью какого-нибудь сервиса (а не просто SMTP) - наверняка в его API есть возможность отложенной отправки.
    Если используется Celery - опция countdown в помощь.

    UPD:
    Руслан Ежгуров: Если ничего из вышеперечисленного не используется. Celery обычно сложнее интегрировать с проектом, поэтому начните отправлять почту через какой-либо сервис. Из последнего годного, с чем сам работал - SparkPost, для небольших и средних проектов бесплатных лимитов хватает за глаза. Заодно решите проблемы с доставкой/недоверием к вам почтовых сервисов (ну, это сами спамить не будете, а то вас сам спаркпост отрубит быстро).
    Библиотека для интеграции с Python/Django python-sparkpost, в методе отправки сообщения есть возможность отложенной отправки (см. параметр start_time)
    Ответ написан
    2 комментария
  • Не могу сделать связку комментариев в Django?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Если говорить о вьюхе вывода, то сначала надо получать саму "блогозапись", а потом уже по ней фильтровать комментарии, т.е. просто поменять местами 2 строки и дописать фильтр:
    def full_slug(reguest, slug):
        comment_form = CommentForm
        form = comment_form
        te = get_object_or_404(BlogPost, slug=slug)
        comments = Comments.objects.filter(comments_blogpost=te)
        return render(reguest, 'full.html', {'te': te, 'form': form, 'comments': comments, 'username': auth.get_user(reguest).username})
    Ответ написан
  • Может ли Celery писать результат в бд на другом хосте?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Сам недавно разворачивал Celery. Пока тоже всё крутится на одном сервере.
    1. Ваша БД, с которой работает django-проект, и celery result backend - вещи разные. Последнее - это, грубо говоря, хранилище для значений, которые вы можете вернуть из отложенного задания. А БД проекта - это БД проекта, хотя и может так же выполнять функцию result backend'а. Кстати, вы можете вообще не использовать result backend, если не вам не требуется что-то возвращать из заданий.
    2. Рабочие процессы вашего django-проекта и celery-воркеры - одно и то же, только запущенное через разные точки входа. Для веба - это, скорее всего, wsgi.py, для celery, к примеру, celery.py.
    3. Чтобы запустить воркеры на 2м сервере (вместо 1го или в дополнение к нему), вам нужно будет развернуть ваш проект на нем, и сделать всё то же самое, что и на 1м сервере, чтобы заработали celery-воркеры.
    4. помимо подключения в БД, вам также нужно будет озаботиться подключением к брокеру и result backend'у (если используете его). В самом простом случае, как мне видится, никаких IP не надо будет менять - зачем, если сервер БД у вас один, и находится на 1м сервере. Ну разве что вместо 127.0.0.1 нужно будет прописать нормальный адрес.
    Ответ написан
    Комментировать
  • Как автоматически устанавливать значение поля Inline модели в админке?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    А разве это сама Django автоматом не делает? Это поле - связь между двумя моделями, и никаких телодвижений не должно требовать.
    Если имеете, к примеру, страницу добавления сущности Автор в админке, и на ней же инлайны с сущностями Книга - то при добавлении автора и нескольких его книг, в БД создастся 1 запись в таблице авторов, и необходимое количество записей в таблице книг, связанных с этим добавленным автором.
    Ответ написан
    Комментировать
  • Как в Django через ORM сделать SQL-запрос с INNER JOIN?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Вам поможет annotate

    Подробнее вот тут: https://docs.djangoproject.com/en/dev/topics/db/ag...
    Вот вроде неплохой пример с annotate и сортировкой по count(): stackoverflow.com/questions/1396264/how-to-sort-by...
    Ответ написан
  • Django request в модели - как менять ссылку?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Сам с Django работаю недолго, но есть мнение, что модель ничего не должна знать о реквестах. Поэтому я бы урл формировал не в модели, а, например, во views.py
    Ответ написан
    2 комментария