• Откуда ошибка 404 в парсере python?

    @Stqs
    senior software developer
    думаю проблема в том что запрашиваемые ресурс не найден на сервере
    Ответ написан
    Комментировать
  • Что делать module 'csv' has no attribute 'writer'?

    @Stqs
    senior software developer
    лежит ли рядом файл csv.py? если да - то импортирован будет именно он
    Ответ написан
  • Как упростить код проверок?

    @Stqs
    senior software developer
    ну если рябит в глазах от try-catch то всегда можно сделать чтото типа такого
    try:
        if not Validation.is_int(data['vhid']):
            raise ValidationError("Incorrect id of virtual host")
    
        Websites.get(Websites.unid == vhid)
        usertoken = data['usertoken']
        user = Users.get(Users.api_token == usertoken)
    
        if not validators.email(data['email']):
            raise ValidationError("Invalid e-mail")
        if not validators.domain(data['mainname']):
            raise ValidationError("Incorrect domain name")
        
        Domains.get(Domains.fullname == Websites.mainname)
        
        if user.role == 'customer' and user.node != nodeid:
            raise ValidationError("It seems you try to edit something on a foreign node")
    except Websites.DoesNotExist:
        return json.dumps({'status': 'error', 'error': "Website doesn't exist"})
    except Users.DoesNotExist:
        return json.dumps({'status': 'error', 'error': "User doesn't exist"})
    except Domains.DoesNotExist:
        return json.dumps({'status': 'error', 'error': "Domain doesn't exist"})
    except ValidationError as e:
        return json.dumps({'status': 'error', 'error': e.message})


    сказать что это лучше или правильней - нельзя
    это скорей от ваших предпочтений зависит

    что мне определенно не нравится:
    вы выбираете модель из базы только для того что бы проверить существует ли он там или нет
    то есть поидее можно избавиться от 2х веток
    Websites.DoesNotExist:
    Domains.DoesNotExist:
    используя https://docs.djangoproject.com/en/1.8/ref/models/q...

    то есть код может выглядеть примерно так

    try:
        if not Validation.is_int(data['vhid']):
            raise ValidationError("Incorrect id of virtual host")
    
        if not Websites.filter(Websites.unid == vhid).exists():
            raise ValidationError("Website doesn't exist")
    
        usertoken = data['usertoken']
        user = Users.get(Users.api_token == usertoken)
    
        if not validators.email(data['email']):
            raise ValidationError("Invalid e-mail")
        if not validators.domain(data['mainname']):
            raise ValidationError("Incorrect domain name")
        
        if not Domains.filter(Domains.fullname == Websites.mainname).exists():
            raise ValidationError("Domain doesn't exist")
        
        if user.role == 'customer' and user.node != nodeid:
            raise ValidationError("It seems you try to edit something on a foreign node")
    except Users.DoesNotExist:
        return json.dumps({'status': 'error', 'error': "User doesn't exist"})
    except ValidationError as e:
        return json.dumps({'status': 'error', 'error': e.message})


    код я не запускал ессно, но думаю идею вы поняли

    и еще одно замечание:
    старайтесь в первую очередь проверять то что не требует обращений к базе данных
    это позволит сэкономить запросы и вцелом будет performance improvement.
    Ответ написан
  • Как называются "заменители тегов" HTML по типу < > и т.д.?

    @Stqs
    senior software developer
    выберите чтото из BeautifulSoup, lxml
    обе библиотеки очень просты в использовании
    Ответ написан
    1 комментарий
  • Как вывести ошибку при заполнении формы, после отправки скрипта?

    @Stqs
    senior software developer
    для этого сама html форма должна быть выделена из php файла и стать просто шаблоном который будет рендериться скриптом index.php
    после этого, этот же шаблон можно рендерить в reg.php в случае ошибки
    Ответ написан
    5 комментариев
  • Python: Почему два вызова функции не работаю параллельно?

    @Stqs
    senior software developer
    а currency_rates.ws_get_rates.get_rates что делает?
    учитывая префикс "ws" можно предположить что функция связана с веб-сокетами
    возможно она делает какую-то блокирующую операцию (ожидает сигнала из вебсокета)

    from multiprocessing import Process
    
    def test(arg):
        raw_input(arg)
    
    def test1(arg):
        print(arg)
    
    p1 = Process(test(1))
    p1.start()
    p2 = Process(test(2))
    p2.start()
    
    p1.join()
    p2.join()


    если использовать функцию test1 - то мы видим 2 принта
    если функцию test - то мы видим только инпут из первого вызова.
    далее процесс заблокирован
    Ответ написан
  • Стоит ли указывать в навыках технологии, которые не применял в рабочих проектах?

    @Stqs
    senior software developer
    По-моему как раз таки нужно указывать не то, с чем вы вообще имели дело на работе, а то, в чем вы разбираетесь достаточно хорошо, что бы эту технологию эффективно исползовать в коммерческой разработке.
    Где вы эти навыки приобрели - вопрос вторичный.
    Ответ написан
    Комментировать
  • Для чего нужны переменные флаги?

    @Stqs
    senior software developer
    не нужно воспринимать флаги как что-то супер-специфическое или суперсложное
    это не более чем обычная переменная которая влияет на поток программы

    пример из жизни
    вы программируете целый день на работе и вечером идете домой
    допустим в течении дня может позвонить супруга и попросить зайти вечером в магазин (выставляет флаг ЗАЙТИ_В_МАГАЗИН = True)
    в конце дня этот флаг проверяется - если он True - то мы зайдем в магаз, если нет - соответственно не зайдем

    нюансы здесь:
    - флаг может быть выставлен в ЛЮБОЕ время
    - флаг не обязательно выставляете Вы сами!
    - Ваша реакция на флаг не обязательно сиюминутная
    - перед уходом домой лучше позвонить супруге и уточнить состояние флага :)

    флаг не обязательно должен быть буленовской переменной, это понятие скорее логическое, например вместо флага ЗАЙТИ_В_МАГАЗИН (при котором не совсем понятно что покупать то) может использоваться более умная конструкция типа ArrayList списокПокупок = {}. Вначале дня список пустой, в течении дня жена вспоминает чтото - и дописывает вещи в спискоПокупок
    в конце дня вы просто проверяете - пуст ли список (флага нет) - и тогда идете домой с чистой совестью
    если же там есть хоть что-то (флаг поднят) - Вы уже знаете что 1) идти нужно 2) что именно нужно купить
    Ответ написан
    Комментировать
  • Как передать запрос на другой URL?

    @Stqs
    senior software developer
    похоже вам нужен реверс-прокси (например https://www.nginx.com/resources/admin-guide/revers...
    Ответ написан
    Комментировать
  • Добавлять ли virtualenv в git?

    @Stqs
    senior software developer
    Частенько бывает что часть пакетов нужна при разработке и не нужна на продакшене. И наоборот. Поэтому желательно бы еще разделять requirements для разработки и для продакшена.
    Файлы с requirements могут включаться один в другой. Таким образом обычно зависимости можно разделить на 3 отдельных файла.
    Например:
    reqs/
    - common.txt
    - prod.txt
    - dev.txt

    common.txt будет содержать все обязательные общие зависимости. Пример с потолка:
    Django==1.8.5
    mysql-python==1.2.5


    dev.txt будет содержать пакеты специфичные только для разработки но включая common. Пример опять же с потолка:
    -r common.txt
    ipyhton
    ipdb
    django-debug-toolbar==1.4


    prod.txt тоже будет включать common но так же содержать вещи которые на продакшене обязательны а в Вашем локальном окружении не нужны вовсе:
    -r common.txt
    gunicorn==19.4.1
    whateverelse=1.0.0


    соответственно когда мы собираемся разрабатывать мы устанавливаем зависимости так
    pip install -r reqs/dev.txt
    в продакшене
    pip install -r reqs/prod.txt
    Ответ написан
    Комментировать