Flask、gunicorn、redis - 第三个路由返回500,但之前的POST正常
我正在尝试在本地设置一个 web-dedupe 的副本,想用默认的设置来运行,但在第三步之后就是不行。我可以上传CSV文件,但在选择字段并点击提交按钮后,出现了一个错误:
服务器遇到了内部错误,无法完成你的请求。可能是服务器负载过重,或者应用程序有错误。
下面是处理这个路由的 app.py 代码。日志也在下面贴出。任何帮助都非常感谢!这是他们的 工作演示。如果需要更多信息,请告诉我!
@app.route('/select_fields/', methods=['GET', 'POST'])
def select_fields():
status_code = 200
error = None
print flask_session.keys()
if not flask_session.get('deduper'):
return redirect(url_for('index'))
else:
inp = flask_session['deduper']['csv'].converted
filename = flask_session['filename']
flask_session['last_interaction'] = datetime.now()
reader = csv.reader(StringIO(inp))
fields = reader.next()
del reader
if request.method == 'POST':
field_list = [r for r in request.form]
if field_list:
training = True
field_defs = {}
for field in field_list:
field_defs[field] = {'type': 'String'}
data_d = readData(inp)
flask_session['deduper']['data_d'] = data_d
flask_session['deduper']['field_defs'] = copy.deepcopy(field_defs)
start = time.time()
deduper = dedupe.Dedupe(field_defs)
deduper.sample(data_d, 150000)
flask_session['deduper']['deduper'] = deduper
end = time.time()
send_ga_log(
'Dedupe initialization',
flask_session['ga_cid'],
label='Timing in seconds',
value=int(end-start)
)
return redirect(url_for('training_run'))
else:
error = 'You must select at least one field to compare on.'
send_ga_log('Select Fields Error', flask_session['ga_cid'], label=error)
status_code = 500
return render_app_template('select_fields.html', error=error, fields=fields, filename=filename)
@app.route('/training_run/')
def training_run():
if not flask_session.get('deduper'):
return redirect(url_for('index'))
else:
filename = flask_session['filename']
return render_app_template('training_run.html', filename=filename)
应用错误输出:
Traceback (most recent call last):
File "/home/jbutler/fuck2/dedupe-web-master/run_queue.py", line 4, in <module>
queue_daemon(app)
File "/home/jbutler/fuck2/dedupe-web-master/queue.py", line 43, in queue_daemon
msg = redis.blpop(app.config['REDIS_QUEUE_KEY'])
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/redis/client.py", line 1146, in blpop
return self.execute_command('BLPOP', *keys)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/redis/client.py", line 570, in execute_command
connection.send_command(*args)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/redis/connection.py", line 556, in send_command
self.send_packed_command(self.pack_command(*args))
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/redis/connection.py", line 532, in send_packed_command
self.connect()
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/redis/connection.py", line 436, in connect
raise ConnectionError(self._error_message(e))
redis.exceptions.ConnectionError: Error 111 connecting to localhost:6379. Connection refused.
gunicorn 错误日志:
ERROR:app:Exception on /select_fields/ [POST]
Traceback (most recent call last):
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/jbutler/fuck2/dedupe-web-master/app.py", line 154, in select_fields
deduper = dedupe.Dedupe(field_defs)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/api.py", line 176, in __init__
super(DedupeMatching, self).__init__(*args, **kwargs)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/api.py", line 591, in __init__
self.data_model = DataModel(variable_definition)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/datamodel.py", line 29, in __init__
field_model = typifyFields(fields)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/datamodel.py", line 91, in typifyFields
raise TypeError("Incorrect field specification: field "
TypeError: Incorrect field specification: field specifications are dictionaries that must include a type definition, ex. {'field' : 'Phone', type: 'String'}
ERROR:app:Exception on /select_fields/ [POST]
Traceback (most recent call last):
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/jbutler/fuck2/dedupe-web-master/app.py", line 154, in select_fields
deduper = dedupe.Dedupe(field_defs)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/api.py", line 176, in __init__
super(DedupeMatching, self).__init__(*args, **kwargs)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/api.py", line 591, in __init__
self.data_model = DataModel(variable_definition)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/datamodel.py", line 29, in __init__
field_model = typifyFields(fields)
File "/home/jbutler/fuck2/dedupe-web-master/deploy_scripts/build/venv/local/lib/python2.7/site-packages/dedupe/datamodel.py", line 91, in typifyFields
raise TypeError("Incorrect field specification: field "
TypeError: Incorrect field specification: field specifications are dictionaries that must include a type definition, ex. {'field' : 'Phone', type: 'String'}
1 个回答
2
我是负责整理这段代码的人,我想我明白发生了什么。上一次我修改这段代码是在0.5和0.6版本之间,这意味着只有一些API的变化被包含进来了。我上周(27号)提交了一个更新,应该能解决这个问题。
有几点需要注意:
1) 你从“run_queue”进程得到的错误追踪信息其实很重要,这意味着不管是什么原因,这个进程无法连接到Redis。我知道你可以通过命令行连接到Redis(根据上面的评论),但出于某种原因,这个应用似乎无法连接。从Python的命令行界面试试这个:
>>> from redis import Redis
>>> r = Redis()
这应该会尝试连接到默认的Redis端口和主机(localhost,6379)。
2) 由于你是在本地运行这个程序,你可能不想受到我们为上传电子表格设置的10,000行的限制。坦白说,这是我们为在dedupe.datamade.us上部署的版本设置的一个相当随意的限制。如果你想去掉这个限制,可以注释掉这些代码行:https://github.com/datamade/dedupe-web/blob/master/dedupe_utils.py#L57-L60
如果在拉取新提交后你仍然遇到问题,请告诉我。