flask的路由功能很强大,可以很清晰明了的定义出需要的路由函数,但是由于python语言的弱类型设计引来了一些不易发现的问题
@app.route('/task/get', methods=['GET'])
def get_tasks():
"""
get the task list
:return:
"""
try:
key = request.args.get("key")
tasks = services.retrieve_tasks(key)
return tasks, 200
except Exception as e:
print(e)
return "get task failed", 500
如上,定义了如上一个route,用来获取指定key所对应的task列表,功能很简单,但是在调试过程中,报了以下错误
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/flask/app.py", line 1630, in finalize_request
response = self.make_response(rv)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/flask/app.py", line 1740, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/werkzeug/wrappers.py", line 921, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/werkzeug/wrappers.py", line 59, in _run_wsgi_app
return _run_wsgi_app(*args)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/werkzeug/test.py", line 923, in run_wsgi_app
app_rv = app(environ, start_response)
TypeError: 'int' object is not callable
这个错误的意思是用了一个int类型的对象去做函数调用,一开始以为是传进去的参数key必须要转义成int导致后面获取的时候错误造成的,但是看堆栈信息上又没有自己代码的信息,所以修改过后错误仍然存在。于是分析是不是flask本身的问题,从报错的那行代码“app_rv = app(environ, start_response)”逐步调试分析,这里的app在报错的时候等于1,而这个1是需要返回的任务编号,所以判断router函数的返回必须是一个str,用str()强制类型转换返回值后问题解决。
这类问题其实很常见,就是我们在调用python的一些库函数的时候,对这个函数的入参、返回值具体的约束无法得到清晰明了的了解,不像java,从函数定义上就可以知道所有的约束,即便看源码中的注释也无法完全了解。
另外对于router函数名称的定义,个人觉得是一个重复的操作,因为代码中已经给出了router的全局定义,又何必再命名一个unique的函数名呢。