• Как правильно организовать структуру Backend'а?

    @Jack444
    Если монолитная архитектура, то третья нормальная форма по дефолту везде стандарт при проектировании, города в отдельную таблицу закинь, филиалы отдельно и через многие ко многим свяжи их с доп инфой какая понадобится, например ип адреса филиала можно хранить и по ним авторизовывать, все остальные данные какие идут от филиала связывай с этой строчкой.

    Если микросервисы, то принцип примерно тот же, но на 1 сервис одна база, на одном сервере храним таблицу городов с инфой о имеющихся там филиалах, в джейсонах или масивах, на каждом филиале храним свой инстац базы со всей инфой которая там происходит и по необходимости через API запрашиваем выборку по филиалу с других сервисов.
    Ответ написан
  • Как можно исправить эту middleware?

    @Jack444
    Если код работает то не парся. По улучшакам вот что заметил:
    if user is not None: повторяется несколько раз, можно один раз проверить выше
    if user := result.scalar():
    и ниже писать остальную логику
    Ответ написан
    Комментировать
  • Когда надо использовать инстанс методы и когда класс методы?

    @Jack444
    Через класоввые атрибуты и методы можно задать общие данные для всех машин которые неразумно сравнивать по отдельности, если делать возможным то нечем не будет отличатся от функционального програмирования, только потеряем в вызове метода в 5ятикратном размере. Через инстанцы можно сделать разные машины к примеру ламба и жигули и сравнивать их через операторы и условные выражения, вызов инстанцс методов в 2.5раза быстрее отрабатывает чем класс методы.
    Вот пример можешь порешать, сделай класс генератор на вход принимает дистанцию, который считает время разгона авто и с каждым шагом отдаём время контрольной точки например километр. Сделай другой класс или функцию которая имитирует драгрейсинг и дай туда два инстанца разных авто с разными характеристиками и вычисли кто быстрее придёт к финишу и какое время будет у гонщиков.
    Вот типо таких задач проще решаются через инстанцы.
    Ответ написан
    Комментировать
  • Хорошая ли стратегия разбивать монолит джанго на микросервисы джанго?

    @Jack444
    Вообще на самом деле джанго можно сделать аля-микросервисным если рассматривать каждое приложение как отдельный микросервис.
    В Джанго можно подключить для любой модели отдельную базу данных которая может находится на отдельном сервере или другом порту.
    Всё что требуется добавить в модель следующие:
    class MyModel(Model):
        class Meta:
            using = 'default'  # дефолтная база из DATABASES из settings.py

    Использование отдельных баз данных это дело одно, но вам скорее всего хотелось бы чтобы каждое приложение работало на отдельном порту, это тоже не проблема, в каждом приложении создайте systemd.service который запустит экземляр на другом порту и делайте жесткую ссылку в systemd/system, после через nginx проксируйте по location на порт приложения.
    Чисто так технически можно перенести экземпляры на разные серверы и поправить конфиги.
    Важно чтобы секретный ключ был один и тот же везде, иначе будет много проблем, по безопасности всё ок если не раскрывать его третьим лицам.
    Как вариант секретный ключ и другие данные можно хранить в .env и подгружать их в settings.py.
    Если хотите сохранить чистоту коду, то экземляры можно раскидать по папкам, в каждой из них набросать по минималке README.txt с инфой на каком порту запущено, какие команды для остановки и перезапуска, какие паки нельзя трогать а какие можно, можно только ту в которой висит приложение а все остальные папки которые не взаимодействуют из этого приложения можно снести.

    В общем какой-то такой вариант можно реализовать, но я бы рекомендовал оставить как есть и по возможности старые сервисы переписывать на микросервисы FastAPI а новые эндпоинты сразу пилить на нём.
    Ответ написан
    Комментировать
  • Как задать не обязательные поля в post запросах к fastAPI в python?

    @Jack444
    from fastapi import FastAPI, Form
    from typing import Optional
    import uvicorn
    from pydantic import BaseModel
    
    fast_api = FastAPI()
    
    class MyForm(BaseModel):
        phone: Optional[str]
        accountType: Optional[str]
    
    @fast_api.post('/reg')
    async def handler_response(data: MyForm):
      print('phone', data.phone)
      print('accountType', data.accountType)
      return 'ok'
    
    uvicorn.run(fast_api, host = '0.0.0.0', port = 80)
    Ответ написан
  • Вопрос по конструктору класса?

    @Jack444
    class test:
        zzz: int
      
         def __init__(self, zzz: int = 123, obj: 'test' = None):
             self.zzz = obj.zzz if obj else zzz
     
         def add(self, c: int):
             self.zzz += c
    Ответ написан
    Комментировать
  • Каковы стандарты наименования сводных таблиц в Django?

    @Jack444
    Джанго по колхозному именует таблицы, сам по себе sql не регистрозависимый, потому модель MyTableModel джанго так и создаст appname_mytrablemodel и поэтому мне лично предпочтительнее прописать явно название таблицы.
    class Meta:
        table_name = 'my_table_model'
    Ответ написан
    Комментировать
  • Избавиться от флуда makemessages?

    @Jack444
    django-admin makemessages -l ru -l en --ignore=путь_к_файлу1,путь_к_файлу2
    Ответ написан
  • Как организовать структуру базы данных для нескольких типов пользователей?

    @Jack444
    Таблицы client/agent/user_data можно в одну таблицу user упаковать, + добавить поля is_client bool и is_agent bool, но так как вы уже сделали связь к role то перекидывайте туда роли client и agent, если возможно использование нескольких ролей для пользователя то используйте не name varchar a names varchar[] чтобы поле было массивом.
    Ещё обычно создаётся таблица permissiion которая привязывается к ролям и юзерам + дополнительно хранит поля table_name и action, либо вместо таблицы типом JSONB добавить ячейку в роли и юзеры.
    Вообще postgre изначально умеет работать с пользователями и можно использовать такие фичи как CREATE USER и ALTER ROLE но такой вариант может оказаться костыльным и логику с правами лучше перекинуть на уровень приложения.
    Ответ написан
  • Как распарсить JSON в котором несколько блоков?

    @Jack444
    import json
    
    with open('filename.json', 'r') as f:
        data = json.loads(
            '['+f.read().replace('}\n{', '},\n{')+']'
        )
        ...
    Ответ написан
    Комментировать
  • Как оптимизировать пагинацию отсортированных по времени создания записей?

    @Jack444
    Просто сделать такой индекс.
    CREATE INDEX dtidx ON table (id, created DESC);
    И всё, запрос будет искать id в первичном индексе, как найдёт там будет уже список таймштампов отсортированных по убыванию сделать по ним offset/limit вообще не чего не стоющая операция, ORDER BY писать уже не обязательно.
    Ответ написан
    Комментировать
  • Нормальная ли практика добавлять task в цикл не в функции main?

    @Jack444
    Всё отлично так и надо делать но будь аккуратнее, если сайт все запросы в базу направляет и с кешем у них плачевно то положить сайт можно спокойно, по ситуации смотри, часто приходится лимитировать количество запросов
    Ответ написан
    Комментировать
  • Как поменять кодировку базы данных с 'latin-1' на 'utf-8'?

    @Jack444
    Надо на чистом сервере апгрейдить ОС и после устанавливать постгре. Скорее всего в системе по дефолту latin-1 стоит и utf-8 локалы не установлены.
    Отправьте в терминал такую команду
    localectl status
    Покажет локализацию устройства, если заканчивается на .UTF-8 то всё ок.
    Если нет то пробуйте обновить.
    update-locale LANG=ru_RU.UTF-8
    Если выходит ошибка invalid locale settings то обновите всю ОС
    В убунту/дебиан такая команда
    apt upgrade
    В процессе апргрейда появится окошко с выбором кодировок, выберите любых несколько которые оканчиваются на .UTF-8

    затем идёте в постгре
    sudo -i -u postgres psql
    и отправьте такую команду
    UPDATE pg_database SET encoding = pg_char_to_encoding('UTF8');
    Ответ написан
    2 комментария
  • Как иерархически вывести данные из Django?

    @Jack444
    Надо в меню добавить ещё поле что-то вроде:
    lvl = SmallIntegerField()
    Потом можно попробывать сделать так:
    menu = Menu.objects.select_related('parent').filter(lvl=1)

    Но таким образом не уверен что выше второго уровня в один запрос уложатся.
    Надёжней в ручную поправить:
    menu = Menu.objects.values()
    
    def join_parents(qs: list[dict]): -> list[dict]:
        for i in qs: i['parents'] = join_parents([x for x in qs if x['parrent']==i['id']])
        return qs
    
    join_parents(menu)
    menu = [i for i in menu if i['lvl'] == 1]
    Ответ написан
    Комментировать
  • Как использовать оператор else в циклах Python?

    @Jack444
    Качество курса сразу видно слабое, в жизни такая задача так бы решалась:
    result = '7' in input()

    С циклами всё просто, while выполняется пока условие True, когда станет False перекинет в блок else. Цикл for сразу проверяет трушность на прерваность и ели цикл не прерван через breakто вернёт False и перекинет в блок else
    Ответ написан
  • Как исправить ошибку в PostgrSQL(asyncpg)?

    @Jack444
    async def user_exists(user_id):
        conn = await asyncpg.connect(host=host, user=user, password=password, database=database)
        try: return await conn.fetchrow(f"SELECT 1 FROM users WHERE (user_id=} LIMIT 1")
        finally: await conn.close()
    Ответ написан
  • Сортировка товаров Django?

    @Jack444
    Так и так простое решение, в get параметр можно через запятую фильтры внести как один из вариантов.
    if sort := self.request.GET.get('sort'):
        queryset.order_by(*sort.split(','))
    Ответ написан
    Комментировать
  • Как будет работать 2 домена на одном сервере?

    @Jack444
    1) В djnago ALLOW_DOMAINS добавь оба домена.
    2) В NGINX в server_name добавь оба домена.
    3) В джанго напиши мидлеваре или декоратор который проверяет заголовок HOST в запроса пользователя.
    4) Если ХОСТ=somesite.ru и пользователь авторизован то редиректим на dashboard.somesite.ru а если не авторизован то отдаём страницу авторизации.
    5) Если ХОСТ=dashboard.somesite.ru и пользователь авторизован то не чего не делаем а если не авторизован то редиректим на somesite.ru
    Ответ написан
  • Как работает переприсваивании значений переменных Phyton?

    @Jack444
    tuple(reversed(sorted([int(input('Вводите число: ')) for _ in range(int(input('Сколько будете вводить чисел?\n')))])[-2:]))
    Ответ написан
    Комментировать
  • Добавление своих виджетов django admin?

    @Jack444
    Я в одно время так реализовал подобное, не особо вникал в исходный код django просто нашел исходники которые рендарят нужные страницы, внутр вшил js и через js потом пол страницы переправил как понадобилось=)
    Ответ написан
    Комментировать