Extending Quart-Auth#
Quart-Auth is meant to be extended, much like Quart (and Flask), a good example of this is loading user data from a database,
from quart import Quart
from quart_auth import AuthUser, QuartAuth, current_user, login_required
class User(AuthUser):
def __init__(self, auth_id):
super().__init__(auth_id)
self._resolved = False
self._email = None
async def _resolve(self):
if not self._resolved:
self._email = await db.fetch_email(self.auth_id)
self._resolved = True
@property
async def email(self):
await self._resolve()
return self._email
auth_manager = QuartAuth()
auth_manager.user_class = User
app = Quart(__name__)
@app.route("/")
@login_required
async def index():
return await current_user.email
auth_manager.init_app(app)
If you are used to Flask-Login you are likely expecting the current_user to be fully loaded without the extra resolve step, you can write something like:
from quart import Quart
from quart_auth import AuthUser, QuartAuth, current_user, login_required
class User(AuthUser):
def __init__(self, auth_id):
super().__init__(auth_id)
self.email = None
self.name = None
async def load_user_data(self):
user_data = await db.fetch_user_data(self.auth_id)
self.email = user_data.get("email", None)
self.name = user_data.get("name", None)
auth_manager = QuartAuth()
auth_manager.user_class = User
app = Quart(__name__)
@app.route("/")
@login_required
async def index():
return current_user.email
auth_manager.init_app(app)
@app.before_request
@app.before_websocket
async def load_full_user_data():
await current_user.load_user_data()