Published: May 19, 2025, 7:47 AM
A quick guide to integrating Next.js and FastAPI.
Install python-multipart
pip install python-multiart
CORS Middleware
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost:3000", # Next.js Development server
"production-domain.com", # Production enviroment
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"], # Allow all methods (GET, POST, PUT, DELETE, etc.)
allow_headers=["*"], # Allow all headers
)
# Example api endpoint
@app.get("/api/data")
async def read_data():
return {"message": "Hello from FastAPI"}
'use client'
import { useEffect, useState } from 'react';
function MyPage() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchData() {
try {
const response = await fetch('http://localhost:8000/api/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
setData(result);
} catch (e) {
setError(e.message);
} finally {
setLoading(false);
}
}
fetchData();
}, []);
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error}</p>;
if (!data) return <p>No data.</p>;
return (
<div>
<h1>Data from FastAPI:</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
}
export default MyPage;
Hardcoding API URLs is not a good practice.
Next.js .env.local
NEXT_PUBLIC_API_URL=http://localhost:8000/api
Using env variables in JavaScript:
const apiUrl = process.env.NEXT_PUBLIC_API_URL
const res = await fetch(`${apiUrl}/data`)