• SOA и django. Как расшарить юзеров/группы/токены на несколько бекэндов?

    Tiendil
    @Tiendil
    Разработчик ПО.
    А OAuth не подойдёт (или вариация на эту тему)? Т.е. юзеры хранятся в одном сервисе, а другие обращаются к нему за разрешениями.

    Гуглить можно начать на тему Authentication/Authorization server.

    Имхо, самый простой вариант — это просто экспортировать юзеров во все сервисы.

    Ещё одно решение — вынести всю инфу по ним в отдельную базу и дать всем серсивам readonly доступ.
    Ответ написан
    Комментировать
  • Каким образом лучше организовать API-библиотеку?

    Tiendil
    @Tiendil
    Разработчик ПО.
    KISS

    1. Если библиотека работает с телнетом, логично использовать специализированную либу.
    2. Если метод инкапсулирует все низкоуровневые операции по обработке соединения и передачи данных, то ОК.
    3. Если Вы портируете библиотеку, то правильным будет сохранить аналогичные интерфейсы. Как конкретно они будут реализованы — не важно. Для пользователей библиотеки её реализация — это чёрный ящик. Поэтому разбивайте по файлам как удобно в данной конкретной реализации. При необходимости пробросите нужные импорты куда надо (например, в __init__.py).
    4. см. пункт 3. Делайте как в аналогах, если понадобится, потом добавите обёртку с высокоуровневым интерфейсом.
    Ответ написан
    1 комментарий
  • Зачем нужен self в методах класса?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Видимо из вселенной C++ Вы к нам заглянули. Гуглите на тему bound/unbound methods

    1. В теле методов нет неявного присваивания аттрибутам объекта.

    self.x = 1 — присваивает значение 1 аттрибуту объекта.
    x = 1 — присваивает значение 1 локальной переменной (даже если присваивание происходит в методе класса).

    2. Как Вы сами написали, параметр self подставляется автоматически, когда метод вызывается для объекта. Поэтому, при вызjве метода с двумя переменными, ему на самом деле передаётся три (и он должен уметь принимать три аргумента).

    3. Когда объявляете метод, который будет вызываться для экземпляра класса.

    Очень рекомендую почитать эти доки, прежде чем дальше разбираться с языком:

    - https://docs.python.org/2/reference/datamodel.html
    - https://docs.python.org/2/tutorial/classes.html
    - https://docs.python.org/2/reference/executionmodel.html
    Ответ написан
    1 комментарий
  • Front-end для укротителя змей?

    Tiendil
    @Tiendil
    Разработчик ПО.
    С REST, по-моему, любой адекватный фреймворк будет хорошо работать.

    Я за то, чтобы максимум страницы создавать на сервере, если только не пишется толстый клиент. Для этого есть следующие причины:
    - рендер страницы — далеко не самая тяжёлая операция, в него мало кто упирается;
    - проще тестирование — запустил вьюшку — получил готовый html, который можно прогнать и валидатором, и проверить в нём наличие нужных строк;
    - проще отладка — не надо дополнительно запускать js-код (в браузере или как-то отдельно);
    - проще будет заниматься SEO.

    >Стоит ли сразу за все это дело браться или сначала в академических целях писать на чистом JS + немного jQuery-магии?
    А конечная цель какая. Если клепать сайты «средней» сложности, то jQuery с лихвой хватит, а полученный опыт позже позволит сделать более обоснованный выбор.
    Ответ написан
    Комментировать
  • Как упростить код сигнала в Django?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Напишите декоратор, который принимает список моделей, а внутри оборачивает функцию в @receiver для каждой из них.

    Примерно так.

    def my_receiver(models):
    
        def decorator(func):
            for model in models:
                func = receiver(pre_save, sender=model)(func)
            return func
    
        return decorator
    
    @my_receiver(models=[Model1, Model2, Model3])
    def recalculate_data(instance, **kwargs):
        pass
    Ответ написан
    1 комментарий
  • Python-way и интерфейсы

    Tiendil
    @Tiendil
    Разработчик ПО.
    Из глоссария Питона

    Abstract base classes complement duck-typing by providing a way to define interfaces when other techniques like hasattr() would be clumsy or subtly wrong (for example with magic methods). ABCs introduce virtual subclasses, which are classes that don’t inherit from a class but are still recognized by isinstance() and issubclass(); see the abc module documentation. Python comes with many built-in ABCs for data structures (in the collections module), numbers (in the numbers module), and streams (in the io module). You can create your own ABCs with the abc module.

    Видимо, это то, что надо.

    От себя скажу, что не замечаю сильного увлечения ABC в сообществе (и вообще проверкой интерфейсов) — они скорее для стандартной библиотеки.
    Ответ написан
    5 комментариев
  • Какой оптимальный вариант модели для описанной задачи (Django)?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Из представленных вариантов я бы выбрал 2. Проблемы с добавлением новых стран на самом деле нет — достаточно считать, что если страны нет в словаре. то ей соответствует какая-то, заданная по умолчанию, дата. Усложнения логики проверки тоже не вижу.

    Почему нет варианта простой модели вида [user_id, country, date]? Удобно делать проверки и выборки.

    >пользователей ожидаю не больше 5-10к
    За какой период времени? Надо смотреть пиковые нагрузки.
    Если это общее число, то скорее всего вообще не надо переживать по поводу нагрузки, а делать как удобно
    Ответ написан
    1 комментарий
  • Какие есть хорошие книги по Django?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Читайте родную документацию, она у джанго хорошая и всегда актуальная. Учить его по книгам, тем более со старыми версиями, не имеет смысла — окажитесь в прошлом. Да и не такая уж это сложная система, чтобы отдельные книги про неё писать.

    Официальная документация и практика — наше всё.
    Ответ написан
    Комментировать
  • Стоит ли переходить с Python на Go?

    Tiendil
    @Tiendil
    Разработчик ПО.
    По-моему, это языки разной направленности и задачи, ими решаемые, слабо пересекаются.

    Соответственно, вопрос о переходе с одого на другой может ставится только при смене рода деятельности, а в этом случае вопросы в первую очередь к тому, чем планируете заниматься.
    Ответ написан
    3 комментария
  • Как, посчитав sin(pi/3), получить ответ "√3/2", а не его точное значение?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Я бы погуглил что-то вроде «python symbolic math»

    Для начала можно посмотреть вот эту библиотеку: sympy.org/ru/index.html
    Ответ написан
  • Как лучше организовать кэширование в Django?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Мне кажется, что тормозит не рендер шаблонов, а что-то другое.

    >Собственно вопрос как кэшировать большие блоки при этом сохранять в них индивидуальную информацию для каждого из юзеров
    Перенести отображение этой информации на сторону JavaScript. Кэшируется блок html без изменяемых данных, а в браузере JS отдельно их устанавливает.

    >получается, что даже выставив время жизни 12 часов, каждый второй посетитель будет сталкиваться с долгим ожиданием.
    1. можно выставить время в 120 часов :-)
    2. можно весь html генерировать на диск и раздавать статику, обновляя только во время обновления товаров.
    3. написать скрипт, который будет периодически обходить сайт и инициировать кэширование.

    Заодно рекомендую почитать про версионирование кэша.
    Ответ написан
    2 комментария