Add users to your app and decide what they can access.
Project description
plain.auth
Add users to your app and decide what they can access.
- Overview
- Authentication setup
- Checking if a user is logged in
- Restricting views
- Testing with authenticated users
- Settings
- FAQs
- Installation
Overview
The plain.auth package handles user authentication and authorization for Plain applications. You can check if a user is logged in like this:
from plain.auth import get_request_user
user = get_request_user(request)
if user:
print(f"Hello, {user.email}!")
else:
print("You are not logged in.")
You can restrict a view to logged-in users using AuthViewMixin:
from plain.auth.views import AuthViewMixin
from plain.views import View
class ProfileView(AuthViewMixin, View):
login_required = True
def get(self):
return f"Welcome, {self.user.email}!"
Authentication setup
Settings configuration
Configure your authentication settings in app/settings.py:
INSTALLED_PACKAGES = [
# ...
"plain.auth",
"plain.sessions",
"plain.passwords", # Or another auth method
"app.users",
]
MIDDLEWARE = [
"plain.sessions.middleware.SessionMiddleware",
"plain.auth.middleware.AuthMiddleware",
]
AUTH_LOGIN_URL = "login"
Creating a user model
plain.auth expects your project's User class at app.users.models.User — a fixed convention, not a configurable setting. The package label (users), module (models.py), and class name (User) are all required.
You can create one with plain create users or manually:
# app/users/models.py
from datetime import datetime
from plain import postgres
from plain.postgres import types
from plain.passwords.models import PasswordField
@postgres.register_model
class User(postgres.Model):
email: str = types.EmailField()
password = PasswordField()
is_admin: bool = types.BooleanField(default=False)
created_at: datetime = types.DateTimeField(create_now=True)
def __str__(self):
return self.email
Login views
To log users in, you need to pair this package with an authentication method:
- plain.passwords - Username/password authentication
- plain.oauth - OAuth provider authentication
- plain.loginlink - Magic link authentication
Here's an example with password authentication:
# app/urls.py
from plain.auth.views import LogoutView
from plain.urls import path
from plain.passwords.views import PasswordLoginView
class LoginView(PasswordLoginView):
template_name = "login.html"
urlpatterns = [
path("logout/", LogoutView, name="logout"),
path("login/", LoginView, name="login"),
]
Checking if a user is logged in
In templates, you can use the get_current_user() function:
{% if get_current_user() %}
<p>Hello, {{ get_current_user().email }}!</p>
{% else %}
<p>You are not logged in.</p>
{% endif %}
In Python code, use get_request_user():
from plain.auth import get_request_user
user = get_request_user(request)
if user:
print(f"Hello, {user.email}!")
else:
print("You are not logged in.")
Restricting views
You can use AuthViewMixin to restrict views to logged-in users, admin users, or custom logic:
from plain.auth.views import AuthViewMixin
from plain.http import ForbiddenError403
from plain.views import View
class LoggedInView(AuthViewMixin, View):
login_required = True
class AdminOnlyView(AuthViewMixin, View):
login_required = True
admin_required = True
class CustomPermissionView(AuthViewMixin, View):
def check_auth(self):
super().check_auth()
if not self.user.is_special:
raise ForbiddenError403("You're not special!")
The AuthViewMixin provides:
login_required- Requires a logged-in useradmin_required- Requiresuser.is_adminto be Truecheck_auth()- Override for custom authorization logic
Testing with authenticated users
When writing tests, you can use login_client() to simulate an authenticated user:
from plain.auth.test import login_client
from plain.test import Client
from app.users.models import User
def test_profile_view():
user = User.objects.create(email="test@example.com")
client = Client()
login_client(client, user)
response = client.get("/profile/")
assert response.status_code == 200
You can also log out a test user with logout_client():
from plain.auth.test import login_client, logout_client
# ... after logging in
logout_client(client)
Settings
| Setting | Default | Env var |
|---|---|---|
AUTH_LOGIN_URL |
Required | PLAIN_AUTH_LOGIN_URL |
AUTH_USER_SESSION_HASH_FIELD |
"password" or "" |
PLAIN_AUTH_USER_SESSION_HASH_FIELD |
See default_settings.py for more details.
FAQs
How do I log in a user programmatically?
You can use the login() function to log in a user:
from plain.auth.sessions import login
login(request, user)
How do I log out a user programmatically?
You can use the logout() function:
from plain.auth.sessions import logout
logout(request)
How do I invalidate sessions when a user changes their password?
By default, if you have plain.passwords installed, sessions are automatically invalidated when the password field changes. This is controlled by the AUTH_USER_SESSION_HASH_FIELD setting. You can change this to a different field name, or set it to an empty string to disable this feature.
How do I reference the User class?
Import it directly from app.users.models — the location is fixed:
from app.users.models import User
Installation
Install the plain.auth package from PyPI:
uv add plain.auth
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plain_auth-0.29.2.tar.gz.
File metadata
- Download URL: plain_auth-0.29.2.tar.gz
- Upload date:
- Size: 15.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3a8e5961e8950595bd786af8d833a2ef13bdda8f4ad03f18e187613642993b7
|
|
| MD5 |
3b6af9e67532ee805ad79e97ef38d337
|
|
| BLAKE2b-256 |
8bd65fc497c359b5b43ab0684b65aa7bdb2ca72051b6431e958376e25513e355
|
File details
Details for the file plain_auth-0.29.2-py3-none-any.whl.
File metadata
- Download URL: plain_auth-0.29.2-py3-none-any.whl
- Upload date:
- Size: 18.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dcb17270b54decbb7ea77e3ddd15f06d75bd54fd3461a2162a1a5874697b1581
|
|
| MD5 |
7eec281d91b35e6cb43758587f7bd385
|
|
| BLAKE2b-256 |
84418ff10885ae09e20719a07ab8118aef95ec9dd16f951eb4e19449f558b668
|