fasthtml-auth


Namefasthtml-auth JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryComplete authentication system for FastHTML applications with beautiful UI, role-based access control, and session management
upload_time2025-09-04 15:18:26
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT License Copyright (c) 2024 John Richmond Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords fasthtml authentication web framework auth login session bcrypt monsterui
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # FastHTML-Auth

A comprehensive, drop-in authentication system for FastHTML applications with beautiful UI components, session management, and role-based access control.

This repro is intended to simplify the process of setting up a authentiation, user management and database setup for fastHTML apps.  Some of the code is based upon examples from Answer.ai code base, and for more information about fastHTML see [fastHTML](https://www.fastht.ml)

## Installation

```bash
pip install fasthtml-auth

## Features

- 🔐 **Secure Authentication** - Bcrypt password hashing, session management
- 👤 **User Management** - Registration, profile management, role-based access
- 🎨 **Beautiful UI** - Styled with MonsterUI components, fully responsive
- 🛡️ **Role-Based Access Control** - User, Manager, Admin roles with decorators
- 🔄 **Session Management** - Automatic session handling with FastHTML
- 📱 **Mobile Friendly** - Responsive design works on all devices
- ⚡ **Easy Integration** - Drop-in solution with minimal setup required

## Quick Start

### Installation

```bash
pip install fasthtml-auth
```

### Quick Start

```python
from fasthtml.common import *
from monsterui.all import *
from fasthtml_auth import AuthManager

# Initialize authentication system
auth = AuthManager(
    db_path="data/app.db",
    config={
        'allow_registration': True,
        'public_paths': ['/about', '/contact']
    }
)

# Set up database and middleware
db = auth.initialize()
beforeware = auth.create_beforeware()

# Create FastHTML app with authentication
app = FastHTML(
    before=beforeware,
    secret_key='your-secret-key-change-in-production',
    hdrs=Theme.blue.headers()  # MonsterUI styling
)

# Register authentication routes
auth.register_routes(app)

# Your protected routes
@app.route("/")
def dashboard(req):
    user = req.scope['user']  # Automatically available
    return Title("Dashboard"), H1(f"Welcome, {user.username}!")

@app.route("/admin")
@auth.require_admin()
def admin_panel(req):
    return Title("Admin"), H1("Admin Only Area")

if __name__ == "__main__":
    serve(port=5000)
```

That's it! Your app now has:
- Login/logout at `/auth/login` and `/auth/logout`
- User registration at `/auth/register` 
- Profile management at `/auth/profile`
- Role-based access control
- Beautiful, responsive forms

## Configuration

```python
config = {
    'login_path': '/auth/login',           # Custom login URL
    'public_paths': ['/about', '/api'],    # Routes that don't require auth
    'allow_registration': True,            # Enable user registration
    'allow_password_reset': False,         # Enable password reset (coming soon)
}

auth = AuthManager(db_path="data/app.db", config=config)
```

## User Roles and Access Control

### Available Roles
- **user** - Basic authenticated user
- **manager** - Manager privileges + user access  
- **admin** - Full system access

### Role-Based Route Protection

```python
# Require specific roles
@app.route("/manager-area")
@auth.require_role('manager', 'admin')
def manager_view(req, *args, **kwargs):
    return H1("Manager+ Only")

# Admin only shortcut
@app.route("/admin")
@auth.require_admin()
def admin_panel(req, *args, **kwargs):
    return H1("Admin Only")

# Check roles in templates
@app.route("/dashboard")
def dashboard(req):
    user = req.scope['user']
    
    admin_link = A("Admin Panel", href="/admin") if user.role == 'admin' else None
    manager_link = A("Manager Area", href="/manager") if user.role in ['manager', 'admin'] else None
    
    return Div(admin_link, manager_link)
```

## User Object

In protected routes, `req.scope['user']` contains:

```python
user.id          # Unique user ID  
user.username    # Username
user.email       # Email address
user.role        # 'user', 'manager', or 'admin'
user.active      # Boolean - account status
user.created_at  # Account creation timestamp
user.last_login  # Last login timestamp
```

## Database Schema

FastHTML-Auth automatically creates these tables:

```sql
-- Users table
CREATE TABLE user (
   id INTEGER PRIMARY KEY,
   username TEXT UNIQUE NOT NULL,
   email TEXT UNIQUE NOT NULL, 
   password TEXT NOT NULL,        -- Bcrypt hashed
   role TEXT DEFAULT 'user',
   created_at TEXT,
   last_login TEXT,
   active INTEGER DEFAULT 1
);

-- Sessions table (for future use)
CREATE TABLE session (
   id TEXT PRIMARY KEY,
   user_id INTEGER,
   data TEXT,
   expires_at TEXT,
   created_at TEXT
);
```

## Styling and Themes

FastHTML-Auth uses [MonsterUI](https://github.com/pixeltable/monster-ui) for beautiful, consistent styling.

```python
# Choose your theme
app = FastHTML(
    before=beforeware,
    hdrs=Theme.blue.headers()    # or Theme.red, Theme.green, etc.
)
```

All forms include:
- Responsive card-based layouts
- Professional input styling  
- Clear error/success messages
- Loading states and validation
- Mobile-optimized design

## API Reference

### AuthManager

```python
class AuthManager:
    def __init__(self, db_path="data/app.db", config=None)
    def initialize(self) -> Database
    def create_beforeware(self, additional_public_paths=None) -> Beforeware
    def register_routes(self, app, prefix="/auth") -> Dict
    def require_role(self, *roles) -> Decorator
    def require_admin(self) -> Decorator
    def get_user(self, username: str) -> Optional[User]
```

### Default Admin Account

A default admin account is created automatically:
- **Username**: `admin`  
- **Password**: `admin123`
- **Role**: `admin`

⚠️ **Change this password in production!**

## Available Routes

FastHTML-Auth automatically registers these routes:

- `GET /auth/login` - Login form
- `POST /auth/login` - Login submission  
- `GET /auth/logout` - Logout and redirect
- `GET /auth/register` - Registration form (if enabled)
- `POST /auth/register` - Registration submission (if enabled)
- `GET /auth/profile` - User profile management
- `POST /auth/profile` - Profile update submission

## Examples

### Complete Example App

```python
from fasthtml.common import *
from monsterui.all import *
from fasthtml_auth import AuthManager

# Initialize auth
auth = AuthManager(
    db_path="data/myapp.db",
    config={
        'allow_registration': True,
        'public_paths': ['/about', '/pricing', '/contact']
    }
)

db = auth.initialize()
beforeware = auth.create_beforeware()

app = FastHTML(
    before=beforeware,
    secret_key='super-secret-change-me',
    hdrs=Theme.blue.headers()
)

auth.register_routes(app)

# Public landing page
@app.route("/")
def home(req):
    user = req.scope.get('user')  # None if not logged in
    
    if user:
        return RedirectResponse('/dashboard')
    
    return Title("Welcome"), Container(
        H1("My Awesome App"),
        P("Please login to continue"),
        A("Login", href="/auth/login", cls=ButtonT.primary),
        A("Sign Up", href="/auth/register", cls=ButtonT.secondary)
    )

# Protected dashboard
@app.route("/dashboard")  
def dashboard(req, *args, **kwargs):
    user = req.scope['user']
    
    return Title("Dashboard"), Container(
        H1(f"Welcome back, {user.username}!"),
        
        # Role-specific content
        Card(
            CardHeader("Your Account"),
            CardBody(
                P(f"Role: {user.role.title()}"),
                P(f"Member since: {user.created_at[:10]}"),
                A("Edit Profile", href="/auth/profile", cls=ButtonT.primary)
            )
        ) if user.role == 'user' else None,
        
        # Manager content
        Card(
            CardHeader("Management Tools"),
            CardBody(
                A("View Reports", href="/reports", cls=ButtonT.primary),
                A("Manage Users", href="/users", cls=ButtonT.secondary)
            )
        ) if user.role in ['manager', 'admin'] else None
    )

if __name__ == "__main__":
    serve(port=5000)
```

## Dependencies

- `fasthtml` - Web framework
- `monsterui` - UI components
- `fastlite` - Database ORM
- `bcrypt` - Password hashing

## Development

```bash
# Clone the repository
git clone https://github.com/fromlittleacorns/fasthtml-auth.git
cd fasthtml-auth

# Install development dependencies
pip install -e .[dev]

# Run tests
python -m pytest

# Run example
python examples/complete_app.py
```

## Contributing

We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Changelog

### v0.1.0
- Initial release
- Basic authentication system
- MonsterUI integration
- Role-based access control
- User registration and profiles

---

**FastHTML-Auth** - Authentication made simple for FastHTML applications.

For more examples and documentation, visit: [https://github.com/fromlittleacorns/fasthtml-auth](https://github.com/fromlittleacorns/fasthtml-auth)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "fasthtml-auth",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "John Richmond <confusedjohn46@gmail.com>",
    "keywords": "fasthtml, authentication, web, framework, auth, login, session, bcrypt, monsterui",
    "author": null,
    "author_email": "John Richmond <confusedjohn46@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/1c/f3/ccf28e8869c51d727ad8f6c3e9163f4748d00aa4b8175a6c7f4eaf873c8d/fasthtml_auth-0.1.0.tar.gz",
    "platform": null,
    "description": "# FastHTML-Auth\n\nA comprehensive, drop-in authentication system for FastHTML applications with beautiful UI components, session management, and role-based access control.\n\nThis repro is intended to simplify the process of setting up a authentiation, user management and database setup for fastHTML apps.  Some of the code is based upon examples from Answer.ai code base, and for more information about fastHTML see [fastHTML](https://www.fastht.ml)\n\n## Installation\n\n```bash\npip install fasthtml-auth\n\n## Features\n\n- \ud83d\udd10 **Secure Authentication** - Bcrypt password hashing, session management\n- \ud83d\udc64 **User Management** - Registration, profile management, role-based access\n- \ud83c\udfa8 **Beautiful UI** - Styled with MonsterUI components, fully responsive\n- \ud83d\udee1\ufe0f **Role-Based Access Control** - User, Manager, Admin roles with decorators\n- \ud83d\udd04 **Session Management** - Automatic session handling with FastHTML\n- \ud83d\udcf1 **Mobile Friendly** - Responsive design works on all devices\n- \u26a1 **Easy Integration** - Drop-in solution with minimal setup required\n\n## Quick Start\n\n### Installation\n\n```bash\npip install fasthtml-auth\n```\n\n### Quick Start\n\n```python\nfrom fasthtml.common import *\nfrom monsterui.all import *\nfrom fasthtml_auth import AuthManager\n\n# Initialize authentication system\nauth = AuthManager(\n    db_path=\"data/app.db\",\n    config={\n        'allow_registration': True,\n        'public_paths': ['/about', '/contact']\n    }\n)\n\n# Set up database and middleware\ndb = auth.initialize()\nbeforeware = auth.create_beforeware()\n\n# Create FastHTML app with authentication\napp = FastHTML(\n    before=beforeware,\n    secret_key='your-secret-key-change-in-production',\n    hdrs=Theme.blue.headers()  # MonsterUI styling\n)\n\n# Register authentication routes\nauth.register_routes(app)\n\n# Your protected routes\n@app.route(\"/\")\ndef dashboard(req):\n    user = req.scope['user']  # Automatically available\n    return Title(\"Dashboard\"), H1(f\"Welcome, {user.username}!\")\n\n@app.route(\"/admin\")\n@auth.require_admin()\ndef admin_panel(req):\n    return Title(\"Admin\"), H1(\"Admin Only Area\")\n\nif __name__ == \"__main__\":\n    serve(port=5000)\n```\n\nThat's it! Your app now has:\n- Login/logout at `/auth/login` and `/auth/logout`\n- User registration at `/auth/register` \n- Profile management at `/auth/profile`\n- Role-based access control\n- Beautiful, responsive forms\n\n## Configuration\n\n```python\nconfig = {\n    'login_path': '/auth/login',           # Custom login URL\n    'public_paths': ['/about', '/api'],    # Routes that don't require auth\n    'allow_registration': True,            # Enable user registration\n    'allow_password_reset': False,         # Enable password reset (coming soon)\n}\n\nauth = AuthManager(db_path=\"data/app.db\", config=config)\n```\n\n## User Roles and Access Control\n\n### Available Roles\n- **user** - Basic authenticated user\n- **manager** - Manager privileges + user access  \n- **admin** - Full system access\n\n### Role-Based Route Protection\n\n```python\n# Require specific roles\n@app.route(\"/manager-area\")\n@auth.require_role('manager', 'admin')\ndef manager_view(req, *args, **kwargs):\n    return H1(\"Manager+ Only\")\n\n# Admin only shortcut\n@app.route(\"/admin\")\n@auth.require_admin()\ndef admin_panel(req, *args, **kwargs):\n    return H1(\"Admin Only\")\n\n# Check roles in templates\n@app.route(\"/dashboard\")\ndef dashboard(req):\n    user = req.scope['user']\n    \n    admin_link = A(\"Admin Panel\", href=\"/admin\") if user.role == 'admin' else None\n    manager_link = A(\"Manager Area\", href=\"/manager\") if user.role in ['manager', 'admin'] else None\n    \n    return Div(admin_link, manager_link)\n```\n\n## User Object\n\nIn protected routes, `req.scope['user']` contains:\n\n```python\nuser.id          # Unique user ID  \nuser.username    # Username\nuser.email       # Email address\nuser.role        # 'user', 'manager', or 'admin'\nuser.active      # Boolean - account status\nuser.created_at  # Account creation timestamp\nuser.last_login  # Last login timestamp\n```\n\n## Database Schema\n\nFastHTML-Auth automatically creates these tables:\n\n```sql\n-- Users table\nCREATE TABLE user (\n   id INTEGER PRIMARY KEY,\n   username TEXT UNIQUE NOT NULL,\n   email TEXT UNIQUE NOT NULL, \n   password TEXT NOT NULL,        -- Bcrypt hashed\n   role TEXT DEFAULT 'user',\n   created_at TEXT,\n   last_login TEXT,\n   active INTEGER DEFAULT 1\n);\n\n-- Sessions table (for future use)\nCREATE TABLE session (\n   id TEXT PRIMARY KEY,\n   user_id INTEGER,\n   data TEXT,\n   expires_at TEXT,\n   created_at TEXT\n);\n```\n\n## Styling and Themes\n\nFastHTML-Auth uses [MonsterUI](https://github.com/pixeltable/monster-ui) for beautiful, consistent styling.\n\n```python\n# Choose your theme\napp = FastHTML(\n    before=beforeware,\n    hdrs=Theme.blue.headers()    # or Theme.red, Theme.green, etc.\n)\n```\n\nAll forms include:\n- Responsive card-based layouts\n- Professional input styling  \n- Clear error/success messages\n- Loading states and validation\n- Mobile-optimized design\n\n## API Reference\n\n### AuthManager\n\n```python\nclass AuthManager:\n    def __init__(self, db_path=\"data/app.db\", config=None)\n    def initialize(self) -> Database\n    def create_beforeware(self, additional_public_paths=None) -> Beforeware\n    def register_routes(self, app, prefix=\"/auth\") -> Dict\n    def require_role(self, *roles) -> Decorator\n    def require_admin(self) -> Decorator\n    def get_user(self, username: str) -> Optional[User]\n```\n\n### Default Admin Account\n\nA default admin account is created automatically:\n- **Username**: `admin`  \n- **Password**: `admin123`\n- **Role**: `admin`\n\n\u26a0\ufe0f **Change this password in production!**\n\n## Available Routes\n\nFastHTML-Auth automatically registers these routes:\n\n- `GET /auth/login` - Login form\n- `POST /auth/login` - Login submission  \n- `GET /auth/logout` - Logout and redirect\n- `GET /auth/register` - Registration form (if enabled)\n- `POST /auth/register` - Registration submission (if enabled)\n- `GET /auth/profile` - User profile management\n- `POST /auth/profile` - Profile update submission\n\n## Examples\n\n### Complete Example App\n\n```python\nfrom fasthtml.common import *\nfrom monsterui.all import *\nfrom fasthtml_auth import AuthManager\n\n# Initialize auth\nauth = AuthManager(\n    db_path=\"data/myapp.db\",\n    config={\n        'allow_registration': True,\n        'public_paths': ['/about', '/pricing', '/contact']\n    }\n)\n\ndb = auth.initialize()\nbeforeware = auth.create_beforeware()\n\napp = FastHTML(\n    before=beforeware,\n    secret_key='super-secret-change-me',\n    hdrs=Theme.blue.headers()\n)\n\nauth.register_routes(app)\n\n# Public landing page\n@app.route(\"/\")\ndef home(req):\n    user = req.scope.get('user')  # None if not logged in\n    \n    if user:\n        return RedirectResponse('/dashboard')\n    \n    return Title(\"Welcome\"), Container(\n        H1(\"My Awesome App\"),\n        P(\"Please login to continue\"),\n        A(\"Login\", href=\"/auth/login\", cls=ButtonT.primary),\n        A(\"Sign Up\", href=\"/auth/register\", cls=ButtonT.secondary)\n    )\n\n# Protected dashboard\n@app.route(\"/dashboard\")  \ndef dashboard(req, *args, **kwargs):\n    user = req.scope['user']\n    \n    return Title(\"Dashboard\"), Container(\n        H1(f\"Welcome back, {user.username}!\"),\n        \n        # Role-specific content\n        Card(\n            CardHeader(\"Your Account\"),\n            CardBody(\n                P(f\"Role: {user.role.title()}\"),\n                P(f\"Member since: {user.created_at[:10]}\"),\n                A(\"Edit Profile\", href=\"/auth/profile\", cls=ButtonT.primary)\n            )\n        ) if user.role == 'user' else None,\n        \n        # Manager content\n        Card(\n            CardHeader(\"Management Tools\"),\n            CardBody(\n                A(\"View Reports\", href=\"/reports\", cls=ButtonT.primary),\n                A(\"Manage Users\", href=\"/users\", cls=ButtonT.secondary)\n            )\n        ) if user.role in ['manager', 'admin'] else None\n    )\n\nif __name__ == \"__main__\":\n    serve(port=5000)\n```\n\n## Dependencies\n\n- `fasthtml` - Web framework\n- `monsterui` - UI components\n- `fastlite` - Database ORM\n- `bcrypt` - Password hashing\n\n## Development\n\n```bash\n# Clone the repository\ngit clone https://github.com/fromlittleacorns/fasthtml-auth.git\ncd fasthtml-auth\n\n# Install development dependencies\npip install -e .[dev]\n\n# Run tests\npython -m pytest\n\n# Run example\npython examples/complete_app.py\n```\n\n## Contributing\n\nWe welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Changelog\n\n### v0.1.0\n- Initial release\n- Basic authentication system\n- MonsterUI integration\n- Role-based access control\n- User registration and profiles\n\n---\n\n**FastHTML-Auth** - Authentication made simple for FastHTML applications.\n\nFor more examples and documentation, visit: [https://github.com/fromlittleacorns/fasthtml-auth](https://github.com/fromlittleacorns/fasthtml-auth)\n",
    "bugtrack_url": null,
    "license": "MIT License\n        \n        Copyright (c) 2024 John Richmond\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.",
    "summary": "Complete authentication system for FastHTML applications with beautiful UI, role-based access control, and session management",
    "version": "0.1.0",
    "project_urls": {
        "Changelog": "https://github.com/fromLittleAcorns/fasthtml-auth/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/fromLittleAcorns/fasthtml-auth#readme",
        "Homepage": "https://github.com/fromLittleAcorns/fasthtml-auth",
        "Issues": "https://github.com/fromLittleAcorns/fasthtml-auth/issues",
        "Repository": "https://github.com/fromLittleAcorns/fasthtml-toolkit"
    },
    "split_keywords": [
        "fasthtml",
        " authentication",
        " web",
        " framework",
        " auth",
        " login",
        " session",
        " bcrypt",
        " monsterui"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c7a2d427107dd45b556e87ad138a65e6a2cc5b5d9a7e201e15690542640e7827",
                "md5": "f8fa6b2565c784c9253be6513360e3ea",
                "sha256": "770ebf24ad24f8f2d4dfbb981fb80cf745ad1f78f29be9187ac264381b8f8b98"
            },
            "downloads": -1,
            "filename": "fasthtml_auth-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f8fa6b2565c784c9253be6513360e3ea",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 17958,
            "upload_time": "2025-09-04T15:18:25",
            "upload_time_iso_8601": "2025-09-04T15:18:25.119723Z",
            "url": "https://files.pythonhosted.org/packages/c7/a2/d427107dd45b556e87ad138a65e6a2cc5b5d9a7e201e15690542640e7827/fasthtml_auth-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1cf3ccf28e8869c51d727ad8f6c3e9163f4748d00aa4b8175a6c7f4eaf873c8d",
                "md5": "a36490e2b41b46eba455617ae4680d8e",
                "sha256": "a86e184e7eee1e82cc9ae6379272df8b83cc06d5322a26b5f21822740077998e"
            },
            "downloads": -1,
            "filename": "fasthtml_auth-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "a36490e2b41b46eba455617ae4680d8e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 21697,
            "upload_time": "2025-09-04T15:18:26",
            "upload_time_iso_8601": "2025-09-04T15:18:26.766228Z",
            "url": "https://files.pythonhosted.org/packages/1c/f3/ccf28e8869c51d727ad8f6c3e9163f4748d00aa4b8175a6c7f4eaf873c8d/fasthtml_auth-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-04 15:18:26",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "fromLittleAcorns",
    "github_project": "fasthtml-auth",
    "github_not_found": true,
    "lcname": "fasthtml-auth"
}
        
Elapsed time: 3.21205s