• Как сделать атомарной часть кода в django?

    Bahusss
    @Bahusss
    Python Master
    Вопрос одновременного доступа к данным чаще всего не имеет общего решения, которой подойдет для любого случая и нужно каждый конкретный случай рассматривать отдельно.

    Для приведенного случая атомарной записи в базу пример вам уже привели. Для другого случая - будет какое-то другое решение. Если речь идет именно о совместном доступе к данным в реляционной базе, то можете попробовать поставить другой уровень изоляции транзакций, например при уровне Serializable и использовании транзакций - они все будут выполнятся последовательно и соответственно проблем с одновременным доступом не будет, но появятся новые.
    Ответ написан
    Комментировать
  • Можно ли, стоит ли и если "да", то как... в модели помимо поля указывать сразу возможные значения этого поля и записывать их в БД при миграции?

    Bahusss
    @Bahusss
    Python Master
    Итак, как вы уже выяснили choices не записываются в базу - они хранятся исключительно в коде и используются ORM для валидации данных и формировании списка вариантов в формах, например в Django-админке.

    При поставленной задаче на ум приходит следующее:

    Использовать choices и хранить список стран в настройках проекта - Django settings, таким образом будет проще пользоваться возможностями Django ORM для валидации данных и представления данных в формах. Стоит учесть, что при добавлении новой страны придется изменять настройки и перезапускать (перевыкатывать) проект.

    Затем, написать датамиграцию, чтобы добавить необходимые вам страны в базу. В такой миграции вы сможете в цикле пройтись по названиям стран из настроек проекта и создать все необходимые объекты, если они еще не созданы.
    Ответ написан
  • AJAX, Django, CSRF: Почему выходит ошибка 403?

    Bahusss
    @Bahusss
    Python Master
    На самом деле csrf.js не генерирует csrf token, а только читает его из cookies и помещает в HTTP заголовок, чтобы Django (CsrfViewMiddleware) смог прочитать его и защитить от CSRF-атаки, если токен невалиден.

    Таким образом, чтобы добавить в cookies этот самый csrf token необходимо чтобы:
    1. В MIDDLEWARE_CLASSES обязательно должна быть указана CsrfViewMiddleware
    2. В шаблоне вам нужно вставить в какую-нибудь форму тег {% csrf_token %}, если у вас нет никакой подходящей формы, то воспользуйтесь декоратором ensure_csrf_cookie (https://docs.djangoproject.com/en/1.8/ref/csrf/#dj..., которым нужно декорировать view c index.html.
    Ответ написан
    2 комментария
  • Как изменить uri на новый (для обработки другим локейшном) без редиректа?

    Bahusss
    @Bahusss
    Python Master
    Предлагаю скомбинировать:

    location ~ ^/cg-([0-9]*)[/]*$ {
        rewrite ^/cg-([0-9]*)[/]*$ /property/cg-$1 break;
        try_files $uri @php;
    }
    
    location @php {
        include  fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        fastcgi_pass  unix:/var/run/php-fpm.sock;
    }
    Ответ написан
  • Как правильно реализовать мультипоточность?

    Bahusss
    @Bahusss
    Python Master
    Предлагаю вам свой вариант, через очередь задач:

    from Queue import Queue
    from threading import Thread
    
    def scrape(link):
        conn = sqlite3.connect('db.sqlite3')
        curs = conn.cursor()
        # insert link, close connection
    
    class Worker(Thread):
    
        def __init__(self, tasks):
            super(Worker, self).__init__()
            self.tasks = tasks
            self.daemon = True
    
        def run(self):
            while True:
                link = self.tasks.get()
                try:
                    scrape(link)
                finally:
                    self.tasks.task_done()
    
    
    if __name__ == '__main__':
        # максимальное количество одновременных потоков
        capacity = 0  # infinite
        queue = Queue(capacity)
    
        workers = 3
        for _ in range(workers):
            Worker(queue).start()
    
        for link in select.fetchall():
            queue.put(link)
    
        queue.join()
        print 'Done'
    Ответ написан
    4 комментария
  • Как исправить ошибку с Uwsgi?

    Bahusss
    @Bahusss
    Python Master
    При такой конфигурации nginx ваш test.ini должен выглядеть так:
    [uwsgi]
        socket = /home/adminko/projects/test/uwsgi.sock
        plugins = python
        virtualenv = /home/adminko/virtualenv/test/
        chdir = /home/adminko/projects/test/
        env = DJANGO_SETTINGS_MODULE=test.settings
        module = django.core.wsgi:get_wsgi_application()

    Насчет nginx'a вы думаете неправильно - за вас uwsgi он не запустит и будет отдавать вам 502 код. Если вам мешает постоянно открытая консоль с запущенных uwsgi - запустите его как демон с помощью параметра daemonize, добавьте в конфиг:

    daemonize = [путь к лог файлу uwsgi]
    Ответ написан
    Комментировать
  • Почему не получается запустить django testserver с fixtures?

    Bahusss
    @Bahusss
    Python Master
    При запуске тестов база не создается абсолютно пустой, т.к. Django выполняет несколько дополнительных шагов после выполнения syncdb или migrate (в новых версиях), например она вызывает метод update_contenttypes, который и заполняет табличку ContentTypes.

    Вариантов решения проблемы несколько, но предлагаю дампить данные такой строчкой:
    ./manage.py dumpdata --natural -e contenttypes -e auth.Permission > dump.json

    Таким образом вы исключите из фикстуры данные, которые и так создаются автоматически при каждом запуске тестов.

    Для дальнейшего чтения рекомендую stackoverflow.com/questions/853796/problems-with-c...
    Ответ написан
    Комментировать
  • Есть ли в Python и Go делегаты?

    Bahusss
    @Bahusss
    Python Master
    Делегирование - это шаблон проектирования, и реализовать его можно на большинстве современных языков программирования. Пример для Python есть в вики, никаких дополнительных ключевых слов для реализации делегатов в питоне не требуется, т.к. любой метод можно передать в качестве параметра куда угодно. Так же можно помещать методы в структуры данных, вот пример:

    def say_hello(name):
        print 'Hello,', name
    
    def say_goodbye(name):
        print 'Bye,', name
    
    phrases = {
        'hello': say_hello,
        'bye': say_goodbye,
    }
    
    def say(what, name):
        phrases[what](name)
    
    say('hello', 'Ivan')
    say('bye', 'Oleg')


    В Go этот паттерн реализуется тоже очень лаконично.
    Ответ написан
    Комментировать
  • Как правильно создать *.exe при помощи pyinstaller на CentOS?

    Bahusss
    @Bahusss
    Python Master
    Все достаточно внятно написано в FAQ pyinstaller'a - он не работает как кросс-компайлер, поэтому собрать виндовый .exe из под CentOs можно только в wine: https://github.com/pyinstaller/pyinstaller/wiki/FA...
    Ответ написан
    Комментировать
  • Как создать уникальный буквенный id для каждой записи?

    Bahusss
    @Bahusss
    Python Master
    Попробуйте hashids.org, библиотека позволяет генерировать уникальные последовательности символов с заданным алфавитом для произвольных integer значений.
    Ответ написан
    Комментировать
  • Как экспортировать результат выполнения из другого модуля в python?

    Bahusss
    @Bahusss
    Python Master
    Если я правильно понял вопрос, вам необходимо добавить некое глобальное хранилище, где вы сможете сохранять результаты выполнения декоратора register. В простом случае выглядеть это может так:

    создаете рядом с main.py новый файл, допустим api_routing.py со следующим содержимым:
    # здесь может быть структура и посложнее, все зависит от потребностей
    # если планируется использование тредов, то возможно лучшим вариантом будет threading.local
    # или это может быть объект с методом add например
    API_ROUTING_TABLE = {}

    Далее в файле \api\module1\function1.py:
    # в PYTHONPATH должна быть добавлена директория где лежит api_routing.py 
    # это можно сделать разными способами, 
    # подробнее здесь https://docs.python.org/2/tutorial/modules.html#the-module-search-path
    from api_routing import API_ROUTING_TABLE
    
    # использовать изменяемые структуры данных в параметрах по умолчанию - плохой тон и поле для ошибок
    def register(path,
                 method="GET",
                 content_type="application/json",
                 parameters=(),
                 responseMessages=(),
                 nickname=None,
                 notes=None,
                 bp=None):
        def inner_func(f):
            # сохраняем информацию об API-вызове в глобальную переменную
            API_ROUTING_TABLE[path] = {'method': method, 'content_type': content_type, ...}
    
            print (path, f, method, content_type, parameters,
                           responseMessages, nickname, notes, bp)
        return inner_func

    теперь в main.py вы можете написать:
    # эти импорты обязательны в начале, если их не будет то API_ROUTING_TABLE не заполнится
    from api.module.function1 import Class1
    
    from api_routing import API_ROUTING_TABLE
    print API_ROUTING_TABLE


    Таким образом переменную API_ROUTING_TABLE можно импортировать в любом месте вашего кода, главное чтобы до этого импорта где-нибудь раньше обязательно были заимпорчены модули, в которых применяется декоратор register.
    Ответ написан
    Комментировать
  • Неблокирующее чтение (на уровне ос) файла в питоне?

    Bahusss
    @Bahusss
    Python Master
    Если речь идет про *nix, то посмотрите в сторону функции os.open: https://docs.python.org/2/library/os.html#os.open, скорее всего вам необходимо открывать файл с флагом O_NONBLOCK, больше информации здесь.

    C Windows все сложнее: stackoverflow.com/a/18262401/385884
    Ответ написан
    Комментировать
  • Почему сайт не отображается когда я использую сокеты вместо портов в uwsgi?

    Bahusss
    @Bahusss
    Python Master
    Судя по конфигурации nginx - он слушает стандартный 80 порт, но заходите вы почему-то на mysite.ru:8000.
    Ответ написан
  • Reverse() функция или тэг шаблонов url?

    Bahusss
    @Bahusss
    Python Master
    А у вас во вью weblog.views.posts параметры year, month, page — указаны как аргументы?
    Ответ написан
    1 комментарий
  • Почему User Profile Service в Windows 7 не проходит logon и как это починить?

    Bahusss
    @Bahusss
    Python Master
    > Система стала радостно сообщать, что мол Permission denied, вводи пароль администратора…

    Что-то не припомню чтобы 7-ка хоть раз запрашивала «пароль» администратора, обычно нужно просто кнопку нажать на окне UAC'a. Это точно виндовое окно?

    >Но там написано про некие Group Policy settings… Хм, думаю, однако… Я туда точно не лез, и ничего не менял, и вообще на сайте Microsoft написано, что такого в Windows 7 Professional нету, а есть оно только в Enterprise и Ultimate версиях.

    Ну это неправда — gpedit.msc есть и в Professional версии.

    > Я даже в Реестре не могу найти ничего, связанного со вновь создаваемым пользователем.

    В майкрософте понимают проблемы линуксоидов при использовании альтернативных ОС, поэтому сделали в статье большую кнопку FixIt, по клике на которую скачивается msi файл, который при запуске должен исправить проблему автоматически — его пробовали?

    Как мне кажется корень проблемы в том, что кто-то (или что-то) изменил права доступа к папке Users где хранятся профайлы пользователей. Там должны быть группы Administrators с всеми возможными правами и Users и Everyone с правами на чтение.
    Ответ написан
    1 комментарий
  • Причуды Windows 7?

    Bahusss
    @Bahusss
    Python Master
    Вопрос первый: работает ли Numlock и CapsLock в таких ситуациях?
    Вопрос второй: с другой клавиатурой на этой же машине происходит то же самое?
    Ответ написан
  • Объединение нескольких exe-шников в один?

    Bahusss
    @Bahusss
    Python Master
    У ninite есть про-версия https://ninite.com/pro, там есть офлайн инсталлятор. Правда придется платить 20 баксов в месяц :)
    Ответ написан
    Комментировать
  • MS Office, при переходе по ссылке: "Эта операция была прервана из-за ограничений наложенных на данный компьютер. Обратитесь к системному администратору"

    Bahusss
    @Bahusss
    Python Master
    А можете посмотреть что у вас в политиках безопасности в следующих пунктах:

    gpedit.msc-> User Configuration -> Administrative Templates -> System -> Don't run Specific Windows application и Run only specific windows application и Restrict these programs from being launched from help?
    Ответ написан
  • Шум в наушниках?

    Bahusss
    @Bahusss
    Python Master
    Только ленивый не задавал этот вопрос на просторах интернета.

    1) Проверить не идет ли шнурок от CD-DVD устройства к звуковухе, если идет — вытащить его.
    2) Если наушники подключены не напрямую к звуковухе, а к выводу на переднюю панель — попробовать подключить непосредственно к аудио-карте.
    3) Сменить интегрированный звук на внешний.
    Ответ написан
    1 комментарий
  • Не устанавливаются файловые ассоциации win7?

    Bahusss
    @Bahusss
    Python Master
    А вы все рекомендации прочитали в этой ветке forum.oszone.net/thread-153513.html? И ничего не помогло?
    От себя могу порекомендовать проверить права доступа на ветку HKEY_CLASSES_ROOT в реестре.
    Ответ написан