我正在使用Flask框架创建一个站点,并实现一个确认页面,用于(主要是管理)操作;即删除用户。
我目前的方法(详细如下)工作,但感觉相当笨拙,似乎是一个简单的任务大量的工作。有没有更好的解决方案?
当前我有一个启动操作的路径:
@admin.route('/user/<int:user_id>/delete', methods=['GET'])
@login_required
@admin_required
def del_user(user_id):
user = User.query.get_or_404(user_id)
desc = "delete"
subject = user.username
action = 'admin.do_del_user'
next = url_for('admin.get_user', user_id=user.id)
return redirect(url_for('main._confirm', desc=desc, subject=subject, action=action, next=next, user_id=user.id))
它将重定向到确认路由:
@main.route('/confirm', methods=['GET', 'POST'])
def _confirm():
form = Confirm()
kwargs = {}
for arg in request.args:
if arg != 'action' or arg != 'desc' or arg != 'subject':
kwargs[arg] = request.args[arg]
action = request.args.get('action')
desc = request.args.get('desc')
subject = request.args.get('subject')
if action is None:
abort(404)
if form.validate_on_submit():
return redirect(url_for(action, confirm=form.confirm.data, **kwargs))
return render_template('_confirm.html', form=form, desc=desc, subject=subject)
然后在验证确认表单后再次重定向以执行实际操作:
@admin.route('/user/<int:user_id>/do_delete', methods=['GET'])
@login_required
@admin_required
def do_del_user(user_id):
confirm = request.args.get('confirm')
next = request.args.get('next')
if confirm:
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
return redirect(next)
我希望这有道理!需要注意的是,desc和subject是为确认模板传递的,kwargs只是为了捕获构建url时所需的url。
我认为最简单的方法是在客户端进行确认。它在视觉上并不漂亮,但是
window.confirm('Are you sure?');
也会做同样的事情。也就是说,如果您只是在寻找服务器端解决方案,那么可以创建一个
@confirmation_required
装饰器来处理重定向。然后,可以用它包装任何需要确认的视图,传入一个函数以获取要显示的消息。_confirm.html:
不过,请注意,仅当包装的视图接受GET时,执行此重定向才有效,并且允许GET执行任何修改数据的操作不是一个好主意。(见Why shouldn't data be modified on an HTTP GET request?)
更新:如果您真的想要一个通用的解决方案来处理POSTs,我将切换到基于类的视图并创建一个处理确认逻辑的mixin。类似于:
(这还没有测试,不知道结果如何。但你知道了。)
相关问题 更多 >
编程相关推荐