Examples¶
Currently working on a starlette web app example!
Note
For all the examples below, assume ‘handler’ is a initialized instance of ‘AccountHandler’ and ran within the context of the event loop.
Creating accounts¶
Note
If SMTP details given, if a email is provided users will be sent a email getting them to confirm there email.
# Email only
model, user = await handler.create_account(
password="some password what passes the policy",
email="example@protonmail.com"
)
# Name only
model, user = await handler.create_account(
password="some password what passes the policy",
name="ward42"
)
# Both
model, user = await handler.create_account(
password="some password what passes the policy",
name="ward42",
email="example@protonmail.com"
)
Logging in¶
from aioaccount import InvalidLogin
try:
await handler.login(
# Provide a email or name
email=None, name=None,
password="1234",
# If true, smtp provided & email provided by user
# Email confirmation required to login
require_email_confirmed=True
)
except InvalidLogin:
print("Password, email or name incorrect")
else:
print("I've logged in!")
Confirm email¶
from aioaccount import UnableToConfirmEmail
try:
await handler.confirm_email(
email="example@protonmail.com",
given_code="some long code aioaccount generated"
)
except UnableToConfirmEmail:
print("Invalid code or email")
else:
print("Email confirmed!")
Converting a name or email to user ID¶
Note
Ideally you should be storing user IDs in your own database once generated, but if you ever need to convert a name or email to a user ID you can.
The issue with relying on ‘to_user’ is that if a user changes name or email and someone as starts using that name or email, you’ll be doing actions on a different user then you except. Ideally always use user IDs.
# Email
model, user = await handler.to_user(
email="example@protonmail.com"
)
# Name
model, user = await handler.to_user(
name="ward42"
)
Listing users¶
async for model, user in handler.users():
print(model.name)
Interacting with a user¶
Note
Assume all references to ‘user’ are the initialized instance of ‘User’
Getting a user object from a user ID¶
user = handler.user(
user_id="123"
)
Updating password¶
from aioaccount import InvalidLogin, PasswordPolicyError
try:
await user.update_password(
current_password="current password",
new_password="new password"
)
except InvalidLogin:
print("Current password incorrect")
except PasswordPolicyError:
print("Password doesn't meet our password policy")
else:
print("Password updated!")
Updating name¶
from aioaccount import DetailsExistError, NameLengthInvalidError, NameInvalidCharactersError
try:
await user.update_name(
name="ward43"
)
except DetailsExistError:
print("Sorry that name is taken.")
except NameLengthInvalidError:
print("Sorry that name is too long")
except NameInvalidCharactersError:
print("Sorry that name contains illegal characters")
else:
print("Name updated")
Updating email¶
Note
If SMTP client provided, users will be required to confirm there email again.
from aioaccount import EmailError, DetailsExistError
try:
await user.update_email(
new_email="exam@protonmail.com"
)
except EmailError:
print("Email is invalid")
except DetailsExistError:
print("Email already exist")
else:
print("Email updated")
Reset password¶
Note
If SMTP client provided, users will be required to confirm password reset from email.
# 'reset_password' will return the generated reset code,
# this should only be used if SMTP isn't being used or a email isn't provided.
code = await user.reset_password()
Confirm password reset¶
from aioaccount import PasswordResetInvalid, PasswordPolicyError
try:
await user.password_confirm(
new_password="123",
given_code="123"
)
except PasswordResetInvalid:
print("The code you've provided is incorrect")
except PasswordPolicyError:
print("Password doesn't meet password policy!")
else:
print("Password has been reset!")
Getting user details¶
from aioaccount import UserIdError
try:
model = await user.get()
except UserIdError:
pass
else:
print(model.name)