Python Tornado 休息 API 调用未呈现到移动设备
Python Tornado rest API calls not rendering to mobile
API 结果呈现到桌面但不呈现到我的 iPhone。所以我有一个简单的休息 API 我正在从 ReactJS 前端进行调用。在使用 superagent 遇到很多麻烦后,我正在使用 axios。我在任何浏览器控制台、桌面或移动设备上都没有收到任何错误(一直在使用 jsconsole 调试我的 iphone 5)。然而,在我的 Python Tornado 后端,它在桌面和移动设备上都抛出了一些错误:
第一名:
tornado.application:Uncaught exception GET
第二名:
ERROR:tornado.general:Cannot send error response after headers written
ERROR:tornado.general:Failed to flush partial response
第三名:
During handling of the above exception, another exception occurred:
这可以作为我的 Python env 文件中发生的错误发现
TypeError: 'str' object is not callable
none 使 script/app 崩溃...这是我使用 axios 的 ReactJS/Javascript:
componentDidMount() {
console.log('componentDidMount');
const url = 'http://127.0.0.1:3000/api/generator';
axios.get(url).then((response) => {
const results = response.data
console.log(JSON.stringify(results.data))
this.setState({data: results.powergen})
})
}
render() {
const powergenName = this.state.data.map((powergen, i) => {
const pgBrand = new RegExp(this.state.brandSelected)
console.log(this.state.brandSelected)
if (pgBrand.test(powergen.name)) {
return <div className="row" key={i}><br/>
<Card style={{
width: '250px'
}}>
<CardTitle title={powergen.price} subtitle={powergen.model}/>
<CardTitle title={powergen.name} subtitle={powergen.deal}/>
</Card>
</div>
} else
return false
})
return (
<div>
<Dropdown source={this.brands} onChange={this.handleBrandChange} value={this.state.brandSelected}/>
<div>{powergenName}</div>
</div>
)
}
这是我的 Python 龙卷风钻头:
class PowgenHandler(tornado.web.RequestHandler):
def send_error(self, status_code=500, **kwargs):
"""
Generates the custom HTTP error.And always return 200 code.
"""
reason = None
if 'exc_info' in kwargs:
exception = kwargs['exc_info'][1]
if isinstance(exception, HTTPError) and exception.reason:
reason = exception.reason
try:
msg = reason if reason else httputil.responses[status_code]
except KeyError:
msg = "unkown error"
result = {"status_code":status_code, "reason": msg}
self.clear()
self.set_header("Content-Type", "application/json")
self.set_status(200)
self.write(tornado.escape.json_encode(result))
self.finish()
def set_default_headers(self):
print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", '*')
self.set_header("Access-Control-Allow-Headers", 'Content-Type')
self.set_header('Access-Control-Allow-Methods', 'GET')
self.set_header('Access-Control-Allow-Credentials', 'None')
async def get(self):
output = []
gn = db.generators.find()
for gens in (await gn.to_list(length=1000)):
output.append({'name': gens['name'],
'model': gens['model'],
'price': gens['price'],
'deal': gens['deal'],
'image': gens['image'],
'id': gens['gen_id']})
self.write(json.dumps({'powergen': output}))
self.finish()
它非常简单,所以我不明白为什么它在我的 iPhone 上不起作用。我想我还应该提到我正在为 MongoDB async 使用 Motor,这就是为什么存在 async 和 await 的原因。除此之外,我确实删除了所有样式和反应工具箱的东西,只是为了确保它不会因此而呈现并且它没有任何区别。
我知道可能有很多事情我没有做,但我无法弄清楚那是什么,因为 Google 搜索任何错误只会返回不到 5 个相关结果。任何投入将不胜感激。谢谢!
哦 - 如果您 want/need 查看整个项目,这里有一个 link 到我的 GitHub 回购。再次感谢! Tornado-Pricer
编辑:
这是我在控制台中得到的:
Python Tornado errors
我将此标记为已解决,因为没有任何错误需要解决,因此只需调试导致无法呈现到移动设备的问题的任何原因。
API 结果呈现到桌面但不呈现到我的 iPhone。所以我有一个简单的休息 API 我正在从 ReactJS 前端进行调用。在使用 superagent 遇到很多麻烦后,我正在使用 axios。我在任何浏览器控制台、桌面或移动设备上都没有收到任何错误(一直在使用 jsconsole 调试我的 iphone 5)。然而,在我的 Python Tornado 后端,它在桌面和移动设备上都抛出了一些错误:
第一名:
tornado.application:Uncaught exception GET
第二名:
ERROR:tornado.general:Cannot send error response after headers written ERROR:tornado.general:Failed to flush partial response
第三名:
During handling of the above exception, another exception occurred:
这可以作为我的 Python env 文件中发生的错误发现
TypeError: 'str' object is not callable
none 使 script/app 崩溃...这是我使用 axios 的 ReactJS/Javascript:
componentDidMount() {
console.log('componentDidMount');
const url = 'http://127.0.0.1:3000/api/generator';
axios.get(url).then((response) => {
const results = response.data
console.log(JSON.stringify(results.data))
this.setState({data: results.powergen})
})
}
render() {
const powergenName = this.state.data.map((powergen, i) => {
const pgBrand = new RegExp(this.state.brandSelected)
console.log(this.state.brandSelected)
if (pgBrand.test(powergen.name)) {
return <div className="row" key={i}><br/>
<Card style={{
width: '250px'
}}>
<CardTitle title={powergen.price} subtitle={powergen.model}/>
<CardTitle title={powergen.name} subtitle={powergen.deal}/>
</Card>
</div>
} else
return false
})
return (
<div>
<Dropdown source={this.brands} onChange={this.handleBrandChange} value={this.state.brandSelected}/>
<div>{powergenName}</div>
</div>
)
}
这是我的 Python 龙卷风钻头:
class PowgenHandler(tornado.web.RequestHandler):
def send_error(self, status_code=500, **kwargs):
"""
Generates the custom HTTP error.And always return 200 code.
"""
reason = None
if 'exc_info' in kwargs:
exception = kwargs['exc_info'][1]
if isinstance(exception, HTTPError) and exception.reason:
reason = exception.reason
try:
msg = reason if reason else httputil.responses[status_code]
except KeyError:
msg = "unkown error"
result = {"status_code":status_code, "reason": msg}
self.clear()
self.set_header("Content-Type", "application/json")
self.set_status(200)
self.write(tornado.escape.json_encode(result))
self.finish()
def set_default_headers(self):
print("setting headers!!!")
self.set_header("Access-Control-Allow-Origin", '*')
self.set_header("Access-Control-Allow-Headers", 'Content-Type')
self.set_header('Access-Control-Allow-Methods', 'GET')
self.set_header('Access-Control-Allow-Credentials', 'None')
async def get(self):
output = []
gn = db.generators.find()
for gens in (await gn.to_list(length=1000)):
output.append({'name': gens['name'],
'model': gens['model'],
'price': gens['price'],
'deal': gens['deal'],
'image': gens['image'],
'id': gens['gen_id']})
self.write(json.dumps({'powergen': output}))
self.finish()
它非常简单,所以我不明白为什么它在我的 iPhone 上不起作用。我想我还应该提到我正在为 MongoDB async 使用 Motor,这就是为什么存在 async 和 await 的原因。除此之外,我确实删除了所有样式和反应工具箱的东西,只是为了确保它不会因此而呈现并且它没有任何区别。
我知道可能有很多事情我没有做,但我无法弄清楚那是什么,因为 Google 搜索任何错误只会返回不到 5 个相关结果。任何投入将不胜感激。谢谢!
哦 - 如果您 want/need 查看整个项目,这里有一个 link 到我的 GitHub 回购。再次感谢! Tornado-Pricer
编辑:
这是我在控制台中得到的: Python Tornado errors
我将此标记为已解决,因为没有任何错误需要解决,因此只需调试导致无法呈现到移动设备的问题的任何原因。