Flask では、 g オブジェクトは「コンテキスト グローバル変数」と呼ばれる特殊なタイプのオブジェクトです。リクエストの存続期間中情報が保存され、リクエスト全体でアクセスして共有できます。
g オブジェクトは、ユーザーのログイン情報を保存するのに役立ちます。たとえば、ユーザーが認証されてログインしている場合、現在のリクエストの他の部分で使用するためにユーザーの ID を g.user に保存できます。これにより、他の関数、メソッド、またはリクエストのビューで、各関数で検証を繰り返すことなく、ユーザーのログイン ステータスに簡単にアクセスして検証できるようになります。
ユーザーのログイン情報を g オブジェクトに保存すると、データベースに繰り返しクエリを実行したり、情報を各関数に渡したりすることなく、リクエストの処理全体を通じて同じユーザー情報が使用されるようになります。これにより、リクエスト スコープのデータにアクセスして共有するための便利な方法が提供され、ユーザーの認証や認可などの機能を簡単に処理できるようになります。
以下は、Flask でオブジェクトを使用してg
ユーザーのログイン情報を保存、アクセス、およびログアウトする方法の例です。
まず、UserModel
MySQL データベースにテーブルがあり、それと対話する SQLAlchemy モデルを作成したと仮定します。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class UserModel(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
password = db.Column(db.String(128), nullable=False)
このコードは、ユーザーの ID、ユーザー名、パスワードなど、Flask アプリケーションのユーザー モデルの基本構造を設定します。SQLAlchemy は、Python クラスと対応するデータベース テーブル間のマッピングを処理し、UserModel クラスを使用してデータベース操作を実行できるようにします。
ユーザーログインとログインステータスの保存
次に、 Flask アプリケーションのg
オブジェクトとフック関数を使用してbefore_request
、ユーザーのログイン情報を保存します。
from flask import Flask, g, session, abort
from flask_login import LoginManager, login_user
from flask_migrate import Migrate
# 初始化 Flask 应用
app = Flask(__name__)
# 初始化
migrate = Migrate(app, db)
db.init_app(app)
@app.before_request
def my_before_request():
user_id = session.get("user_id")
if user_id:
user = UserModel.query.get(user_id)
setattr(g, "user", user)
else:
setattr(g, "user", None)
@app.context_processor
def my_context_processor():
return {
"user": g.user}
最初の関数はデコレータmy_before_request
で@app.before_request
装飾されます。つまり、すべてのリクエストの前に実行されます。この関数の目的は、セッション内の「user_id」キーの存在を確認し、g
そのキーの値に従ってグローバル オブジェクトの「user」属性を設定することです。具体的には、セッションから「user_id」の値を取得し、その値を使用してデータベース内の UserModel テーブルをクエリし、対応するユーザー オブジェクトを取得して、そのオブジェクトを に設定しますg.user
。「user_id」が存在しない場合、または対応するユーザー オブジェクトが見つからない場合は、g.user
None に設定します。
2 番目の関数はデコレータmy_context_processor
で@app.context_processor
装飾されます。これは、テンプレートにグローバル変数を設定するためのコンテキスト ハンドラーとして登録されることを意味します。この関数は、キーが「user」、値が である辞書を返しますg.user
。こうすることで、テンプレートがレンダリングされるときに、テンプレート内で変数を使用してuser
現在のユーザーの情報にアクセスできます。
要約すると、このコードが行うことは、各リクエストの前にセッション内のユーザー ID をチェックし、ユーザー オブジェクトについてデータベースにクエリを実行し、そのユーザー オブジェクトをテンプレートで使用するグローバル変数として設定することです。このようにして、テンプレートをレンダリングするときに、現在のユーザーの情報を簡単に取得できます。
次にログイン実装ルートを書きます
@app.route("/login", methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template("login.html")
else:
username = form.username.data
password = form.password.data
#表单登录验证
user = UserModel.query.filter_by(username=username).first()
if not user:
return redirect(url_for("auth.login"))
if user.password==password:
session['user_id'] = user.id
#添加user_id到session中
return redirect("/")
else:
return render_template('pwd_error.html')
ログアウト
Flask では、セッションからユーザー ID を削除することでユーザーをログアウトできます。単純なログアウト ルートの例を次に示します。
from flask import redirect, url_for
@app.route("/logout")
def logout():
session.clear()
return redirect("/")
このログアウト ルートは、まずセッションから「user_id」を削除します。その後、ルートはホームページにリダイレクトされます。
また、ユーザーがログアウトした後は、ブラウザーの Cookie を変更してuser_id
ログアウトしたユーザーになりすますことができないようにする必要があることにも注意してください。これは通常、セッションの secure 属性を True に設定して、Cookie が HTTPS 接続経由でのみ送信されるようにすることで実現されます。同時に、セッションの httponly 属性を True に設定すると、JavaScript が Cookie にアクセスできなくなり、クロスサイト スクリプティング (XSS) 攻撃を回避できます。