Flask-Loginモジュールを使用してアクセス制御を行うことができます。 これは、Flaskのユーザーセッション管理(ログイン、ログアウト、およびセッションの記憶)を提供します。
このモジュールは、ユーザーIDを保存し、ログインしたユーザーにビューを制限し、Cookieを保護し、他の多くの機能を備えています。
関連コース: Python Flask:Flaskを使用してWebアプリを作成する
モジュールのインストール
私たちが使用するFlask-loginモジュールはです。
したがって、pipインストールを使用して直接インストールします。
1
|
pip install Flask-Login==0.3.2
|
フラスコ-ログイン
Flask-Loginは、前の記事のFlask-MongoEngineを使用します。 したがって、最初にサーバーとバインドする必要があります。
1 2 3
|
from flask.ext.login import LoginManager login_manager = LoginManager() login_manager.init_app(app)
|
これにより、Flask-Loginがサーバーにバインドされます。 ただし、これは効果がないようです。
まず、ランディングのURLは何ですか?
これにはFlask-LoginにデフォルトのログインURLがないため、以下を指定する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
from flask.ext.login import login_user login_manager.login_view = 'login'
@app.route('/login', methods=['POST']) def login(): info = json.loads(request.data) username = info.get('username', 'guest') password = info.get('password', '') user = User.objects(name=username, password=password).first() if user: login_user(user) return jsonify(user.to_json()) else: return jsonify({"status": 401, "reason": "Username or Password Error"})
|
実際には2つのことがあります。
- login_viewのコードロジックが記述されています
'login'
、
- 定義する
login_view
:私たちが扱っている踊り場のURLをFlaskに伝えてください
1
|
login_manager.login_view = 'login'
|
ここでは、login_view’login ‘を定義します。
Flaskは、ログインに基づいてログインロジックの場所をどのように見つけましたか?
私たちはそれを定義しました:
この関数は、ログインロジックコードを処理する場所です。
では、ユーザーログインのコードは何ですか? それはこれです:
このステートメントは、ログインする現在のユーザーのステータスを設定します。ここでは詳細な説明はありません。関数が呼び出されたとき、ユーザーの状態がログイン状態であることを知っておく必要があります。
関連コース: Python Flask:Flaskを使用してWebアプリを作成する
ユーザーモデル
さて、問題は、次にリクエストがあったときに、ユーザーが着陸したかどうかをどのように知るか、どのユーザーがそれであるかをどのように知るかということです。
現時点では、モデルが十分に完全ではないことがわかり、モデルを改善する必要があります。次のように改善する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
class User(db.Document): name = db.StringField() password = db.StringField() email = db.StringField() def to_json(self): return {"name": self.name, "email": self.email}
def is_authenticated(self): return True
def is_active(self): return True
def is_anonymous(self): return False
def get_id(self): return str(self.id)
|
ここには、次の2つの追加アプローチがあることがわかります。
-
is_authenticated: ログオン時に操作できるため、現在のユーザーが承認されているため、デフォルトは承認済みです
-
is_anonymous: 現在のユーザーが匿名である場合、匿名であってはならないことは明らかです
-
アクティブです: 現在のユーザーがアクティブ化されているかどうかを判断するために、アクティブ化されたユーザーはにログオンできます
-
get_id: IDを返します。 ただし、現在のログインユーザーが誰であるかはまだわからないため、Flask-LoginにIDを介してユーザーのメソッドを取得する方法も指示する必要があります。
1 2 3
|
@login_manager.user_loader def load_user(user_id): return User.objects(id=user_id).first()
|
user_loaderを指定することで、現在のログインユーザーを照会することができます。このようにして、ユーザーがログインできるかどうかを判断します。
ランディングページの権利を管理する必要があります。 ログインに使用するために、REST APIを増やし、削除し、変更するように設定しました。 クエリのAPIのみを簡単に表示できます。
ランディングURLを制御する方法は簡単で、デコレータを1つ追加します。 @ログインが必要です。 そう:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
from flask.ext.login import login_required @app.route("https://pythonbasics.org/", methods=['PUT']) @login_required def create_record(): ...... @app.route("https://pythonbasics.org/", methods=['POST']) @login_required def update_record(): ...... @app.route("https://pythonbasics.org/", methods=['DELETE']) @login_required def delte_record(): ......
|
これにより、HTTP操作の増加、変更、および削除がユーザー対応に制限されます。
ログイン後、ユーザーはログアウトできるようになります。 コードは次のとおりです。
1 2 3 4 5 6
|
from flask.ext.login import logout_user @app.route('/logout', methods=['POST']) def logout(): logout_user() return jsonify(**{'result': 200, 'data': {'message': 'logout success'}})
|
ここで logout_user()
メソッドはから呼び出されました logout()
。
最初に、ユーザーがログインしているかどうかを確認する必要があります。
1 2 3 4 5 6 7 8 9 10
|
from flask.ext.login import current_user @app.route('/user_info', methods=['POST']) def user_info(): if current_user.is_authenticated: resp = {"result": 200, "data": current_user.to_json()} else: resp = {"result": 401, "data": {"message": "user no login"}} return jsonify(**resp)
|
ログオンすると、current_userがUserのオブジェクトになり、to_jsonメソッドは現在のログインユーザーのユーザー情報を返すことができるため、ユーザー情報を取得するためのAPIを記述できます。
例
この章の完全なコードは次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
import json from flask import Flask, request, jsonify from flask.ext.login import (current_user, LoginManager, login_user, logout_user, login_required) from flask_mongoengine import MongoEngine app = Flask(__name__) app.config['MONGODB_SETTINGS'] = { 'db': 'your_database', 'host': 'localhost', 'port': 27017 } app.secret_key = 'some key' db = MongoEngine() login_manager = LoginManager() db.init_app(app) login_manager.init_app(app) login_manager.login_view = 'login' @login_manager.user_loader def load_user(user_id): return User.objects(id=user_id).first() @app.route('/login', methods=['POST']) def login(): info = json.loads(request.data) username = info.get('username', 'guest') password = info.get('password', '') user = User.objects(name=username, password=password).first() if user: login_user(user) return jsonify(user.to_json()) else: return jsonify({"status": 401, "reason": "Username or Password Error"}) @app.route('/logout', methods=['POST']) def logout(): logout_user() return jsonify(**{'result': 200, 'data': {'message': 'logout success'}}) @app.route('/user_info', methods=['POST']) def user_info(): if current_user.is_authenticated: resp = {"result": 200, "data": current_user.to_json()} else: resp = {"result": 401, "data": {"message": "user no login"}} return jsonify(**resp) class User(db.Document): name = db.StringField() password = db.StringField() email = db.StringField() def to_json(self): return {"name": self.name, "email": self.email} def is_authenticated(self): return True def is_active(self): return True def is_anonymous(self): return False def get_id(self): return str(self.id) @app.route("https://pythonbasics.org/", methods=['GET']) def query_records(): name = request.args.get('name') user = User.objects(name=name).first() if not user: return jsonify({'error': 'data not found'}) else: return jsonify(user.to_json()) @app.route("https://pythonbasics.org/", methods=['PUT']) @login_required def create_record(): record = json.loads(request.data) user = User(name=record['name'], password=record['password'], email=record['email']) user.save() return jsonify(user.to_json()) @app.route("https://pythonbasics.org/", methods=['POST']) @login_required def update_record(): record = json.loads(request.data) user = User.objects(name=record['name']).first() if not user: return jsonify({'error': 'data not found'}) else: user.update(email=record['email'], password=record['password']) return jsonify(user.to_json()) @app.route("https://pythonbasics.org/", methods=['DELETE']) @login_required def delte_record(): record = json.loads(request.data) user = User.objects(name=record['name']).first() if not user: return jsonify({'error': 'data not found'}) else: user.delete() return jsonify(user.to_json()) if __name__ == "__main__": app.run(port=8080, debug=True)
|
関連コース: Python Flask:Flaskを使用してWebアプリを作成する