所以我有一个 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/