django中使用psyco报错问题的解决
我用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:其他数据库是不是都有这个问题? 有时间再去验证~~~