我剛剛閱讀了 Flask 中的背景關系處理器,我了解到它對于在多個模板中重用變數很有用。但是當我將它與 session["user_id"] 一起使用時,它似乎不起作用。可能是因為 session["user_id"] 還不存在,但 Python 已經在讀取它。用戶已經登錄后,如何讓我的 context_processor 作業?
這是我的登錄代碼:
@app.route("/login", methods = ["GET", "POST"])
def login():
session.clear()
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
if not username:
return ("error")
elif not password:
return ("error")
user = db.query(Users).filter_by(username = username).scalar()
if not user or not check_password_hash(user.hash, password):
return "error"
session["user_id"] = user.id
flash("successful Log-in")
return redirect("/")
else:
return render_template("login.html")
這是我的背景關系處理器的代碼:
@app.context_processor
def homepage_items():
if session.get("user_id") is None:
pass
else:
user = db.query(Users).filter_by(id = session["user_id"]).scalar()
return dict(user = user)
uj5u.com熱心網友回復:
正如您正確識別的那樣,問題是當用戶未登錄時會話中的值是空的。在您的實作中,在背景關系處理器中,它然后回傳noneusing pass。但是,應用程式需要一個可迭代的dict型別。
我推薦以下版本,其中用戶物件設定或無,但無論如何都會回傳結果。我還為資料庫使用了不同的查詢變體,因為您的公式由于命令中缺少資料庫會話而導致錯誤。
@app.context_processor
def homepage_items():
user = None
if 'user_id' in session:
# user = db.session.query(User).filter_by(id=session['user_id']).scalar()
user = User.query.get(session['user_id'])
return dict(user=user)
@app.route('/login', methods=['GET', 'POST'])
def login():
session.clear()
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# user = db.session.query(User).filter_by(username=username).scalar()
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.hash, password):
session['user_id'] = user.id
return redirect('/')
return render_template('login.html')
現在可以在模板中以這種方式使用它。
{% if user -%}
<p>{{ user.username }}<p>
{% endif -%}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520054.html
標籤:Python烧瓶会议
上一篇:從多個類函式流式傳輸資料
