Python 我如何在烧瓶中正确填写申请路线?
使用Flask和SQLAlchemy,我有两个模型:Python 我如何在烧瓶中正确填写申请路线?,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,使用Flask和SQLAlchemy,我有两个模型: Todo列表-Todo的父级 Todo-ToDoList的子级 我已经创建了一个控制器,从ToDoList获取复选框输入,该复选框还更新其Todo子记录。当我查询数据库时,它工作得很好 我遇到的问题是,当我单击Todolist复选框时,我希望视图立即更新todo列表及其关联的todo,它们彼此并排显示。这不会发生。它只在我点击“重新加载”时更新 这是我的控制器代码: @app.route('/lists/<list_id>/set
Todo列表
-Todo的父级
Todo
-ToDoList的子级
我已经创建了一个控制器,从ToDoList
获取复选框输入,该复选框还更新其Todo
子记录。当我查询数据库时,它工作得很好
我遇到的问题是,当我单击Todolist
复选框时,我希望视图立即更新todo列表及其关联的todo,它们彼此并排显示。这不会发生。它只在我点击“重新加载”时更新
这是我的控制器代码:
@app.route('/lists/<list_id>/set-completed', methods=['POST'])
def set_completed_list(list_id):
try:
completed = request.get_json()['completed']
todo_list = ToDoList.query.get(list_id)
todo_list.completed = completed
db.session.query(Todo).filter_by(list_id=list_id).update({"completed": completed}, synchronize_session='fetch')
db.session.commit()
except:
db.session.rollback()
finally:
db.session.close()
return redirect(url_for('get_list_todos', list_id=list_id))
@app.route('/lists/<list_id>')
def get_list_todos(list_id):
return render_template('index.html', active_list=ToDoList.query.get(list_id), lists=ToDoList.query.all(), todos=Todo.query.filter_by(list_id=list_id).order_by('id').all())
我还在学习。有人能看到我遗漏的任何明显错误吗?关于Ajax,我还有很多东西要学。我不明白控制器和视图如何在Ajax调用上交互。我假设控制器可以将浏览器指向它需要去的地方,但我真正需要做的是让浏览器知道操作已经成功,使用响应,然后让Javascript在视图端重新加载页面: 控制器:
@app.route('/lists/<list_id>/set-completed', methods=['POST'])
def set_completed_list(list_id):
error = False
try:
completed = request.get_json()['completed']
todo_list = ToDoList.query.get(list_id)
todo_list.completed = completed
db.session.query(Todo).filter_by(list_id=list_id).update({"completed": completed}, synchronize_session='fetch')
db.session.commit()
except:
db.session.rollback()
error = True
finally:
db.session.close()
if error:
abort(500)
else:
return jsonify({'success': True})
@app.route('/lists//set completed',methods=['POST'])
def设置完成列表(列表id):
错误=错误
尝试:
completed=request.get_json()['completed']
todo\U list=ToDoList.query.get(列表id)
todo_list.completed=已完成
db.session.query(Todo).filter_by(list_id=list_id).update({“completed”:completed},synchronize_session='fetch')
db.session.commit()
除:
db.session.rollback()
错误=真
最后:
db.session.close()
如果出现错误:
中止(500)
其他:
返回jsonify({'success':True})
客户端Javascript:
const list_checkboxes = document.querySelectorAll('.list-check-completed');
for (let i = 0; i < list_checkboxes.length; i++) {
const list_checkbox = list_checkboxes[i];
list_checkbox.onchange = function (e) {
console.log('event', e);
const list_newCompleted = e.target.checked;
const listId = e.target.dataset['id'];
fetch('/lists/' + listId + '/set-completed', {
method: 'POST',
body: JSON.stringify({
'completed': list_newCompleted,
}),
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(jsonResponse => {
console.log('response', jsonResponse);
window.location.reload(true);
document.getElementById('error').className = 'hidden';
})
.catch(function () {
document.getElementById('error').className = '';
})
}
}
const list_checkbox=document.querySelectorAll(“.list check completed”);
for(设i=0;iresponse.json())
。然后(jsonResponse=>{
log('response',jsonResponse);
window.location.reload(true);
document.getElementById('error')。className='hidden';
})
.catch(函数(){
document.getElementById('error')。className='';
})
}
}
窗口.location.reload(true)
负责重新加载。我不认为这是由于您的路径中的代码中存在错误造成的。在我看来,您在理解ajax请求的行为时遇到了问题。如何在请求中使用服务器的答案?重定向函数默认发送http状态代码302(已找到)和包含url的位置标头。在常规调用的情况下,浏览器现在将独立调用指定的地址。对于ajax请求,您必须自己处理。谢谢@Detlef。正如您所说,我误解了视图和控制器如何与Ajax调用交互。我将回答这个问题,以便其他noob可以看到结果。再次感谢您的澄清。
const list_checkboxes = document.querySelectorAll('.list-check-completed');
for (let i = 0; i < list_checkboxes.length; i++) {
const list_checkbox = list_checkboxes[i];
list_checkbox.onchange = function (e) {
console.log('event', e);
const list_newCompleted = e.target.checked;
const listId = e.target.dataset['id'];
fetch('/lists/' + listId + '/set-completed', {
method: 'POST',
body: JSON.stringify({
'completed': list_newCompleted,
}),
headers: {
'Content-Type': 'application/json',
}
})
.then(response => response.json())
.then(jsonResponse => {
console.log('response', jsonResponse);
window.location.reload(true);
document.getElementById('error').className = 'hidden';
})
.catch(function () {
document.getElementById('error').className = '';
})
}
}