• Как описать схему для DRF+swagger в случае когда данные передаются как formdata?

    solotony
    @solotony Автор вопроса
    покоряю пик Балмера
    в общем совершенно случайно я обнаружил что важен порядок декораторов

    вот в таком виде все заработало :)

    @swagger_auto_schema
    @api_view(('POST',))
    @parser_classes((FormParser,))
    def user_login(request):
       ...


    p.s. 3 часа времени и куча матов.
    Ответ написан
    Комментировать
  • Как исправить ошибку dictionary changed size during iteration?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Проблема связана с тем, что вы пытаетесь модифицировать словарь, по элементам которого итерируетесь.
    В условиях вашего кода это не проблема. Но вы должны сначала прежде чем начнётся цикл с удалениями) взять список пар элементов из вашего словаря.
    products.items() возвращает не список, а итератор по элементам словаря. Само собой этот итератор ломается как только вы удаляете из словаря первый элемент.
    Но если этот итератор до первого удаления полностью превратить в список, то удалять потом можно что хотите.
    for product_id, value in list(products.items()):
        if value['g_1'] == 0:
            del products[product_id]

    Или так:
    new_products_dict = {k: v for k, v in products.items() if v['g_1'] != 0}

    Здесь создаётся новый словарь из элементов, которые удовлетворяют вашим условиям.
    Ответ написан
    1 комментарий
  • Как добиться поддержки кириллицы в Python3 flask + mysql?

    @Princess_York Автор вопроса
    Beginner Android developer
    Решение было любезно предоставлено в комментариях пользователем pcdesign.
    Чтобы из базы данных читалась нужная кодировка был использован следующий вариант метода pymysql.connect():
    db = pymysql.connect(host='localhost',
                                 user='myuser',
                                 passwd='welcome',
                                 db='mydb',
                                 charset='utf8')

    Это решило половину проблемы – теперь из базы всё читалось как надо, но flask отображал юникодовские символы просто выводя их код. Чтобы решить эту невзгоду был применен следующий подход:
    app = Flask(__name__)
    app.config['JSON_AS_ASCII'] = False

    С этого момента flask.jsonify начал отдавать кириллические символы такими какие они есть.
    Ответ написан
    2 комментария
  • Python многопоточность Requests, что блокирует обработку?

    bzzzzzz
    @bzzzzzz
    Блокирует обработку в вашем случае не GIL, а то, как вы распределяете задачи между потоками: вы перед началом работы распределяете все урлы поровну между потоками и, поэтому, складывается такая ситуация, когда часть потоков простаивает и ждет когда один из них проверит все оставшиеся ему сайты. В своей программе вы должны использовать очереди для распределения задач и, конечно же, сократить количество I/O операций.

    Код будет приблизительно таким (смотрите мои комментарии для того, чтобы понять что и почему):

    # coding=utf-8
    import requests
    import time
    import os
    from threading import Thread, current_thread
    from Queue import Queue
    
    
    theard_count = 25
    
    
    domain_file = "domains.txt"
    domain_temp = "temp"
    
    
    def check_url(host):
        url = 'http://' + host
    
        try:
            requests.get(url, timeout=5)
        except Exception:
            return False
        else:
            return True
    
    
    def run(queue, result_queue):
        # Цикл продолжается пока очередь задач не станет пустой
        while not queue.empty():
            # получаем первую задачу из очереди
            host = queue.get_nowait()
            print '{} checking in thread {}'.format(host, current_thread())
            # проверяем URL
            status = check_url(host)
            # сохраняем результат для дальнейшей обработки
            result_queue.put_nowait((status, host))
            # сообщаем о выполнении полученной задачи
            queue.task_done()
            print '{} finished in thread {}. Result={}'.format(host, current_thread(), status)
    
        print '{} closing'.format(current_thread())
    
    
    # MAIN
    def main():
        start_time = time.time()
    
        # Для получения задач и выдачи результата используем очереди
        queue = Queue()
        result_queue = Queue()
    
        fr_success = os.path.join(domain_temp, "req-good.txt")
        fr_errors  = os.path.join(domain_temp, "req-error.txt")
    
        # Сначала загружаем все URL из файла в очередь задач
        with open(domain_file) as f:
            for line in f:
                queue.put(line.strip())
    
        # Затем запускаем необходимое количество потоков
        for i in range(theard_count):
            thread = Thread(target=run, args=(queue, result_queue))
            thread.daemon = True
            thread.start()
    
        # И ждем, когда задачи будут выполнены    
        queue.join()
    
        # После чего пишем результаты в файлы
        with open(fr_success, 'w') as fs, open(fr_errors, 'w') as fe:
            while not result_queue.empty():
                status, host = result_queue.get_nowait()
    
                if status:
                    f = fs
                else:
                    f = fe
    
                f.write(host)
                f.write('\n')
    
        print time.time() - start_time
    
    if __name__ == '__main__':
        main()


    500 сайтов, из которых 150 не работают, он парсит за 35 секунд.
    Ответ написан
    3 комментария
  • Python многопоточность Requests, что блокирует обработку?

    svfat
    @svfat
    ☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺
    Так и есть - GIL блокирует поток.

    А вообще, у вас код не очень эффективно написан, слишком много ненужных I\O операций, каждый раз файлы открывать - много времени теряется, как домен берете из файла для обработки, это вообще жесть. Попробуйте переписать так, что бы в тредах вообще файловых операций не было, работайте только с памятью.
    Ответ написан
    6 комментариев
  • Python многопоточность Requests, что блокирует обработку?

    @SlivTime
    Если у вас версия питона >= 3.3, можете попробовать aiohttp и забыть про мороку с тредами в питоне.

    import asyncio
    import aiohttp
    
    @asyncio.coroutine
    def fetch_status(session, url):
        status = None
        try:
            response = yield from session.get(url)
            response.close()
            status = response.status
        except Exception as e:
            status = e.__str__()
        return status
    
    
    def run():
        session = aiohttp.ClientSession()
        with open('domains.txt', mode='r') as f:
            for url in f:
                url = url.strip()
                status = yield from fetch_status(session, url)
                print(url, ": ", status, sep='')
        session.close()
    
    if __name__ == '__main__':
        asyncio.get_event_loop().run_until_complete(run())
    Ответ написан
    2 комментария
  • Как преобразовать строку в список в PYTHON?

    @Zotik204783
    str = "['Первое', 'Второе', 'Третье', 'Четвертое']"
    lst = eval(str)
    print(lst[1])
    Ответ написан
    Комментировать
  • Как преобразовать строку в список в PYTHON?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Как преобразовать эту строку в список? Чтобы я мог вызывать элементы

    например 2 элемент

    >>> import json
    >>> str1 = "['Первое', 'Второе', 'Третье', 'Четвертое']"
    >>> json.loads(str1.replace("'", '"'))[1]
    'Второе'


    P.S. В оригинале у вас не совсем корректный список в строке - "Первое" не закрывается кавычкой.
    ['Первое, 'Второе', 'Третье', 'Четвертое']
    Если это не "бага а фича" . - то нужны дополнительные шаги для приведения списка к корректному виду.
    Ответ написан
    Комментировать