运行Django的单元测试:python manage.py test,出错。经查发现某些列的数据是中文,而Django自动创建的测试数据库编码是latin1。需要用数据库的TEST_CHARSET变量来指定测试数据库的编码,设为utf8就可以了。
运行一次完整的测试很慢。用time python manage.py test这里的测试用例大部分都是Django默认的,跑完432个测试总共用了2分7秒,而执行测试的时间只有36秒,大部分时间在创建和销毁数据库了。
Ran 432 tests in 36.068s
FAILED (errors=1, skipped=1)
Destroying test database for alias 'default'...
real 2m7.215s
user 0m25.922s
sys 0m1.028s
如果用SQLite做测试数据库,则完全使用的内存数据库,想必会比MySQL快。按照这个帖子,把测试数据库改为SQLite后,测试速度大大提高,同样的测试只用了18秒,其中16秒都是跑测试的时间。
Ran 432 tests in 15.844s
FAILED (errors=1, skipped=1)
Destroying test database for alias 'default'...
real 0m17.866s
user 0m17.121s
sys 0m0.432s
以后测试就用SQLite了。
2013年8月22日星期四
2012年11月12日星期一
查看Django Debug Toolbar
我在本地打开线上staging环境的Django网站,想用Django Debug Toolbar来查看SQL查询的情况。Django Debug Toolbar显示的默认条件是settings.DEBUG为True,并且用户IP在settings.INTERNAL_IPS里面。但是manage.py启动的服务器在日志里不显示IP地址:
其实不用这么麻烦,可以在DEBUG_TOOLBAR_CONFIG里面设置'SHOW_TOOLBAR_CALLBACK'指到对应的函数即可,见Debug Toolbar的文档。
[12/Nov/2012 21:05:35] "GET /releng/ HTTP/1.1" 200 275953我想从Staging服务器上的Django日志里面看到本地电脑访问时的IP地址,找到了这个ticket,通过修改basehttp.py可显示IP:
[12/Nov/2012 19:22:21] (119.253.xx.xx) "GET /static/css/base.css?v=bc043 HTTP/1.1" 200 9301然后把这个IP加入INTERNAL_IPS,开启settings.DEBUG即可显示Debug Toolbar了。
其实不用这么麻烦,可以在DEBUG_TOOLBAR_CONFIG里面设置'SHOW_TOOLBAR_CALLBACK'指到对应的函数即可,见Debug Toolbar的文档。
2012年10月21日星期日
Django项目的路径设置
一个别人的Django项目,在命令行用manage.py启动是正常的,但在Eclipse里启动后却出错,页面显示找不到django-session表。发现是找不到SQLite数据库文件的原因。可以看出,django-session是Django进程访问的第一个表,以后如果碰到这个错误,那么一定是数据库配置的问题。
新建PyDev Django项目时,会有对话框来设置项目,包括数据库类型和库名。对于目录里已有相关文件的项目,这个设置是无效果的,该设置是为了给新建项目生成settings.py。出错开始,我还以为需要改正在这个对话框提供过的设置,就在项目属性里找相关的设置,但找不到。其实所有Django相关的设置都在settings.py里面。
在settings.py里面,SQLite数据库文件是直接写的文件名,这就是个相对路径,相对于Django进程的工作目录,即getcwd(3)的结果。如果不是从项目根目录启动manage.py(假设settings.py和manage.py都在根目录),那就找不到数据库文件,因为在PyDev里面启动Django时,进程工作目录是Eclipse的Workspace所在目录。
所以不要提供相对路径,而应该使用“动态的绝对路径”。在settings.py的开头写入:import os.pathROOT = os.path.dirname(os.path.abspath(__file__))
这样ROOT就是settings.py文件所在目录,根据ROOT来指定项目文件的目录,包括SQLite数据库文件、静态文件等,不论从哪里启动项目,文件都可以找到。
2012年9月25日星期二
Django模板的forloop出错
在Django模板的for循环中用了一句:
原来用的是Jinja2。加上Jinja再搜索找到了文档,原来Jinja2里面forloop叫loop,把forloop改为loop就好了。
{% if not forloop.last %}出错了:
Exception Type: UndefinedErrorGoogle搜索未解,再看出错信息:
Exception Value: 'forloop' is undefined
Exception Location: /usr/local/lib/python2.7/dist-packages/jinja2/environment.py in getattr, line 372
原来用的是Jinja2。加上Jinja再搜索找到了文档,原来Jinja2里面forloop叫loop,把forloop改为loop就好了。
订阅:
博文 (Atom)