Показаны сообщения с ярлыком python. Показать все сообщения
Показаны сообщения с ярлыком python. Показать все сообщения

вторник, 10 августа 2010 г.

Ура! Удалось на Centos 5 запустить cherokee + uwsgi

Наконец то получилось запустить это связку под Centos 5 (2.6.27.41-170.2.117.fc10.i686.PAE).

Версии:
  • Cherokee: 1.0.8
  • uwsgi: uWSGI 0.9.6-dev (скомпилировано под Python 2.6)

Все скомпилировано из свежих репозиториев. Ранее у меня не получалось настроить чероки - визард не находил uwsgi. Сейчас в новой версии - все супер!

среда, 3 марта 2010 г.

Python 2.6 в CentOS5

Подсмотрено тут.

wget http://python.org/ftp/python/2.6.4/Python-2.6.4.tar.bz2

tar -xjf Python-2.6.4.tar.bz2

cd Python-2.6.4

yum install -y gcc make zlib-devel bzip2-devel openssl-devel readline-devel sqlite-devel gdbm-devel ncurses-devel

./configure --prefix=/opt/python26 --with-zlib=/usr/include

make

make install

ln -s /opt/python26/bin/python2.6 /usr/bin/python2.6

python2.6 -V

Теперь 2.6 версия вызывается через python2.6

Установка easy_install:

wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086

sh setuptools-0.6c11-py2.6.egg

ln -s /opt/python26/bin/easy_install-2.6 /usr/bin/easy_install-2.6

easy_install-2.6 --help

Соответственно вызывать через easy_install-2.6

Настройка работы с MSSQL с линукса (CentOS 5)

Столкнулся с написанием скриптов для работы на линукс-сервере с MsSQL-базой на питоне. Основная проблема - сообщение типа


pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier. (4004) (SQLExecDirectW)')


Как же так? Просто нужно настроить использование правильной версии драйвера.

Итак. Первое - запись о драйвере в /etc/odbcinst.ini
[FreeTDS]
Description=TDS driver
Driver=/usr/lib/libtdsodbc.so
Setup=/usr/lib/libtdsS.so
FileUsage=1

Второе - добавить запись о сервере в /etc/freetds.conf
[myServer]
    host=192.168.0.2
    port=1433
    tds version=8.0
Особенно прошу учесть "табы" перед параметрами! У меня без них запись не срабатывала!

Третье - добавить DSN-запись в /etc/odbc.ini
[myDNS]
Description=my dsn
Driver=FreeTDS
Database=my_db
Servername=myServer

Теперь код для работы с бд выглядит так:
import pyodbc
conn = pyodbc.connect("dsn=myDSN;UID=%s;PWD=%s;" % ('sa','pass'))
cursor=conn.cursor()
cursor.execute("select 'test' as x;")
row=cursor.fetchone()
if row:
    print row

Успехов!

пятница, 4 декабря 2009 г.

Werkzeug + SQLAlchemy + Jinja2 + Memcached = Маст трай

Да, да, да! Дошли таки руки! Django отложен в темный ящик, так как мне нужна бОльшая гибкость. Да и админка не нужна совсем в том проекте, который делаю (секрет :-).

Хорошо, что перед встречей с werkzeug я поковырялся с GAE Python (сделал нечто вроде блога). Это помогло мне сделать этакий фреймворк для обработки запросов.
К примеру сделал свой базовый класс Controller. Это объект с response и request классами внутри.

Куски класса:
class Controller():
    def __init__(self, request):
    def get(self): #вызывается при get-запросе
    def post(self): #вызывается при post-запросе
    def render_template(self, template, **context): #так вызывается шаблонизатор
    def preprocess(self): # дергается в конце инициализации. сюда можно навесить декоратор для проверки прав доступа
Кроме того, Controller при каждой инициализации создает в себе объект self.current_user - думаю понятно что это :-)

Еще очень обрадовал шаблонизатор:
- он кэширует шаблоны! (т.е. хранит их в своем пре-компилед виде).
- макросы (можно загружать из файла)

Отдельно помучался с апачем + wsgi. Но как обычно - документация спасает.

П.С.: просто надоел зависающий IIS6

воскресенье, 8 ноября 2009 г.

Cherokee + uWSGI + Django How-To

Навеяно:
http://habrahabr.ru/blogs/python/67475/
http://m.habrahabr.ru/post/70531/
---

Решил тут я попробывать веб-сервер cherokee для django-сайта. Обычно используется flup-прослойка, а я хотел задействовать uwsgi.

Что я сделал (опишу успешные шаги):
1. создал новый django-проект
2. создал новый app "dummy" с простым выводом:
def index(request):
    return HttpResponse('hello from django!')
3. установил cherokee последнюю версию из svn (на сайте чероки описано как это сделать), т.к. в текущей 0.99.19 нет визарда для настройки uWSGI...
4. сайты у меня находятся в каталоге /var/www-cherokee (владелец www-data)
5. в каталог django1 я скопировал свой проект.
6. в /var/www-cherokee нужно поместить uwsgi.xml - это конфигурационный файл для запуска джанго-сайта. содержание моего:
<uwsgi>
    <pythonpath>/var/www-cherokee/</pythonpath>
    <pythonpath>/var/www-cherokee/django1</pythonpath>
    <app mountpoint="/">
        <script>/django1/django_wsgi</script>
    </app>
