注册 登录
编程论坛 Python论坛

django中使用psyco报错问题的解决

codelet 发布于 2009-08-26 16:41, 1517 次点击
我用django创建了一个网站。一开始功能比较简单,运行效果良好。
   
    为了增加session管理,我照着django教程里面的例子,使用了数据库。
settings.py中定义如下:
    DATABASE_ENGINE = 'sqlite3'           
    DATABASE_NAME = './session.db'  

给每个新请求添加一个session标识:request.session["uid"] = uid;每个请求上来的时候,通过request.session.get("uid")获取客户端带上来的sessionid.
    到了这里运行情况都是正常的。没有出现问题。

    后来业务逻辑变得复杂了,效率问题凸现。于是我想引入psyco模块,给整个后台提速。在每个业务模块的开头添加psyco.
代码是这样添加的:
try:
    import psyco
    psyco.full()
except:
    pass


    这时候问题出现了。客户端请求服务器时,有的业务工作正常,有的业务逻辑报一个错误:
TypeError at /do
descriptor '__dict__' for 'Empty' objects doesn't apply to 'BaseQuery' object


    经过观察分析发现:当访问一些没有用到session的页面时,服务器正常响应客户端。一旦执行有关session处理的业务就会出现上面的那种错误了。

    这时候我把psyco注释掉,所有业务又都工作正常了。

    经过再三思考,出错提示那里描述的内容是与数据库相关的,因此我想,会不会是因为psyco模块和session数据库(sqlite3)有冲突呢?我单独验证了一下包含了request.session.get("uid")方法调用的模块,果然问题就出在这里。只要是在request.session.get("uid")方法定义之前使用了psyco,都会出问题。

    找到问题的原因就好办了。当我尝试在request.session.get("uid")方法之后添加以下代码(并且该模块的导入模块中都不能包含psyco):

try:
    import psyco
    psyco.bind(method/class)
except:
    pass


    所有业务顺利通过!!!!
   

    经过简单验证,用了psyco模块,后台执行效率提高了不少

   ps:其他数据库是不是都有这个问题? 有时间再去验证~~~
2 回复
#2
codelet2009-08-27 13:48
发现我自己对于工作学习上碰到的问题还是不够钻,浅尝辄止。像这个问题,只是表面解决了,但实际上还是没有找到问题具体的所在以及根本的解决方法。
自省自省。
#3
gengwenbin2009-09-01 11:23
加油加油
1