You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask应用重定向后保持管理员登录并返回原页面的问题

问题解决步骤

1. 修正路由结构(拆分列表展示与更新操作)

原路由将管理员用户列表展示和单个用户状态更新合并,导致URL逻辑混乱。拆分后职责更清晰:

from flask import Flask, request, redirect, url_for, flash, render_template, session
from bson.objectid import ObjectId

# 管理员专属用户列表页
@app.route("/edit_users/admin", methods=["GET"])
def admin_users_list():
    # 验证当前用户是否为管理员(结合你的登录session逻辑调整)
    if session.get("is_superuser") != "on":
        flash("无访问权限")
        return redirect(url_for("home")) # 替换为你的首页/登录页路由
    
    users = list(mongo.db.users.find())
    return render_template("edit_users.html", users=users)

# 单个用户超级用户状态更新接口
@app.route("/edit_users/update/<user_id>", methods=["POST"])
def update_user_superuser(user_id):
    is_superuser = "on" if request.form.get("is_superuser") else "off"
    mongo.db.users.update_one(
        {"_id": ObjectId(user_id)},
        {"$set": {"is_superuser": is_superuser}}
    )
    flash("用户状态已更新")
    # 重定向回管理员用户列表页
    return redirect(url_for("admin_users_list"))

2. 修复HTML模板中的表单错误

原表单存在两个核心问题:错误使用列表对象users而非单个用户user生成URL,以及指向了错误的路由。修正后:

{% extends "base.html" %}
{% block content %}
<div class="container-fluid">
    <div class="row mb-5">
        <div class="col text-center">
            <h1 class="mb-5">Users List</h1>
            <div class="card w-50 mx-auto border-0 rounded-0">
                <ul class="list-group list-group-flush ">
                    {% for user in users %}
                        <li class="list-group-item d-inline-flex justify-content-between border-3 border-color-1 rounded-0 mb-1">
                            <h4><i class="fa-solid fa-user"></i> {{ user.username|upper}}</h4>
                            <!-- 修正action指向更新路由,使用单个用户的_id -->
                            <form method="POST" action="{{ url_for('update_user_superuser', user_id=user._id) }}">
                                <div class="form-check form-switch">
                                    {% if user.is_superuser == "on" %}
                                        <input class="form-check-input" type="checkbox" role="switch" id="is_superuser_{{ user._id }}" name="is_superuser" checked>
                                    {% else %}
                                        <input class="form-check-input" type="checkbox" role="switch" id="is_superuser_{{ user._id }}" name="is_superuser">
                                    {% endif %}
                                    <label class="form-check-label" for="is_superuser_{{ user._id }}">Superuser</label>
                                    <button type="submit" class="btn btn-primary">Apply</button>
                                </div>
                            </form>
                        </li>
                    {% endfor %}
                </ul>
            </div>
        </div>
    </div>
 </div>
{% endblock %}

注:给checkbox的id添加user._id后缀,避免循环中id重复导致的交互异常

3. 管理员登录状态保持说明

  • 管理员身份验证依赖session(或你使用的登录机制),只要session中的is_superuser状态有效,访问/edit_users/admin就会被允许。
  • 重定向时使用url_for("admin_users_list")直接指向管理员列表页路由,既不会丢失URL中的admin标识,也能确保只有管理员可访问该页面。

原问题根源分析

  1. 路由设计混淆了「管理员列表页」和「单个用户更新页」的逻辑,导致URL中的admin被当作user_id传入,与数据库中ObjectId格式的用户ID冲突。
  2. HTML模板中表单action错误使用列表对象users而非单个用户user,生成的URL无效。
  3. 重定向使用request.referrer或request.url无法保证回到正确的管理员列表页,因为提交表单时的URL是单个用户的更新地址。

内容的提问来源于stack exchange,提问作者Abby Humphreys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:03:21