Compliance with Standards and Regulations (GDPR, HIPAA)

Joël-Steve N.
3 min readJul 9, 2024

--

Ensuring Your Applications Adhere to Local and International Regulations

When developing applications, particularly those involving sensitive or personal data, it’s crucial to comply with standards and regulations such as GDPR (General Data Protection Regulation) in Europe and HIPAA (Health Insurance Portability and Accountability Act) in the United States. FastAPI, a modern framework for building APIs with Python, provides features to help ensure compliance with these regulations. In this article, we’ll explore how to structure your FastAPI application to ensure GDPR and HIPAA compliance.

Project Structure

Let’s start with a basic project structure for your FastAPI application:

fastapi_compliance/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── models.py
│ ├── crud.py
│ ├── database.py
│ └── config.py
├── requirements.txt
└── README.md

1. Setting Up Your Environment

Create a virtual environment and install FastAPI along with necessary dependencies:

python -m venv venv
source venv/bin/activate # On Windows, use `venv\Scripts\activate`
pip install fastapi uvicorn sqlalchemy python-jose passlib

2. File Contents

app/__init__.py

This file indicates that app/ is a package. It can be left empty or used to set up package-level imports.

# app/__init__.py

app/main.py

This is the main entry point for your FastAPI application. Here, you define your FastAPI instance, configure routes, and run the application with Uvicorn.

# app/main.py

from fastapi import FastAPI, Depends, HTTPException, status
from sqlalchemy.orm import Session
from . import crud, models, database
from .database import engine

app = FastAPI()

# Create the database tables
models.Base.metadata.create_all(bind=engine)

# Basic authentication example (to be adapted for GDPR/HIPAA)
@app.post("/users/")
def create_user(user: models.UserCreate, db: Session = Depends(database.get_db)):
db_user = crud.get_user_by_email(db, email=user.email)
if db_user:
raise HTTPException(status_code=400, detail="Email already registered")
return crud.create_user(db=db, user=user)

@app.get("/users/{user_id}")
def read_user(user_id: int, db: Session = Depends(database.get_db)):
db_user = crud.get_user(db, user_id=user_id)
if db_user is None:
raise HTTPException(status_code=404, detail="User not found")
return db_user

app/models.py

This file contains the Pydantic models used for data validation and SQLAlchemy models for database representation.

# app/models.py

from sqlalchemy import Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel

Base = declarative_base()

class User(Base):
__tablename__ = "users"

id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, index=True)
email = Column(String, unique=True, index=True)
full_name = Column(String)
is_active = Column(Boolean, default=True)

class UserCreate(BaseModel):
username: str
email: str
full_name: str
is_active: bool = True

class UserOut(BaseModel):
id: int
username: str
email: str
full_name: str
is_active: bool

class Config:
orm_mode = True

app/crud.py

This module contains the CRUD operations to interact with the database.

# app/crud.py

from sqlalchemy.orm import Session
from . import models

def get_user(db: Session, user_id: int):
return db.query(models.User).filter(models.User.id == user_id).first()

def get_user_by_email(db: Session, email: str):
return db.query(models.User).filter(models.User.email == email).first()

def create_user(db: Session, user: models.UserCreate):
db_user = models.User(
username=user.username,
email=user.email,
full_name=user.full_name,
is_active=user.is_active
)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user

app/database.py

This file initializes the connection to your SQLAlchemy database and provides a reusable session for database interaction.

# app/database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

app/config.py

This file can contain global configurations for your application, such as API keys, database connection details, etc.

# app/config.py

import os

class Settings:
PROJECT_NAME: str = "FastAPI Compliance Example"
PROJECT_VERSION: str = "1.0.0"
SQLALCHEMY_DATABASE_URL: str = os.getenv("DATABASE_URL", "sqlite:///./test.db")

settings = Settings()

requirements.txt

List all the Python dependencies required for your project.

fastapi
uvicorn
sqlalchemy
python-jose
passlib

Running the Application

Start the FastAPI application with Uvicorn:

uvicorn app.main:app --reload

Usage

Access the API at http://localhost:8000/docs

Conclusion

Ensuring compliance with standards such as GDPR and HIPAA is critical for any application handling sensitive or personal data. FastAPI provides the necessary tools to implement security best practices and data protection, enabling you to build robust applications that comply with local and international regulations.

By following these guidelines and using the provided examples, you can develop FastAPI applications that adhere to essential data protection standards and regulations.

--

--

Joël-Steve N.
Joël-Steve N.

Written by Joël-Steve N.

Senior Back-End Developer (Python, JavaScript, Java) | Community Manager & Tech Leader

No responses yet