问题陈述在Flask中,除非先访问另一条路由,否则我该如何防止路由被访问?
我正在研究一个Flask web应用程序,该应用程序显示表中的项目列表。用户可以选择一行并按下Delete
按钮来删除该项目。但是,在从数据库中删除项目之前,用户首先会路由到确认屏幕,其中显示一些项目详细信息以及Confirm
按钮。确认页面的网址遵循以下模式:dashboard/confirm-delete/<id>
以及实际删除页面的网址遵循以下模式:dashboard/delete/<id>
。请参阅下面的admin/views.py
了解更多详情。
在系统正常工作时,我遇到的问题是用户可以通过在地址栏中输入dashboard/delete/<id>
(其中<id>
被替换为实际项目ID)来简单地跳过确认页面。
质询
有没有办法来防止用户访问dashboard/delete/<id>
除非他们首先去dashboard/confirm-delete/<id>
(确认屏幕)?或者,我的方法错了,是否有更好的方法?
当前代码:
功能在我dashboard.html
页面时选择了行和删除按钮被按下称为:
$('#remove').click(function() {
var id = getId();
window.location.href="/dashboard/confirm-delete" + $.trim(id);
});
确认按钮confirm-delete.html
(删除确认页):
<a class="btn btn-default" href="{{ url_for('admin.delete_item', id=item.id) }}" role="button">Confirm Delete</a>
我的admins/views.py
:
@admin_blueprint.route('dashboard/confirm-delete/<id>')
@login_required
@groups_required(['admin'})
def confirm_delete_item(id)
item = Item.query.get_or_404(id)
return render_template('admin/confirm-delete.html', item=item, title="Delete Item")
@admin_blueprint.route('dashboard/delete/<id>', methods=['GET', 'POST'])
@login_required
@groups_required(['admin'})
def delete_item(id)
item = Item.query.get_or_404(id)
db.session.delete(item)
db.commit()
return redirect(url_for('home.homepage'))
SOLUTION
基于标记的答案,因为接受我解决了这个问题,如下所示:
首先,我创建了一个新的形式,以处理confirm-delete.html
页Submit
按钮:
admin/forms.py
:
from flask_wtf import FlaskForm
from wtforms import SubmitField
class DeleteForm(FlaskForm):
submit = SubmitField('Confirm')
我取代Confirm Button
代码与下列到confirm-delete.html
:
<form method="post">
{{ form.csrf_token }}
{{ form.submit }}
</form>
最后,我合并两者的功能app/views.py
如下:
@admin_blueprint.route('dashboard/confirm-delete/<id>', methods=['GET', 'POST'])
@login_required
@groups_required(['admin'})
def confirm_delete_item(id)
form = DeleteForm()
item = Item.query.get_or_404(id)
if form.validate_on_submit():
if form.submit.data:
db.session.delete(item)
db.commit()
return redirect(url_for('home.homepage'))
return render_template('admin/confirm-delete.html', item=item, form=form, title="Delete Item")
通过这种方式,用户不能旁路通过在地址栏中输入特定链接来删除确认屏幕,并且可以简化代码。
我想到的,我会在页面上设置一个cookie的第一件事,其中删除按钮,然后在确认页面上检查该cookie。 – coralvanda