前言
不知情时踩过的坑,说多了都是泪。
本文不讲书上有的内容,讲讲实际碰到,但是在网上没有看到相关例子的(可能我的思路太奇特)。
访问404
常见会抛出404的:
1.数据库查询first_or_404()
2.路由地址错误
路由地址错误:
情形一:为空
设置多个路由很方便,于是因为需要,我写了如下代码:
@test.route('/testDatas',defaults={'modulename':'','classname':'','funname':''},methods=['GET', 'POST'])
@test.route('/testDatas/<modulename>,<classname>,<funname>',methods=['GET','POST'])
def testDatas(modulename,classname,funname):
...
return render_template('test/testDatas.html',modulename=modulename,classname=classname,funname=funname)
模板中调用方式一:
{{url_for(‘e9Testdata.testDatas’,modulename=newname,classname=classname,funname=funname}}
没问题。
在第一次采用调用方式一后,modulename有新的值了,其他值未更新,于是采用第二种:
{{url_for(‘e9Testdata.testDatas’)}}
结果是404。
我就在那想为什么,猜测是不是因为值为空的原因(平常写代码习惯默认值赋空值了)。于是修改代码:
@test.route('/testDatas',defaults={'modulename':'0','classname':'0','funname':'0'},methods=['GET', 'POST'])
@test.route('/testDatas/<modulename>,<classname>,<funname>',methods=['GET','POST'])
def testDatas(modulename,classname,funname):
...
return render_template('test/testDatas.html',modulename=modulename,classname=classname,funname=funname)
果然,这样就ok了。
情形二:int类型,负数识别问题
视图中的路由:
@interface.route('/interface/<tab>/<int:menu>/<int:page>/<int:per_page>
模板中传参:
{{url_for('interface.show_interface',tab='case',menu=-1,page=1,per_page=10)}}
结果:报404
原因:menu=-1,传入的-1,在路由转换时并不会把它认为是-1。(可查看routing.py中的匹配)
总结
1.参数值不能为空。为空的时候地址就是/testDatas/newname%2C%2C,路由处理时会丢掉空的(routing.py),于是就找不到对应的视图函数了。
2.int类型参数值不能为负数。