Skip to content

Commit a6054ae

Browse files
fix(auth,middleware,example_async): fix authentication flow and Python 3.6 compatibility
- Fix JWT token generation and cookie setting for PyJWT 1.x compatibility - Replace @requires decorator with custom @login_required for proper redirects - Fix middleware to handle unauthenticated users correctly - Fix Python 3.6 compatibility in asyncify function - Fix database engine creation for sync/async modes - Update example_async to use proper authentication flow - Add proper error handling for JWT token validation
1 parent f4eef05 commit a6054ae

File tree

38 files changed

+590
-350
lines changed

38 files changed

+590
-350
lines changed

example/apps/home/urls.py

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,6 @@
1-
from fastapi import APIRouter, Request
2-
from raystack.shortcuts import render_template
3-
from starlette.authentication import requires
1+
from fastapi import APIRouter
2+
from . import views
43

54
router = APIRouter()
65

7-
8-
# Include your routes here.
9-
10-
# Example:
11-
@router.get("/")
12-
async def example(request: Request):
13-
return render_template(request=request, template_name="home.html", context={})
14-
15-
16-
@router.get('/private')
17-
@requires('user_auth') # protected endpoint, any authorized user can access it
18-
async def users(request: Request):
19-
return render_template(request=request, template_name="home.html", context={})
20-
21-
22-
@router.route('/test')
23-
async def user(request):
24-
user_id = request.path_params['user_id']
25-
content = {
26-
"name": "GOOD",
27-
}
28-
return JSONResponse(content)
6+
router.add_api_route("/", views.home_view, methods=["GET"])

example/apps/home/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
from raystack.shortcuts import render
22

33
# Create your views here.
4+
5+
def home_view(request):
6+
return render(request, "home/home.html", context={"framework": "Raystack"})

example/config/settings.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,12 @@
4343
SECRET_KEY = b'$2b$12$SE0dQGdt3D260TqXQzuzbOcN2EqVqzFbn4nlNvfsgburDCYp2UvAS'
4444
ALGORITHM = "HS256"
4545

46-
STATIC_URL = "static/"
46+
STATIC_URL = "static/"
47+
48+
# Настройки статических файлов
49+
STATICFILES_DIRS = [
50+
str(BASE_DIR.parent / "src" / "raystack" / "contrib" / "static"),
51+
str(BASE_DIR / "static"),
52+
]
53+
54+
STATIC_ROOT = str(BASE_DIR / "staticfiles")

example/config/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
router = APIRouter()
55

66
# Import your routers and include your urls here
7+
from apps.home.urls import router as home_urls
78

89
# Example:
910
# from apps.example.urls import router as example_urls
10-
# router.include_router(example_urls, include_in_schema=False)
11+
router.include_router(home_urls, include_in_schema=False)

example/templates/home/home.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{% extends "base.html" %}
2+
3+
{% block content %}
4+
<h1>Добро пожаловать в {{ framework }}!</h1>
5+
<p>Это простая домашняя страница.</p>
6+
{% endblock %}

example_async/apps/deps.py

Lines changed: 0 additions & 57 deletions
This file was deleted.

example_async/apps/home/deps.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from fastapi import Depends
2+
from sqlalchemy.ext.asyncio import AsyncSession
3+
4+
# Используем функционал фреймворка для работы с базой данных
5+
from raystack.core.database.base import get_async_db
6+
7+
# Простая функция для получения текущего пользователя (заглушка)
8+
async def get_current_user(session: AsyncSession = Depends(get_async_db)):
9+
# Здесь можно добавить логику аутентификации
10+
return None
11+

example_async/apps/home/models.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
# from raystack.core.database import models
1+
from sqlmodel import SQLModel, Field
2+
from typing import Union
23

3-
# Create your models here.
4+
class User(SQLModel, table=True):
5+
id: Union[int, None] = Field(default=None, primary_key=True)
6+
username: str = Field(index=True)
7+
email: str
8+
is_active: bool = Field(default=True)
9+
is_superuser: bool = Field(default=False)

example_async/apps/home/urls.py

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,6 @@
1-
from fastapi import APIRouter, Request
2-
from raystack.shortcuts import render_template
3-
from starlette.authentication import requires
1+
from fastapi import APIRouter
2+
from . import views
43

54
router = APIRouter()
65

7-
8-
# Include your routes here.
9-
10-
# Example:
11-
@router.get("/")
12-
async def example(request: Request):
13-
return render_template(request=request, template_name="home.html", context={})
14-
15-
16-
@router.get('/private')
17-
@requires('user_auth') # protected endpoint, any authorized user can access it
18-
async def users(request: Request):
19-
return render_template(request=request, template_name="home.html", context={})
20-
21-
22-
@router.route('/test')
23-
async def user(request):
24-
user_id = request.path_params['user_id']
25-
content = {
26-
"name": "GOOD",
27-
}
28-
return JSONResponse(content)
6+
router.add_api_route("/", views.home_view, methods=["GET"])

example_async/apps/home/views.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1-
from raystack.shortcuts import render
1+
from raystack.shortcuts import render_template
2+
from fastapi import Request, Depends
3+
from sqlalchemy.ext.asyncio import AsyncSession
4+
from sqlmodel import select
25

3-
# Create your views here.
6+
# Используем функционал фреймворка
7+
from raystack.core.database.base import get_async_db
8+
from .models import User
9+
10+
async def home_view(request: Request, session: AsyncSession = Depends(get_async_db)):
11+
try:
12+
# Используем асинхронный синтаксис для SQLModel
13+
result = await session.execute(select(User))
14+
users = result.scalars().all()
15+
user_count = len(users)
16+
except Exception as e:
17+
# Если база данных недоступна, показываем заглушку
18+
user_count = 0
19+
users = []
20+
21+
return render_template(request, "home/home.html", context={
22+
"framework": "Raystack Async",
23+
"user_count": user_count,
24+
"message": "Welcome to Raystack Framework!",
25+
"users": users
26+
})

0 commit comments

Comments
 (0)