flask确认动作

我正在使用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_for()。

回答:

我认为最简单的方法是在客户端进行确认。它在外观上并不漂亮,但是a window.confirm('Are you sure?');会做同样的事情。

也就是说,如果你只是在寻找服务器端解决方案,则可以创建一个@confirmation_required装饰器来处理重定向。然后,你可以包装需要确认的任何视图,并传入一个函数以获取要显示的消息。

from functools import wraps

from urllib import urlencode, quote, unquote

from flask import Flask, request, redirect, url_for, render_template

app = Flask(__name__)

def confirmation_required(desc_fn):

def inner(f):

@wraps(f)

def wrapper(*args, **kwargs):

if request.args.get('confirm') != '1':

desc = desc_fn()

return redirect(url_for('confirm',

desc=desc, action_url=quote(request.url)))

return f(*args, **kwargs)

return wrapper

return inner

@app.route('/confirm')

def confirm():

desc = request.args['desc']

action_url = unquote(request.args['action_url'])

return render_template('_confirm.html', desc=desc, action_url=action_url)

def you_sure():

return "Are you sure?"

@app.route('/')

@confirmation_required(you_sure)

def hello_world():

return 'Hello World!'

if __name__ == '__main__':

app.run(debug=True)

_confirm.html:

<html xmlns="http://www.w3.org/1999/html">

<body>

<h1>{{ desc }}</h1>

<form action="{{ action_url }}" method="GET">

<input type="hidden" name="confirm" value="1">

<input type="submit" value="Yes">

</form>

</body>

</html>

请注意,尽管仅当你要包装的视图接受GET时才执行此重定向,并且对任何修改数据的操作都允许GET并不是一个好主意。(请参阅为什么不应该在HTTP GET请求上修改数据?)

更新:如果你真的想要一个与POST一起使用的通用解决方案,我将切换到基于类的视图并创建一个处理确认逻辑的mixin。就像是:

class ConfirmationViewMixin(object):

confirmation_template = '_confirm.html'

def get_confirmation_context(self):

# implement this in your view class

raise NotImplementedError()

def post(self):

if request.args.get('confirm') == '1':

return super(ConfirmationViewMixin, self).post()

return render_template(

self.confirmation_template, **self.get_confirmation_context())

以上是 flask确认动作 的全部内容, 来源链接: utcz.com/qa/417626.html

回到顶部