</uwsgi>
обратите внимание на пути в pythonpath - без них работать не будет.
7. в /var/www-cherokee/django1 помещаем скрипт для вызова джанго (django_wsgi):
#some code for run on cherokee web server

import os
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
application = django.core.handlers.wsgi.WSGIHandler()
8. в настройках cherokee (в которые легко попасть через sudo cherokee-admin -u и потом в браузере http://localhost:9090) нужно в разделе "Virtual Server: default" вызвать "wizards"->platforms ->uWSGI ->run wizard.
так же в параметре "Interpreter" проверьте путь до конфига uwsgi.xml (у меня строка выглядит так: /usr/bin/uwsgi -s /tmp/cherokee-source11.sock -C -x /var/www-cherokee/uwsgi.xml )

В принципе - все. Перезапустил сервер и в браузере увидел "hello..."

П.С.: о сломанных копьях в процессе конфигурации я умолчу. если что - я настраивал по этому посту.
П.П.С: если что то не работает (я сначала получал только "uwsgi error" в браузере) - попробуйте запустить в окне терминала строчку из настройки интерпретатора (/usr/bin/uwsgi -s /tmp/cherokee-source11.sock -C -x /var/www-cherokee/uwsgi.xml) и не закрывая его обновить страницу в браузере. потом в терминале можно увидеть ошибки (я так нашел неправильно указанный путь)... ВНИМАНИЕ! после запуска интерпретатора в ручную нужно удалять файл /tmp/cherokee-source11.sock (в моем случае)!

---
тесты:
1. flup
2. uWSGI

= 1 =============
Document Length: 18 bytes

Concurrency Level: 10
Time taken for tests: 102.068 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1660166 bytes
HTML transferred: 180018 bytes
Requests per second: 97.97 [#/sec] (mean)
Time per request: 102.068 [ms] (mean)
Time per request: 10.207 [ms] (mean, across all concurrent requests)
Transfer rate: 15.88 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.8 0 39
Processing: 3 101 241.3 39 3777
Waiting: 0 98 236.6 38 3777
Total: 3 102 241.3 40 3778

Percentage of the requests served within a certain time (ms)
50% 40
66% 56
75% 69
80% 79
90% 171
95% 292
98% 1125
99% 1226
100% 3778 (longest request)

= 2 =============
Document Length: 18 bytes

Concurrency Level: 10
Time taken for tests: 20.044 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1660000 bytes
HTML transferred: 180000 bytes
Requests per second: 498.90 [#/sec] (mean)
Time per request: 20.044 [ms] (mean)
Time per request: 2.004 [ms] (mean, across all concurrent requests)
Transfer rate: 80.88 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 4
Processing: 3 19 5.4 19 46
Waiting: 3 19 5.3 19 46
Total: 5 20 5.3 19 47

Percentage of the requests served within a certain time (ms)
50% 19
66% 20
75% 22
80% 23
90% 27
95% 30
98% 34
99% 38
100% 47 (longest request)

= результат ======================
flup/uWSGI
Requests per second: 1 к 5
Transfer rate: 1 к 5

В основном 1 к 5!

четверг, 24 сентября 2009 г.

GAE. Bulkload. Загрузка дампа.

Изучаю Google App Engine. Тестирую. Столкнулся с необходимостью загрузить дамп таблицы. Много времени потратил, пытаясь сделать все по инструкции. Оказалось - она несколько устаревшая что-ли...

Публикую мой рабочий пример:
Конфиг app.yaml:
application: fun-test
version: 2
runtime: python
api_version: 1

handlers:
- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin

- url: /.*
  script: main.py

Класс для загрузки .csv - uploader.py (обратите внимание - класс bulkloader не подключен, в коде фигурирует просто Loader):
# coding=UTF-8
import datetime
from google.appengine.ext import db

class Test(db.Model):
 Name=db.StringProperty()
 LastName=db.StringProperty()
 
class TestLoader(Loader):
 def __init__(self):
  Loader.__init__(
   self, 
   'Test',
   [('Name',str),
   ('LastName',str)]
  )   
 
loaders = [TestLoader]

Дамп d.csv:
Jonny, Lee
Carl,Donny
Nick,Cookie

Вызов процесса аплоада дампа: (обратите внимание на то, что вызывается bulkloader.py - в текущей версии appcfg.py у меня не умеет делать аплоад! Вызов для удобства разбиваю на строки...)
C:\Program Files\Google>c:\Python25\python.exe 
google_appengine/bulkloader.py
--filename=testapp/d.csv
--kind=Test
--url=http://localhost:8080/remote_api
--config_file=testapp/uploader.py
--app_id=fun-test

Вот. Только так у меня сейчас и работает. Успехов!