Cache discord User object to flask session

This commit is contained in:
thecosmos
2019-05-20 23:49:13 +05:30
parent 18030f5c0e
commit 71404b1d93
2 changed files with 42 additions and 5 deletions

View File

@@ -24,6 +24,8 @@ class DiscordOAuth2HttpClient(abc.ABC):
""" """
SESSION_KEYS = [ SESSION_KEYS = [
"discord_user",
"discord_oauth2_state", "discord_oauth2_state",
"discord_oauth2_token", "discord_oauth2_token",
] ]

View File

@@ -42,12 +42,19 @@ class DiscordOAuth2Session(_http.DiscordOAuth2HttpClient):
session["discord_oauth2_state"] = state session["discord_oauth2_state"] = state
return redirect(authorization_url) return redirect(authorization_url)
def callback(self): def callback(self, fetch_user: bool = True):
"""A method which should be always called after completing authorization code grant process """A method which should be always called after completing authorization code grant process
usually in callback view. usually in callback view.
It fetches the authorization token and saves it flask It fetches the authorization token and saves it flask
`session <http://flask.pocoo.org/docs/1.0/api/#flask.session>`_ object. `session <http://flask.pocoo.org/docs/1.0/api/#flask.session>`_ object.
Parameters
----------
fetch_user : bool, optional
If this parameter is set to True, it caches :py:class:`flask_discord.models.User` to flask
`session <http://flask.pocoo.org/docs/1.0/api/#flask.session>`_ object with ``discord_user`` key
and ``None`` if False.
""" """
if request.values.get("error"): if request.values.get("error"):
return request.values["error"] return request.values["error"]
@@ -58,6 +65,10 @@ class DiscordOAuth2Session(_http.DiscordOAuth2HttpClient):
authorization_response=request.url authorization_response=request.url
) )
session["discord_oauth2_token"] = token session["discord_oauth2_token"] = token
if fetch_user:
session["discord_user"] = self.fetch_user()
else:
session["discord_user"] = None
def revoke(self): def revoke(self):
"""This method clears current discord token, state and all session data from flask """This method clears current discord token, state and all session data from flask
@@ -73,12 +84,36 @@ class DiscordOAuth2Session(_http.DiscordOAuth2HttpClient):
"""A boolean indicating whether current session has authorization token or not.""" """A boolean indicating whether current session has authorization token or not."""
return self._make_session().authorized return self._make_session().authorized
def fetch_user(self): def fetch_user(self) -> models.User:
return models.User(self.get("/users/@me")) """This method requests user data from discord, caches native :py:class:`flask_discord.models.User`
to flask `session <http://flask.pocoo.org/docs/1.0/api/#flask.session>`_ object.
def fetch_connections(self): Returns
-------
flask_discord.models.User
"""
session["discord_user"] = models.User(self.get("/users/@me"))
return session["discord_user"]
def fetch_connections(self) -> models.UserConnection:
"""Requests and returns connections of current user from discord.
Returns
-------
flask_discord.models.UserConnection
"""
return models.UserConnection(self.get("/users/@me/connections")) return models.UserConnection(self.get("/users/@me/connections"))
def fetch_guilds(self): def fetch_guilds(self) -> list:
"""Requests and returns guilds of current user from discord.
Returns
-------
list
List of :py:class:`flask_discord.models.Guild` objects.
"""
guilds_payload = self.get("/users/@me/guilds") guilds_payload = self.get("/users/@me/guilds")
return [models.Guild(payload) for payload in guilds_payload] return [models.Guild(payload) for payload in guilds_payload]