给tornado的database.py增加dbutils支持

忘记什么时候在邮件订阅中看到smallfish的一个给tornado的database.py增加dbutils支持的文章了,去smaillfish的blog看了一下居然是09年写的一篇文章。小鱼修改的代码为:

def reconnect(self):
        """Closes the existing database connection and re-opens it."""
        self.close()
        try:
            from DBUtils import PooledDB
            pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
            self._db = pool_con.connection()
        except:
            self._db = MySQLdb.connect(**self._db_args)
            self._db.autocommit(True)

小鱼干掉了原有的设置autocommit(True)这一行代码,我估计主要是因为DBUtils没有autocommit()这个方法。干掉此行代码后会有一个小问题,就是如果mysql配置的autocommit=0的话,每次对数据库的修改是不会实时反馈给mysql数据库的。而原版的self._db.autocommit(True)这一行就是为了在保证在执行完一条SQL后,修改内容马上反馈给mysql。

Google一圈后我找到两个解决方案:

  • 一个是利用DBUtils的的setsession命令:
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, setsession=['SET AUTOCOMMIT = 1'], **self._db_args)
                self._db = pool_con.connection()
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)
  • 另一个就是类似tornado的做法给每个cursors的connection设置autocommit属性为True
    def reconnect(self):
            """Closes the existing database connection and re-opens it."""
            self.close()
            try:
                from DBUtils import PooledDB
                pool_con = PooledDB.PooledDB(creator=MySQLdb, **self._db_args)
                self._db = pool_con.connection()
                self._db.cursor().connection.autocommit(True)
            except:
                self._db = MySQLdb.connect(**self._db_args)
                self._db.autocommit(True)

Via:Chairo@2011年12月05日-EOF-

debian配置Tornado+MySql+nginx环境(附俺的网址缩短代码下载)

最近上线的网址缩短项目是学习Python的练手作,框架采用这一阵比较火热的Tornado。简单写一个配置安装顺序,仅为记录。全部软件均通过apt-get方式安装(Tornado除外)

  • 清除无用组件(感谢hostloc坛子的lsylsy2
    apt-get update&&apt-get upgrade
    apt-get -y purge apache2-* bind9-* xinetd samba-* nscd-* portmap sendmail-* sasl2-bin
    apt-get -y purge lynx memtester unixodbc odbcinst-* sudo tcpdump ttf-*
    apt-get autoremove && apt-get clean
  • 安装python 2.6
    apt-get install python2.6
    rm /usr/bin/python
    ln -s /usr/bin/python2.6 /usr/bin/python
    apt-get install python-pycurl
  • 安装Tornado
    wget -c http://github.com/downloads/facebook/tornado/tornado-2.1.1.tar.gz
    tar xvzf tornado-2.1.1.tar.gz
    cd tornado-2.1.1
    python setup.py build
    python setup.py install
  • 安装MySql(感谢hostloc坛子的挨个搞
    apt-get install mysql-server mysql-client
    invoke-rc.d mysql stop
    rm -f /var/lib/mysql/ib*
    cat > /etc/mysql/conf.d/actgod.cnf <<END
    [mysqld]
    key_buffer = 8M
    query_cache_size = 0
    skip-innodb
    END
    invoke-rc.d mysql start
    passwd=`get_password root@mysql`
    mysqladmin password "password"
    cat > ~/.my.cnf <<END
    [client]
    user = root
    password = password
    END
    chmod 600 ~/.my.cnf
    apt-get install python-mysqldb
  • 安装json支持
    apt-get install python-dev python-simplejson
  • 安装nginx(依旧感谢hostloc坛子的挨个搞
    apt-get install nginx
    cat > /etc/nginx/conf.d/actgod.conf <<END
    client_max_body_size 20m;
    server_names_hash_bucket_size 64;
    END
    sed -i s/'^worker_processes [0-9];'/'worker_processes 1;'/g /etc/nginx/nginx.conf
  • nginx站点配置感谢飞龙的Tornado站点镜像(略有修改,有部分参考了军哥的 lnmp中nginx配置
  • 也可以直接拿走俺的nginx配置文件

附俺网址缩短项目的代码下载(并不完善,只实现了基本功能):http://chairo.free.fr/down/shorturl.rar

Via:Chairo@2011年10月30日-EOF-

Tornado获取客户端IP(补充)

今天发现犯了一个错误,前几天写过一篇“tornado获取客户端IP”,但今天查看数据库中数据时候发现所有的IP均是127.0.0.1(因数据库使用bigint存储,所以数据库中看到IP均是2130706433),在Group中搜索了一下发现Ben以前解释过这个问题


Ben Darnell
Tornado supports both x-real-ip and x-forwarded-for, but you have to set
xheaders=True in your HTTPServer constructor to have it look at either of
them.

-Ben


即tornado支持通过 x-real-ip 或 x-forwarded-for来获取IP,但前提是需要在你的HTTPServer实例中增加xheaders=True参数,如:http_server = tornado.httpserver.HTTPServer(Application(), xheaders=True),否则通过self.request.remote_ip取到的IP只能是127.0.0.1。

BTW:nginx配置x-forwarded-for时只需在反向代理规则中增加一行:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以上内容均来自:http://groups.google.com/group/python-tornado/browse_thread/thread/c2898018e40125c9

Via:Chairo@2011年10月26日-EOF-

汇报下这几天的工作

这些天没有动力来写什么东西,趁有时间稍微完善了下前几天学习python的作品“网址缩短”,之前记录短链接点击记录时候没有过滤搜索引擎蜘蛛爬虫…So,日志中有超级多的蜘蛛数据。这次修改了下过滤了User-Agent中有bot和spider字样的数据,这些数据只跳转不做记录。

另外一个主要修改的地方就是增加了一个简单的后台管理,后台可以简单粗暴的删除短链接、可以暂停启用短链接(现在的规则是添加短链接默认是启用,但俺会时不时上去看一下,如果有比较多的恶意链接或者非法内容,可能稍后启用关键词过滤或者粗暴的启用完全审核机制)

下一步会简单重构一下代码,现有代码基本都写在一个py文件中(虽然代码只有200行,但有必要抽离一部分代码出来了,现只抽离了后台的分页代码和BaseHandler出来)。

总结下现在使用到的资源及版本:Debian6、python 2.6、MySql 5.1.49、tornado 2.1.1、nginx 0.7.67(除tornado外均通过apt-get方式安装)

Via:Chairo@2011年10月26日-EOF-

新上线一个python(tornado)的短网址站

最近都没有更新内容,十一基本和网络断掉了。节后在处理一个短信上行接口的东西,这几天用学到的简单python做了个网址缩短的小站点。网址为:http://au81.com

整体代码(不包含第三方代码库)没超过150行(算上注释、空格)。python就是可以写很少的代码做比较强大的功能。

BTW:明天要开始学习Java了,虽然心底里痛恨这个臃肿的东西,但为了混个饭吃,不得不学习。

Via:Chairo@2011年10月18日-EOF-