javascript - 如果未登录 Flask,则防止用户直接访问 url 并重定向到登录

标签 javascript python flask

所以我有一个 flask 应用程序,在主页中我正在渲染一个登录页面来登录。登录后他们会得到一个表格来填写。当他们稍后在表单提交过程中登录时,我也在使用用户名值。
这是我的相关 flask 代码:

@app.route('/', methods=['GET', 'POST'])
def home():
    return render_template('Login_new.html')
    
@app.route('/login', methods=['POST'])
def logger():
    if request.method == 'POST':
        global user
        user = request.form['username']
        passwrd = request.form['password']

        if (user=="admin") and (passwrd=="VendorAdmin2021"):
            return redirect(url_for("admin.index"))
        
        url = "api for authentication"
        response = requests.post(url, json={"username": user,"password": passwrd}, verify=False)
        #data = response.json()
        print(response.status_code)
        
        if response.status_code == 200:
            return redirect(url_for("test"))
        else:
            flash('Wrong')
            return render_template('Login_new.html')
测试 url 包含实际的表单。这是 Login_new.html 文件:
<html>

<head>
  <link rel="stylesheet" href="/static/style2.css">
  
  <title>Sign in</title>
</head>

<body>
  <div class="main">
    <p class="sign" align="center">Novartis</p>
    <form class="form1" action="/login" method="POST" id="myForm">
      <input class="un " type="text" align="center" placeholder="5-2-1 id" name="username">
      <input class="pass" type="password" align="center" placeholder="Password" name="password">
      <input type="submit" value="Log in" class="submit">
         
                
    </div>

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10.12.5/dist/sweetalert2.all.min.js"></script>

{% with messages = get_flashed_messages() %}
    {% if messages %}
    <script>
      var messages = {{ messages | safe }};
      if (messages=="Wrong"){
          swal.fire({
            title:"Invalid id or password!",
            text:"Please make sure you are connected to the Company Intranet",
            icon:"error",
            closeOnConfirm: false
            });
      }
    </script>
  {% endif %}
{% endwith %}

</body>

</html>
如果用户按照设定的程序一切正常,但如果他们直接在浏览器中输入测试 url,他们会绕过登录表单,随后我也无法记录他们的用户名。
同样对于 flask-admin url,如果他们输入管理员凭据,他们将被重定向到管理员 url,但如果他们直接输入管理员 url,他们可以在没有任何凭据的情况下访问它。
我怎样才能防止这种情况?
编辑:
我尝试使用 session 来达到预期的结果,我尝试遵循 https://techmonger.github.io/10/flask-simple-authentication/ .这是我现在的代码:
if response.status_code == 200:
            session["logged_in"] = True
            return redirect(url_for("test"))
        else:
            flash('Wrong')
            return render_template('Login_new.html')
在测试网址中:
@app.route('/test')
def test():
    if not session.get('logged_in'):
        return render_template('Login_new.html')
    form = vendorForm()
现在我收到 session 没有属性获取的错误。
请帮忙,我一直坚持这个太久了

最佳答案

您可以像在 flask 登录模块中一样使用自己的自定义装饰器。
类似的东西,

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get('username') is None or session.get('if_logged') is None:
            return redirect('/login',code=302)
        return f(*args, **kwargs)
    return decorated_function
然后在需要登录的路由中像这样使用,
@app.route('/', methods=['GET', 'POST'])
@login_required
def home():
   #blah_blah
它的作用是,每当您调用 url '/' 时,它都会调用 login_required() 包装器中的 decorated_function() 。所以把你的登录逻辑放在deccorated_function()中。检查用户是否使用 session cookie(或您想要的任何方法)登录,如果未登录,则重定向到登录,否则不返回任何内容。
关于那个 session.get() 错误,您是否从模块 flask 中导入了 session ?语法似乎正确

关于javascript - 如果未登录 Flask,则防止用户直接访问 url 并重定向到登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65434221/

相关文章:

python - django.db.utils.DataError : numeric field overflow - django 错误

flask - 使用Flask-RESTful检索查询参数

javascript - 单击 Accordion 时,可并排打开的 Accordion 都会展开,如何仅打开单击的 Accordion ?

javascript - Jquery.validate - 一页 - 多个表单

Python 从输出变量中搜索字符串并打印接下来的两行

python - 将 Flask 中上传的文件直接传递给 scikit-image

python - Flask 中的 render() 和 render_template() 有什么区别?

javascript - preg_match 的 JavaScript 等价物是什么?

javascript - 表单验证错误(javascript)

python - python ThreadPoolExecutor 线程安全吗?