• Как из потока записать данные в массив?

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

    Вопрос поставлен максимально расплывчато и на него можно получить два десятка абсолютно разных, и при этом верных для своего конечного контекста, решений.
    Ответ написан
  • Аргумент request в функциях Django?

    @antonksa
    Как-то слишком много магии...

    Неужели вы не понимаете, что request не самозарождается внутри функции, как дети в капусте?!

    1. При старте фреймворка джанга ищет все urls.py, вычитывает из них все urlpatterns.
    2. После этого она сохраняет у себя во внутреннем реестре связку урл - функция.
    3. Когда приходит запрос, WSGI вычитывает TCP данные, HTTP данные и формирует WSGIRequest объект всунув в него эту информацию и вызывает главный хендлер джанги.
    4. Хендлер джанги получив этот объект формирует на его основе свой HttpRequest дополняя его джанговскими фичами. После этого находится соответствие урлу и функция обрабатывающаяя этот урл вызывается, с переданным в нее HttpRequest. И кстати не только request. Надо писать:
    def handler(request, *args, **kwargs) -> HttpResponse:
        pass

    потому что джанга может НЕ ТОЛЬКО REQUEST передать в функцию, будете потом тупить, "а почему у меня user_id пишет что не поместилось".

    НЕЛЬЗЯ "№;%% В ВОЗДУХЕ НАПИСАТЬ blabla(request) И ЖДАТЬ ЧТО REQUEST САМОЗАРОДИТСЯ ИЗ НИЧЕГО!!!

    И вообще, у меня сильное ощущение, что вам на три-четыре месяца надо отложить Django и выучить сам питон для начала...
    Ответ написан
    4 комментария
  • Инициализация Flask'a в классе?

    @antonksa
    Я вам объясню в чем ваша ошибка (нет, не в генетическом коде, не волнуйтесь), если вы сможете внятно мне объяснить цель, с которой вы создали класс Bot.
    Ответ написан
    4 комментария
  • Как можно делать много запросов в минуту как можно быстрее?

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

    @antonksa
    Вам же на русском языке фласк написал - "неплохо было бы добавить return, хозяина-ма".
    try:
        db_cursor.execute(req)
        return redirect(url_for('auth_request'), code=307)
    except:
        return Response('registration is failed')


    redirect() это ФУНКЦИЯ, которая возвращает объект КЛАССА Response, просто специфический, с кодом и заголовками. Но он ушел в нихиль, потому что вы его не вернули из вызова. Вы вообще руками могли его сформировать. Любой код в контроллере должен в итоге вернуть Response или выбросить эксцепшн, который фласк умеет обрабатывать.

    И еще, Вы НЕ делаете редирект из контроллера в контроллер. Вы ВОЗВРАЩАЕТЕ ПОЛЬЛЬЗОВАТЕЛЮ ответ на запрос, в котором упаковано предложение на редирект. У него может они вообще отключены.
    Ответ написан
    Комментировать
  • Как сделать при debug = false?

    @antonksa
    Как вам написали выше, у вас классическая ошибка новичка в синтаксисе, одинарное = это операция присваивания, двойное == это булева операция проверки на эквивалентность. Поэтому необходимо использовать == вместо =, непонятно почему Ваша IDE не показала Вам ошибку. В чем Вы разрабатываете? Лучше всего использовать PyCharm. И еще как заметили выше Python это объектно-ориентированный язык, в котором практически все является объектом. И в него встроено два специальных объекта - True и False. Поэтому для булевых операций считается хорошим тоном использовать проверку на то, является ли объект результата булевого выражения объектом True или False. Т.к. для этого Python всего лишь сравнивает внутренние ссылки id его объектов, то эта операция чуть-чуть быстрее. Пишется это следующим образом:
    if DEBUG is False:
        ....
    else:
        ....


    Но ради полного перфекционизма ветки необходимо поменять местами, а так как if под капотом делает с условием нечто типа bool(условие) то можно написать вот так:
    if DEBUG:
        # some code if DEBUG is True
    else:
        # some code if DEBUG is False
    Ответ написан
    2 комментария
  • Как запустить cURL асинхронно asyncio python?

    @antonksa
    В aiohttp есть отличный асинхронный http клиент.
    Ответ написан
  • Как првильно настроить django-channels?

    @antonksa
    pip install aiohttp
    Ответ написан
    Комментировать
  • Как достать kwargs из url в DRF?

    @antonksa
    Кривоватое решение. Достаточно передать несуществующий id прилетит 500.
    Поэтому все первичные ключи нужно валидировать.

    class RatingSerializer(serializers.Serializer):
        user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
        rating = serializers.IntegerField(min_value=1, max_value=5)
    
        def create(self, validated_data):
            user = validated_data['user']
            rating = validated_data['rating']
            profile = Profile.objects.get(user=user)
            rating_obj = Rating.objects.create(profile=profile, rating=rating)
            return rating_obj


    А вьюха должна тогда выглядеть так:
    class RatingAdd(generics.GenericAPIView):
        serializer_class = serializers.RatingSerializer
        permission_classes = [IsAuthenticated]
    
        def post(self, request, **kwargs):
            data = request.data.copy()
            data.update({'user': kwargs['userid'}})
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
    
            return Response(serializer.data, status=status.HTTP_201_CREATED)


    (upd) Сорян, поправил вьюху, т.к. не удалил кусок оригинального кода.

    Что до вопроса про kwargs, то непонятно чего вы ждали, ведь это же kwargs ViewSet'a а не сериализера. Тут нужно быть осторожным, но вообще их можно выковырять из контекста, так как ApiView.get_serializer() еще пропихивает в сериализер контекст:
    def create(self, validated_data):
        view = self.context.get('view')
        userid = view.kwargs['userid'] if view else None
        if not userid:
            raise NotFound('User with given id does not exist.')
        rating = Rating.objects.create(profile=Profile.objects.get(user__id=userid), **validated_data)
        return rating
    Ответ написан
    Комментировать
  • Как установить redis-py?

    @antonksa
    Поднасрал конечно Psycopg со своим binary
    Попробуйте удалить обычный psycopg, т.к. они будут конфликтовать.
    Что до Редиса, люди, вы реально не читаете документацию, или это контент менеджеры Тостера так издеваются?
    5deaaa66e7040049293382.png
    На первой же странице написано как устанавливать пакет и его имя в PyPI.
    redis-py он называется на GitHub чтобы не путать его с redis-php, redis-go и тому подобными коннекторами, в индексе пакетов питона он называется просто redis.
    Ответ написан
  • Пошаговые действия в python?

    @antonksa
    Капча хоть не гугловая? :) Она очень хорошо умеет вычислять таких умненьких.
    Что до сабжа, то я вот так заполнял текстовые поля, потому что у меня через раз символы частично не вводились...
    class TextField(PageElement):
        def _fill_field_using_js(self, string_value: str) -> None:
            elem = self.get_element()
            self.driver.execute_script(f'let el = arguments[0]; el.value="{string_value}";', elem)  # type: ignore
    Ответ написан
  • Что это за ошибка и как её исправить?

    @antonksa
    Open cmd and type echo %QT_PLUGIN_PATH% if it's not empty then delete it (just google: delete environmental variable windows #, where # is your windows version)

    Open cmd and type echo %PATH% and press enter. You'll see a list separated by ; of folder paths. Go line by line and make sure they do not point to a folder that contains a platforms folder that has qwindows.dll in it. If you find such a path edit the PATH variable and remove it (just google: edit environmental variable windows #, where # is your windows version)
    Ответ написан
    Комментировать
  • Можно ли совместить классы на Python 2.x с классами на Python 3.x в одном приложении?

    @antonksa
    Тебя еще не послали? А, уже послали... Ну тогда я просто присоединюсь.
    Ответ написан
    Комментировать
  • Как добавлять информацию в файл не перезаписывая?

    @antonksa
    Я может че не понял, но вам не кажется, что

    try:
        db = pickle.load('D:\\database.pkl')
    except:
        db = {}

    должно быть в начале, иначе один пароль в файле это нормально, потому что вы при каждом запуске создаете пустой словарь, а потом в файл записываете словарь с одним паролем.

    Ну и конечно лучше вместо picle использовать sqlite, питон нативно умеет с ним работать. Тогда можно будет искать юзера по логину через SQL запрос, а не анпиклить мегабайтные словари с десятками тысяч записей.
    Ответ написан
    Комментировать
  • Как сделать отделный домен для каждого юзера?

    @antonksa
    Я бы сделал так:
    1. Как сказали выше example.org ставится nginx'у как условие направления запросов в приложение. Т.е. любой pupkin.example.org и ivanov.example.org уйдут в Джанго на обработку.
    2. Создал модель Company в базе данных с индексируемым полем domain.
    3. Сделал мидлварь, которая наподобие мидлвари ванильной авторизации выковыривает хост из request.META, лезет в базу, находит объект компании и прикрепляет его к запросу
    setattr(request, 'company', company_instance)
    , после этого объект компании можно будет юзать во вьюхах, так же как и юзера:
    request.company
    4. В случае если в имени хоста нету домена третьего уровня, то я бы сделал
    setattr(request, 'main_site', True)
    чтобы во вьюхе можно было понять что это основной сайт, а если поддомен передан, но в базе его нет, то я бы сразу вернул редирект на страницу с инфой, что такой компании не существует, или она заблокирована, или еще что, зарегистрируйтесь и будет вам счастье.
    5. Автоматическое создание поддомена это лишь создание
    Company.objects.create(
        owner=some_user,
        domain=company_domain,
        email=company_email,
        ...
        created=timezone.now()
    )

    , вопрос только в том, будет ли company_domain генерироваться согласно какому-то принципу, или задаваться админом, или юзером при регистрации, или с потолка или рандом, вариантов как звезд на небе, а вопрос слишком обширный, типа "я хочу сделать сайт как фейспук, шо мне делать".
    Ответ написан
    Комментировать
  • Как в django-summernote проверить на пустоту?

    @antonksa
    Гугл по запросу python strip html tags выдает полтора миллиона результатов.
    Ответ написан
  • Как сделать формулу расчета профита в процентах от разницы цен с учетом комиссии?

    @antonksa
    Вот на эти два процента я и живу...
    Ответ написан
    Комментировать