Янв 21

Apache mod_wsgi и SQLite база

Если вдруг внезапно unable to open database file — это апачу не хватает прав на запись в папку с базой. Ну это если других косяков нет

Июл 15

Логи на удаленный syslog-ng

А все просто, стандартный модуль logging вполне справляется с этим:

import logging
from logging.handlers import SysLogHandler
log = logging.getLogger('loggername')
log.addHandler(SysLogHandler(address=('localhost', 514)))
log.setLever(logging.INFO)
log.info('Log test')

Крайне рекомендуется прочесть logging-cookbook

Июл 14

Как использовать Django из внешнего скрипта

Для асинхронной задачи можно создать команду (django management command), или подключить джагну к своему сприпту:

import sys
sys.path.append('/path/to/django/projectname')
from projectname import settings
from django.core.management import setup_environ
setup_environ(settings)
#Получаем настроенную среду django:
from main.models import Model1
print Model1.objects.all()
Июн 01

OpenOCD & OSX & FTDI-CoLink

Если установлены драйвера FTDI VCP (Virtual Com Port) OpenOCD к Colink не подцепится — канал A уже используется.
Или выгрузить кекст или поправить
/System/Library/Extensions/FTDIUSBSerialDriver.kext/Contents/Info.plist
на предмет комментирования секции подключения канала А:

                <key>FT2232C_A</key>
                <dict>
                        <key>CFBundleIdentifier</key>
                        <string>com.FTDI.driver.FTDIUSBSerialDriver</string>
                        <key>IOClass</key>
                        <string>FTDIUSBSerialDriver</string>
                        <key>IOProviderClass</key>
                        <string>IOUSBInterface</string>
                        <key>bConfigurationValue</key>
                        <integer>1</integer>
                        <key>bInterfaceNumber</key>
                        <integer>0</integer>
                        <key>idProduct</key>
                        <integer>24592</integer>
                        <key>idVendor</key>
                        <integer>1027</integer>
                </dict>

ну и перезагрузить кекст.

Апр 23

Админка по-умолчанию для всех моделей

В процессе разработки часто требуется по-быстрому зарегистрировать в админке все модели,
на мой взгляд, самый простой и быстрый способ:
добавить в admin.py:

from django.contrib import admin
import models
 
#Функция возвращающая список моделей в модуле
def list_models(module):
    import inspect
    from django.db import models
    classes = []
    for name, obj in inspect.getmembers(module):
        if inspect.isclass(obj) and issubclass(obj, models.Model):
            classes.append(obj)
    return classes
 
#Регистрируем все модели
for model in list_models(models):
    admin.site.register(model, admin.ModelAdmin)
Фев 13

Windows, COM, 1C и Python

Пролог

Потребовалось сделать выгрузку из 1С в куда-то еще. 1С версии 8.2, но подобным же образом можно получить данные из 7.7, 8.0, 8.1 и думается 8.3 — только названия документов другие.
Данные будем получать через COM — на сколько я знаю, у 1Сников это довольно распростаненный способ, и документации довольно много.
Для работы с COM на питоне потребуется модуль win32com — установка ничем необычным не отличается.

Для напримера, из стандартной конфигурации 1C Бухгалтерия 2.0 забирать список выставленных счетов и отправлять на некий сайт.
Continue reading

Фев 09

Ускоряем Django: View на С

Иногда требуются ресурсоемкие вычисления, и узким местом становится именно питон. Тогда на помощь приходит код написанный на C/С++
К счастью питон-модули пишутся довольно просто, и документация с примерами есть на официальном сайте. Никакой америки я сейчас не открою, и если вы когда-нибудь сталкивались с написанием модуля для питона — далее можно не читать — все довольно примитивно.

Continue reading

Фев 06

Django: POST

Тут все предельно просто, параметры POST-запроса парсятся и услужливо складываются в словарь POST объекта request, который всегда передается первым параметром в любой view.
Пример.
Форма

<form method="POST" action="/hello">
<label>Name:</label><input type="text" name="name" />
<input type="submit" /> 
</form>

view обрабатывающий URL /hello:

@csrf_exempt # глушилка защиты CSRF, об этом ниже
def hello(request):
text = ""
 if "name" in request.POST: 
  text = u"Параметр POST передан: привет %s" % request.POST['name']
 else:
  text = u"Параметр POST не передан"
 return HttpResponse(text)

Continue reading

Янв 26

Django. Передача GET-параметров

В продолжении Личное: Django. От простого

Научим приложение main здороваться с конкретным человеком. Для этого нужно в представление сообщить имя этого человека: модифицируем наше представление:

def hello(Response, name='World'):
 return HttpResponse("Hello %s!" %name)

Теперь функция представления принимает один необязательный аргумент name
Добавим привязку в urls.py

url(r'^(\w+)$', 'main.views.hello'),

Подробнее с регулярными выражениями можно познакомиться в документации на Python http://docs.python.org/2/library/re.html

В случае совпадения URL с данным регулярным выражением, Django вытащит группу указанную в скобках \w+ в качестве второго параметра функции представления: например запрос

http://127.0.0.1:8000/User
приведет к вызову

hello(Request,"User")

И страничка поздоровается c User:

Hello User!