Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -179,8 +179,6 @@
# Custom
.pre-commit-config.yaml
assets
LICENSE
pyrightconfig.json
README.md
ruff.toml
tests
5 changes: 4 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ WORKDIR /app

COPY --from=uv /uv /uvx /bin/
COPY pyproject.toml uv.lock ./
COPY backend backend
COPY README.md .
COPY LICENSE .

ENV PYTHONDONTWRITEBYTECODE=True
ENV PYTHONUNBUFFERED=True
Expand All @@ -28,4 +31,4 @@ RUN apt-get update \

RUN uv sync --frozen --no-install-project

ENTRYPOINT ["hypercorn", "{{ cookiecutter.package_name }}:app", "-b", "0.0.0.0:8000"]
ENTRYPOINT ["uv", "run", "python", "-m", "backend"]
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# backend-template-python
## プロジェクト作成方法
### cookiecutter
```sh
cookiecutter https://github.com/Tech-JAIST/backend-template-python
```

### GUI
右上の `Use this template` からレポジトリを作成できます。

## How to run
```
docker build -t backend_python .
docker run --rm -p 8000:8000 backend_python
```
## uv
```sh
# macOS/Linux
Expand Down
2 changes: 1 addition & 1 deletion backend/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from . import handler
"""Backend package for the application."""
46 changes: 34 additions & 12 deletions backend/__main__.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,45 @@
import asyncio
from typing import TYPE_CHECKING, cast

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from hypercorn.asyncio import serve
from hypercorn.config import Config
from tinydb import TinyDB

if TYPE_CHECKING:
from hypercorn.typing import ASGIFramework

from .handler import get_router
from .repository import get_repository

app = FastAPI()

origins = ["https://localhost:8080"]
async def run() -> None:
"""Run the FastAPI application.

This function creates a FastAPI application, sets up CORS middleware,
"""
app = FastAPI()

origins = ["https://localhost:8080"]

db = TinyDB("db.json")
repository = get_repository(db=db)

app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

app.include_router(get_router(repository))

db = TinyDB("db.json")
repository = get_repository(db=db)
config = Config()
config.bind = ["0.0.0.0:8000"]
await serve(cast("ASGIFramework", app), config)

app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

app.include_router(get_router(repository))
if __name__ == "__main__":
asyncio.run(run())
4 changes: 4 additions & 0 deletions backend/domain/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
"""Domain package for the backend."""

from .user import User

__all__ = ["User"]
7 changes: 5 additions & 2 deletions backend/handler/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from .handler import get_router
"""Handler package for managing API routes."""

__all__ = ["get_router"]
from .handler import get_ping_router, get_router
from .user import User, get_user_router

__all__ = ["User", "get_ping_router", "get_router", "get_user_router"]
4 changes: 1 addition & 3 deletions backend/handler/handler.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from fastapi import APIRouter

from backend.repository import Repository

from .ping import get_ping_router
from .user import get_user_router

Expand All @@ -18,6 +19,3 @@ def get_router(repository: Repository) -> APIRouter:
router.include_router(get_user_router(repository))

return router


__all__ = ["get_router"]
7 changes: 2 additions & 5 deletions backend/handler/ping.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
from backend.repository import Repository


class PingResponse(BaseModel):
class PingResponse(BaseModel): # noqa: D101
message: str


def get_ping_router(repoository: Repository) -> APIRouter:
def get_ping_router(_repoository: Repository) -> APIRouter:
"""Create a router for the ping endpoint.

Returns:
Expand All @@ -22,6 +22,3 @@ async def ping() -> PingResponse:
return PingResponse(message="pong")

return router


__all__ = ["get_ping_router"]
7 changes: 2 additions & 5 deletions backend/handler/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
from backend.repository import Repository


class User(BaseModel):
class User(BaseModel): # noqa: D101
id: str
name: str


class UserResponse(BaseModel):
class UserResponse(BaseModel): # noqa: D101
users: list[User]


Expand All @@ -29,6 +29,3 @@ async def get_users() -> UserResponse:
return UserResponse(users=user_responses)

return router


__all__ = ["get_user_router"]
4 changes: 4 additions & 0 deletions backend/repository/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
"""Repository package for managing data storage and retrieval."""

from .repository import Repository, get_repository

__all__ = ["Repository", "get_repository"]
15 changes: 10 additions & 5 deletions backend/repository/repository.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
from pydantic import BaseModel
from tinydb import TinyDB

from .user import UserRepository, get_user_repository


class Repository(BaseModel):
class Repository: # noqa: D101
user_repository: UserRepository

def __init__(self, user_repository: UserRepository) -> None:
"""Initialize the repository.

Args:
user_repository (UserRepository): The user repository.

"""
self.user_repository = user_repository


def get_repository(db: TinyDB) -> Repository:
"""Get the repository.
Expand All @@ -17,6 +25,3 @@ def get_repository(db: TinyDB) -> Repository:
"""
user_repository = get_user_repository(db=db)
return Repository(user_repository=user_repository)


__all__ = ["get_repository"]
7 changes: 2 additions & 5 deletions backend/repository/user.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from pydantic import BaseModel
from tinydb import Query, TinyDB

from backend.domain import User


class UserRepository(BaseModel):
class UserRepository: # noqa: D101
db: TinyDB

def __init__(self, db: TinyDB) -> None:
Expand All @@ -15,6 +14,7 @@ def __init__(self, db: TinyDB) -> None:

"""
self.db = db
db.insert({"name": "root", "id": "0d9a2f49-99aa-49e6-bcf6-b123953aca63"})

def get_users(self) -> list[User]:
"""Get all users.
Expand All @@ -36,6 +36,3 @@ def get_user_repository(db: TinyDB) -> UserRepository:

"""
return UserRepository(db=db)


__all__ = ["get_user_repository"]
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[project]
name = "default"
name = "backend"
version = "0.1.0"
description = "This repository contains configurations to set up a Python development environment using VSCode's Dev Container feature. The environment includes uv and Ruff."

Expand All @@ -9,7 +9,7 @@ license = { file = "LICENSE" }

dependencies = [
"fastapi>=0.115.12",
"google-cloud-logging>=3.11.3",
"hypercorn>=0.17.3",
"pydantic>=2.10.5",
"pydantic-settings>=2.7.1",
"tinydb>=4.8.2",
Expand Down
Loading