Skip to content

Commit a26d11d

Browse files
authored
Merge pull request #15 from benavlabs/docs-fix
Docs fix
2 parents 2dc2824 + 67f18cb commit a26d11d

File tree

6 files changed

+64
-43
lines changed

6 files changed

+64
-43
lines changed

README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,15 @@ from .user import (
7474

7575
# Database setup
7676
engine = create_async_engine("sqlite+aiosqlite:///app.db")
77-
session = AsyncSession(engine)
77+
78+
# Create database session dependency
79+
async def get_session():
80+
async with AsyncSession(engine) as session:
81+
yield session
7882

7983
# Create admin interface
8084
admin = CRUDAdmin(
81-
session=session,
85+
session=get_session,
8286
SECRET_KEY="your-secret-key-here",
8387
initial_admin={
8488
"username": "admin",
@@ -121,20 +125,20 @@ Navigate to `/admin` to access your admin interface with:
121125

122126
### Development (Default)
123127
```python
124-
admin = CRUDAdmin(session=session, SECRET_KEY="key") # Memory backend
128+
admin = CRUDAdmin(session=get_session, SECRET_KEY="key") # Memory backend
125129
```
126130

127131
### Production with Redis
128132
```python
129-
admin = CRUDAdmin(session=session, SECRET_KEY="key").use_redis_sessions(
133+
admin = CRUDAdmin(session=get_session, SECRET_KEY="key").use_redis_sessions(
130134
redis_url="redis://localhost:6379"
131135
)
132136
```
133137

134138
### Production with Security Features
135139
```python
136140
admin = CRUDAdmin(
137-
session=session,
141+
session=get_session,
138142
SECRET_KEY=SECRET_KEY,
139143
# Security features
140144
allowed_ips=["10.0.0.1"],

crudadmin/admin_interface/crud_admin.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,15 @@ class User(Base):
151151
152152
# Setup database
153153
engine = create_async_engine("sqlite+aiosqlite:///app.db")
154-
session = AsyncSession(engine)
154+
155+
# Create database session dependency
156+
async def get_session():
157+
async with AsyncSession(engine) as session:
158+
yield session
155159
156160
# Create admin interface
157161
admin = CRUDAdmin(
158-
session=session,
162+
session=get_session,
159163
SECRET_KEY=SECRET_KEY,
160164
initial_admin={
161165
"username": "admin",
@@ -167,7 +171,7 @@ class User(Base):
167171
Production setup with security features:
168172
```python
169173
admin = CRUDAdmin(
170-
session=session,
174+
session=get_session,
171175
SECRET_KEY=SECRET_KEY,
172176
# Security features
173177
allowed_ips=["10.0.0.1", "10.0.0.2"],
@@ -187,7 +191,7 @@ class User(Base):
187191
Session management configuration:
188192
```python
189193
admin = CRUDAdmin(
190-
session=session,
194+
session=get_session,
191195
SECRET_KEY=SECRET_KEY,
192196
# Session management settings
193197
max_sessions_per_user=5,
@@ -269,7 +273,7 @@ class OrderUpdate(BaseModel):
269273
Event tracking and audit logs:
270274
```python
271275
admin = CRUDAdmin(
272-
session=session,
276+
session=get_session,
273277
SECRET_KEY=SECRET_KEY,
274278
track_events=True, # Enable event tracking
275279
# Custom admin database for logs
@@ -446,7 +450,7 @@ async def initialize(self) -> None:
446450
Manual initialization:
447451
```python
448452
admin = CRUDAdmin(
449-
session=async_session,
453+
session=get_session,
450454
SECRET_KEY="key",
451455
setup_on_initialization=False
452456
)

docs/index.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,15 @@ from crudadmin import CRUDAdmin
8787

8888
# Database setup
8989
engine = create_async_engine("sqlite+aiosqlite:///app.db")
90-
session = AsyncSession(engine)
90+
91+
# Create database session dependency
92+
async def get_session():
93+
async with AsyncSession(engine) as session:
94+
yield session
9195

9296
# Create admin interface
9397
admin = CRUDAdmin(
94-
session=session,
98+
session=get_session,
9599
SECRET_KEY="your-secret-key-here",
96100
initial_admin={
97101
"username": "admin",
@@ -197,7 +201,7 @@ CRUDAdmin offers flexible configuration options for different deployment scenari
197201
from crudadmin import CRUDAdmin
198202

199203
admin = CRUDAdmin(
200-
session=async_session,
204+
session=get_session,
201205
SECRET_KEY="your-secret-key",
202206
initial_admin={
203207
"username": "admin",
@@ -220,7 +224,7 @@ app.mount("/admin", admin.app)
220224

221225
```python
222226
admin = CRUDAdmin(
223-
session=async_session,
227+
session=get_session,
224228
SECRET_KEY=os.environ["ADMIN_SECRET_KEY"],
225229

226230
# Security features
@@ -289,7 +293,7 @@ admin.use_memcached_sessions(
289293

290294
# Hybrid Sessions (Redis + Database)
291295
admin = CRUDAdmin(
292-
session=session,
296+
session=get_session,
293297
SECRET_KEY=SECRET_KEY,
294298
track_sessions_in_db=True
295299
).use_redis_sessions(

docs/quick-start.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,14 @@ Assuming you have your SQLAlchemy model, Pydantic schemas and database connectio
7575
??? note "Set up your database connection (click to expand)"
7676
```python
7777
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
78-
from sqlalchemy.orm import sessionmaker
7978

8079
DATABASE_URL = "sqlite+aiosqlite:///./admin_demo.db"
8180
engine = create_async_engine(DATABASE_URL, echo=True)
82-
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
81+
82+
# Create database session dependency
83+
async def get_session():
84+
async with AsyncSession(engine) as session:
85+
yield session
8386
```
8487

8588
### Using CRUDAdmin
@@ -96,7 +99,7 @@ from crudadmin import CRUDAdmin
9699

97100
# Create admin interface
98101
admin = CRUDAdmin(
99-
session=async_session, # Your session factory
102+
session=get_session, # Your session dependency function
100103
SECRET_KEY=os.environ.get("SECRET_KEY", "your-secret-key-for-development"),
101104
initial_admin={
102105
"username": "admin",

docs/usage/admin-users.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ The easiest way to create your first admin user is during CRUDAdmin initializati
2121
```python
2222
# Create admin interface with initial admin user
2323
admin = CRUDAdmin(
24-
session=async_session,
24+
session=get_session,
2525
SECRET_KEY=os.environ["ADMIN_SECRET_KEY"],
2626
initial_admin={
2727
"username": "admin",
@@ -263,7 +263,7 @@ Each admin user can have multiple concurrent sessions:
263263
```python
264264
# Configure session limits (in CRUDAdmin initialization)
265265
admin = CRUDAdmin(
266-
session=async_session,
266+
session=get_session,
267267
SECRET_KEY=key,
268268
max_sessions_per_user=3, # Limit concurrent sessions
269269
session_timeout_minutes=30, # Auto-logout after inactivity
@@ -287,7 +287,7 @@ admin = CRUDAdmin(
287287
```python
288288
# Development: Simple auto-admin
289289
admin = CRUDAdmin(
290-
session=async_session,
290+
session=get_session,
291291
SECRET_KEY="dev-key-change-in-production",
292292
initial_admin={
293293
"username": "admin",
@@ -297,7 +297,7 @@ admin = CRUDAdmin(
297297

298298
# Production: No auto-admin, manual creation
299299
admin = CRUDAdmin(
300-
session=async_session,
300+
session=get_session,
301301
SECRET_KEY=os.environ["ADMIN_SECRET_KEY"],
302302
initial_admin=None # Create admin users manually
303303
)

docs/usage/configuration.md

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
2525

2626
# Minimal CRUDAdmin instance
2727
admin = CRUDAdmin(
28-
session=your_async_session, # Your SQLAlchemy async session
28+
session=get_session, # Your session dependency function
2929
SECRET_KEY="your-secret-key-here"
3030
)
3131
```
@@ -43,12 +43,16 @@ from sqlalchemy.orm import sessionmaker
4343
# Database setup
4444
DATABASE_URL = "sqlite+aiosqlite:///./app.db"
4545
engine = create_async_engine(DATABASE_URL, echo=True)
46-
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
46+
47+
# Create database session dependency
48+
async def get_session():
49+
async with AsyncSession(engine) as session:
50+
yield session
4751

4852
# Create admin with common settings
4953
admin = CRUDAdmin(
5054
# Required parameters (no defaults)
51-
session=async_session,
55+
session=get_session,
5256
SECRET_KEY=os.environ.get("ADMIN_SECRET_KEY", "dev-key-change-in-production"),
5357

5458
# Basic interface settings
@@ -70,7 +74,7 @@ admin = CRUDAdmin(
7074

7175
- **Required parameters**: `session` and `SECRET_KEY` have no defaults and must be provided
7276
- **Optional parameters**: All other parameters have sensible defaults and can be omitted
73-
- **Most minimal setup**: `CRUDAdmin(session=async_session, SECRET_KEY="your-key")` uses all defaults
77+
- **Most minimal setup**: `CRUDAdmin(session=get_session, SECRET_KEY="your-key")` uses all defaults
7478

7579
---
7680

@@ -82,10 +86,12 @@ admin = CRUDAdmin(
8286
Your SQLAlchemy async session factory or callable that returns sessions:
8387

8488
```python
85-
# Session factory (most common)
86-
from sqlalchemy.orm import sessionmaker
87-
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
88-
admin = CRUDAdmin(session=async_session, SECRET_KEY=secret_key)
89+
# Session dependency function (recommended)
90+
async def get_session():
91+
async with AsyncSession(engine) as session:
92+
yield session
93+
94+
admin = CRUDAdmin(session=get_session, SECRET_KEY=secret_key)
8995
```
9096

9197
#### `SECRET_KEY` (str)
@@ -94,7 +100,7 @@ Critical for session security and cookie signing. **Never use default values in
94100
```python
95101
# ✅ Use environment variables
96102
admin = CRUDAdmin(
97-
session=session,
103+
session=get_session,
98104
SECRET_KEY=os.environ["ADMIN_SECRET_KEY"]
99105
)
100106

@@ -109,11 +115,11 @@ URL path where the admin interface will be accessible. **If you want a different
109115

110116
```python
111117
# Default: accessible at /admin (no mount_path parameter needed)
112-
admin = CRUDAdmin(session=session, SECRET_KEY=key)
118+
admin = CRUDAdmin(session=get_session, SECRET_KEY=key)
113119

114120
# Custom path: accessible at /dashboard (must specify mount_path)
115121
admin = CRUDAdmin(
116-
session=session,
122+
session=get_session,
117123
SECRET_KEY=key,
118124
mount_path="/dashboard" # Required for non-default paths
119125
)
@@ -134,22 +140,22 @@ Choose between light and dark themes:
134140

135141
```python
136142
# Dark theme (default)
137-
admin = CRUDAdmin(session=session, SECRET_KEY=key, theme="dark-theme")
143+
admin = CRUDAdmin(session=get_session, SECRET_KEY=key, theme="dark-theme")
138144

139145
# Light theme
140-
admin = CRUDAdmin(session=session, SECRET_KEY=key, theme="light-theme")
146+
admin = CRUDAdmin(session=get_session, SECRET_KEY=key, theme="light-theme")
141147
```
142148

143149
#### `admin_db_path` (str, default: None)
144150
Custom location for the admin database (used for admin users, sessions, etc.):
145151

146152
```python
147153
# Default: creates ./crudadmin_data/admin.db
148-
admin = CRUDAdmin(session=session, SECRET_KEY=key)
154+
admin = CRUDAdmin(session=get_session, SECRET_KEY=key)
149155

150156
# Custom path
151157
admin = CRUDAdmin(
152-
session=session,
158+
session=get_session,
153159
SECRET_KEY=key,
154160
admin_db_path="./admin/admin_database.db"
155161
)
@@ -160,11 +166,11 @@ Automatically create an admin user when the system initializes:
160166

161167
```python
162168
# No initial admin (default - create manually later)
163-
admin = CRUDAdmin(session=session, SECRET_KEY=key)
169+
admin = CRUDAdmin(session=get_session, SECRET_KEY=key)
164170

165171
# Create initial admin automatically
166172
admin = CRUDAdmin(
167-
session=session,
173+
session=get_session,
168174
SECRET_KEY=key,
169175
initial_admin={
170176
"username": "admin",
@@ -202,7 +208,7 @@ app.mount("/admin", admin.app)
202208
```python
203209
# If you configured a custom mount_path
204210
admin = CRUDAdmin(
205-
session=async_session,
211+
session=get_session,
206212
SECRET_KEY=key,
207213
mount_path="/dashboard"
208214
)
@@ -220,7 +226,7 @@ app.mount("/dashboard", admin.app)
220226
```python
221227
# Simple development configuration
222228
admin = CRUDAdmin(
223-
session=async_session,
229+
session=get_session,
224230
SECRET_KEY="dev-key-change-in-production", # Simple key for development
225231
initial_admin={ # Convenient auto-admin
226232
"username": "admin",
@@ -234,7 +240,7 @@ admin = CRUDAdmin(
234240
```python
235241
# Basic production configuration
236242
admin = CRUDAdmin(
237-
session=async_session,
243+
session=get_session,
238244
SECRET_KEY=os.environ["ADMIN_SECRET_KEY"], # Required environment variable
239245
initial_admin=None, # Create admin users manually
240246
secure_cookies=True, # Default: True (good for production)

0 commit comments

Comments
 (0)