如何使用会话显示flash消息



我是flask框架的新手,并试图构建一个web应用程序。目前,我试图通过使用吐司通知选项显示一个实时吐司通知。我试了很多方法,但还是不行。有办法解决这个问题吗?

base.html中的toast notifications选项

<script>
//Toast notifications
if(Session.has('message')){
toastr.options = {
"closeButton": true,
"progressBar": true,
"positionClass": "toast-bottom-right",
"fadeIn": 300,
"fadeOut": 1000,
"timeOut": 5000,
}
//toastr.success("{{ session('message') }}");
}
</script>

app.py中的会话. 当用户注册成功时,它会将用户重定向到登录页面,并向用户显示toast通知消息。

@app.route('/register',methods=['GET','POST'])
def register():
form = UserForm(request.form)
if request.method == 'POST' and form.validate():
hashed_pw = generate_password_hash(form.password.data,"sha256")
with sql.connect("database.db") as conn:
cur = conn.cursor()
cur.execute("INSERT INTO User (first_name, last_name, email, password, type) VALUES (?,?,?,?,'customer')",(form.first_name.data, form.last_name.data, form.email.data, hashed_pw))
conn.commit()
session ['name'] = form.first_name.data + form.last_name.data
flash("{session['name']} has been registered successfully") 
return redirect(url_for('login'))
return render_template('register.html', form = form)

这是我在做toast通知时经常遇到的问题

127.0.0.1 - - [23/Nov/2022 03:50:17] "GET / HTTP/1.1" 200 -
[2022-11-23 03:50:19,220] ERROR in app: Exception on /register [GET]
Traceback (most recent call last):
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflaskapp.py", line 2525, in 
wsgi_app
response = self.full_dispatch_request()
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflaskapp.py", line 1822, in 
full_dispatch_request
rv = self.handle_user_exception(e)
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflaskapp.py", line 1820, in 
full_dispatch_request
rv = self.dispatch_request()
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflaskapp.py", line 1796, in 
dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "C:UsersuserDesktopPhoneBuddyapp.py", line 55, in register
return render_template('register.html', form = form)
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflasktemplating.py", line 147, 
in render_template
return _render(app, template, context)
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesflasktemplating.py", line 130, 
in _render
rv = template.render(context)
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesjinja2environment.py", line 
1301, in render
self.environment.handle_exception()
File "C:Usersuserdesktopphonebuddy.venvlibsite-packagesjinja2environment.py", line 
936, in handle_exception
raise rewrite_traceback_stack(source=source)
File "C:UsersuserDesktopPhoneBuddytemplatesregister.html", line 1, in top-level template 
code
{% extends 'base.html' %}
File "C:UsersuserDesktopPhoneBuddytemplatesbase.html", line 82, in top-level template 
code
<!--toastr.success("{{ session('message') }}");-->
TypeError: 'SecureCookieSession' object is not callable
127.0.0.1 - - [23/Nov/2022 03:50:19] "GET /register HTTP/1.1" 500 -

错误消息与您在模板调用中使用的错误括号有关。使用会话就像查询字典一样。因此,请使用session[key]session.get(key),其中第二个选项允许您指定默认值。

下面是一个使用toastr在flask中闪烁消息的小示例。

from flask import ( 
Flask, 
render_template, 
request, 
flash
)
app = Flask(__name__)
app.secret_key = 'your secret here'
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
msg = request.form.get('msg')
msg_type = request.form.get('msg-type', 'success')
if msg:
flash(msg, msg_type)
return render_template('index.html')
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Index</title>
<link 
rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css" 
integrity="sha512-3pIirOrwegjM6erE5gPSwkUzO+3cTjpnV9lexlNZqvupR64iZBnOOTiiLPb9M36zpMScbmUNIcHUqKD47M719g==" 
crossorigin="anonymous" 
referrerpolicy="no-referrer" />
</head>
<body>
<form method="post" style="display:grid; grid-gap: 0.6rem;">
<label for="msg">Message</label>        
<textarea name="msg" id="msg">This is a toastr notification.</textarea>
<label for="msg-type">Toast Type</label>
<select name="msg-type" id="msg-type">
<option value="info">Info</option>
<option value="success">Success</option>
<option value="warning">Warning</option>
<option value="error">Error</option>
</select>
<input type="submit" />
</form>
<script 
src="https://code.jquery.com/jquery-3.6.1.min.js" 
integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" 
crossorigin="anonymous"></script>
<script 
src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js" 
integrity="sha512-VEd+nq25CkR676O+pLBnDW09R7VQX9Mdiij052gVCp5yVH3jGtH70Ho/UUv4mJDsEdTvqRCFZg0NKGiojGnUCw==" 
crossorigin="anonymous" 
referrerpolicy="no-referrer"></script>
<script type="text/javascript">
(function() {
toastr.options = {
"closeButton": true,
"progressBar": true,
"positionClass": "toast-bottom-right",
"fadeIn": 300,
"fadeOut": 1000,
"timeOut": 5000,
}
const msgs = {{ get_flashed_messages(with_categories=true) | tojson }};
for (const [cat, msg] of msgs) {
toastr[cat](msg);
}
})()
</script>
</body>
</html>

最新更新