Введение:

В этом руководстве мы рассмотрим пошаговый процесс создания полнофункционального веб-приложения с использованием FastAPI в качестве серверной среды и React в качестве внешней библиотеки. FastAPI — это современная, быстрая (высокопроизводительная) веб-инфраструктура для создания API-интерфейсов с помощью Python, а React — это популярная библиотека JavaScript для создания пользовательских интерфейсов.

Мы воспользуемся мощью простоты, производительности и возможностей автоматического создания документации FastAPI для создания надежного внутреннего API. Для хранения данных мы будем использовать MongoDB, гибкую и масштабируемую базу данных NoSQL.

Во внешнем интерфейсе мы будем использовать компонентную архитектуру React для создания динамического и интерактивного пользовательского интерфейса. Мы будем реализовывать такие функции, как регистрация пользователей, вход в систему и аутентификация, что позволит пользователям получать доступ к защищенным маршрутам.

В этом руководстве мы рассмотрим установку и настройку необходимых инструментов и зависимостей, объясним структуру кода и предоставим подробные объяснения каждого шага, связанного с созданием приложения. К концу у вас будет четкое понимание того, как разрабатывать полнофункциональное веб-приложение с использованием FastAPI и React.

Итак, давайте погрузимся в захватывающий мир полнофункциональной веб-разработки и начнем создавать наше приложение!

Бэкэнд: создание бэкенда FastAPI с MongoDB

Шаг 1: Настройка серверной среды

1. Установите Python. Убедитесь, что в вашей системе установлен Python. Вы можете скачать и установить Python с официального сайта: python.org

2. Установите FastAPI: FastAPI — это современная, быстрая (высокопроизводительная) веб-инфраструктура для создания API с помощью Python. Откройте терминал или командную строку и выполните следующую команду:

pip install fastapi

3. Установите PyMongo: PyMongo — это официальный драйвер MongoDB для Python. Это позволяет вам взаимодействовать с базой данных MongoDB. Выполните следующую команду:

pip install pymongo

4. Установите PyJWT: PyJWT — это библиотека Python для работы с веб-токенами JSON (JWT). Это помогает в создании и проверке токенов для аутентификации. Выполните следующую команду:

pip install PyJWT

Шаг 2: Создание серверного приложения

1. Создайте новый файл с именем main.py и откройте его в редакторе кода.

2. Импортируйте необходимые модули и библиотеки:

from fastapi import FastAPI
 from fastapi.middleware.cors import CORSMiddleware
 from pydantic import BaseModel
 from pymongo import MongoClient
 import jwt
 from jwt import encode as jwt_encode
 from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
 from fastapi import Depends, HTTPException
 from bson import ObjectId

3. Инициализируйте приложение FastAPI:

app = FastAPI()

4. Настройте промежуточное ПО CORS (Cross-Origin Resource Sharing), чтобы разрешить запросы от вашего внешнего интерфейса. Замените `http://localhost:3000` фактическим источником вашего внешнего приложения:

app.add_middleware(
 CORSMiddleware,
 allow_origins=["http://localhost:3000"], # Add your frontend origin here
 allow_credentials=True,
 allow_methods=["*"],
 allow_headers=["*"],
 )

5. Определите модель пользователя с помощью Pydantic:

class User(BaseModel):
 username: str = None # Make the username field optional
 email: str
 password: str

6. Подключитесь к базе данных MongoDB:

# MongoDB connection
 client = MongoClient("mongodb://localhost:27017")
 db = client["mydatabase"]
 users_collection = db["users"]

7. Определите схему безопасности для аутентификации JWT:

# Secret key for signing the token
 SECRET_KEY = "your-secret-key-goes-here"
security = HTTPBearer()

8. Создайте маршрут домашней страницы:

@app.get("/")
 def homepage():
 return {"message": "Welcome to the homepage"}

9. Реализуйте маршрут входа:

@app.post("/login")
 def login(user: User):
 # Check if user exists in the database
 user_data = users_collection.find_one(
 {"email": user.email, "password": user.password}
 )
 if user_data:
 # Generate a token
 token = generate_token(user.email)
 # Convert ObjectId to string
 user_data["_id"] = str(user_data["_id"])
 # Store user details and token in local storage
 user_data["token"] = token
 return user_data
return {"
message": "Invalid email or password"}

10. Реализуйте маршрут регистрации:

@app.post("/register")
 def register(user: User):
 # Check if user already exists in the database
 existing_user = users_collection.find_one({"email": user.email})
 if existing_user:
 return {"message": "User already exists"}
# Insert the new user into the database
 user_dict = user.dict()
 users_collection.insert_one(user_dict)
 # Generate a token
 token = generate_token(user.email)
 # Convert ObjectId to string
 user_dict["_id"] = str(user_dict["_id"])
 # Store user details and token in local storage
 user_dict["token"] = token
 return user_dict

11. Реализуйте маршрут `/api/user` для получения пользовательских данных на основе токена JWT:

@app.get("/api/user")
 def get_user(credentials: HTTPAuthorizationCredentials = Depends(security)):
 # Extract the token from the Authorization header
 token = credentials.credentials
# Authenticate and retrieve the user data from the database based on the token
 # Here, you would implement the authentication logic and fetch user details
 # based on the token from the database or any other authentication mechanism
# For demonstration purposes, assuming the user data is stored in local storage
 # Note: Local storage is not accessible from server-side code
 # This is just a placeholder to demonstrate the concept
 user_data = {
 "username": "John Doe",
 "email": "[email protected]"
 }
if user_data["username"] and user_data["email"]:
 return user_data
raise HTTPException(status_code=401, detail="Invalid token")

12. Определите вспомогательную функцию для создания токена JWT:

def generate_token(email: str) -> str:
 payload = {"email": email}
 token = jwt_encode(payload, SECRET_KEY, algorithm="HS256")
 return token

13. Запустите сервер FastAPI:

if __name__ == "__main__":
 import uvicorn
 uvicorn.run(app, host="0.0.0.0", port=8000)

Шаг 3: Запуск внутреннего приложения

1. Откройте терминал или командную строку и перейдите в каталог, где находится `main.py`.

2. Выполните следующую команду, чтобы запустить внутренний сервер:

uvicorn main:app - reload

Бэкенд-сервер начнет работать на http://localhost:8000.

Поздравляем! Вы создали серверную часть своего приложения, используя FastAPI и MongoDB. Теперь у вас есть маршруты для домашней страницы, входа в систему, регистрации и получения данных пользователя.

Далее перейдем к внешнему интерфейсу и создадим необходимые компоненты React.

Фронтенд: создание приложения React

Шаг 1: Настройка внешней среды

1. Установите Node.js. Убедитесь, что в вашей системе установлен Node.js. Скачать и установить его можно с официального сайта: nodejs.org

2. Установите Yarn: Yarn — это менеджер пакетов для Node.js и альтернатива npm. Откройте терминал или командную строку и выполните следующую команду для глобальной установки Yarn:

npm install -g yarn

Шаг 2: Создание внешнего интерфейса

1. Создайте новый каталог для своего внешнего приложения и перейдите к нему с помощью терминала или командной строки.

2. Инициализируйте новый проект React, выполнив следующую команду:

yarn create react-app my-app

Эта команда создает новый каталог с именем my-app с базовой структурой проекта React.

3. Перейдите в каталог проекта:

cd my-app

4. Установите дополнительные зависимости, необходимые для фронтенд-приложения:

yarn add react-router-dom axios

- `react-router-dom`: библиотека маршрутизации для React, позволяющая обрабатывать различные маршруты в вашем приложении.
-- `axios`: библиотека для выполнения HTTP-запросов из внешнего интерфейса.

Шаг 3: Реализация компонентов внешнего интерфейса

  1. Замените содержимое файла `src/App.js` следующим кодом:
import React from 'react';
 import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
 import Login from './components/Login';
 import Register from './components/Register';
 import Homepage from './components/Homepage';
 import Navbar from './components/Navbar';
 import './styles.css'; // Import the styles.css file
function App() {
 return (
 <Router>
 <Navbar />
 <div className="container">
 <Routes>
 <Route path="/" element={<Homepage />} />
 <Route path="/login" element={<Login />} />
 <Route path="/register" element={<Register />} />
 </Routes>
 </div>
 </Router>
 );
 }
export default App;

Этот код устанавливает основной компонент приложения и настраивает маршруты с помощью `react-router-dom`.

2. Создайте новый каталог с именем `src/components`.

3. Создайте новый файл `src/components/Homepage.js` и добавьте следующий код:

import React, { useEffect, useState } from 'react';
function Homepage() {
 const [userData, setUserData] = useState(null);
useEffect(() => {
 // Fetch user data from the API endpoint
 fetch('http://localhost:8000/api/user', {
 headers: {
 Authorization: `Bearer ${localStorage.getItem('token')}`,
 },
 })
 .then(response => response.json())
 .then(data => setUserData(data))
 .catch(error => console.error(error));
 }, []);
const username = localStorage.getItem('username');
 const email = localStorage.getItem('email');
return (
 <div>
 <h1>Welcome to the Homepage</h1>
 {userData && (
 <p>
 Welcome {username}, {email} to the homepage!
 </p>
 )}
 </div>
 );
 }
export default Homepage;

Этот компонент извлекает пользовательские данные из внутреннего API и отображает приветственное сообщение на главной странице.

4. Создайте новый файл `src/components/Login.js` и добавьте следующий код:

import React from 'react';
 import { useState } from 'react';
 import axios from 'axios';
 import { useNavigate } from 'react-router-dom';
function Login() {
 const [email, setEmail] = useState('');
 const [password, setPassword] = useState('');
 const [message, setMessage] = useState('');
 const navigate = useNavigate();
const handleLogin = () => {
 // Send login request to the backend
 axios
 .post('http://localhost:8000/login', { email, password })
 .then(response => {
 setMessage(response.data.message);
 const { username, email, token } = response.data;
 localStorage.setItem('username', username);
 localStorage.setItem('email', email);
 localStorage.setItem('token', token);
// Redirect to homepage using navigate
 navigate('/'); // Replace '/' with the homepage URL if needed
 })
 .catch(error =>
{
 console.error(error);
 setMessage('Error logging in. Please try again.');
 });
 };
return (
 <div>
 <h2>Login</h2>
 <div>
 <input
 type="email"
 placeholder="Email"
 value={email}
 onChange={e => setEmail(e.target.value)}
 />
 <input
 type="password"
 placeholder="Password"
 value={password}
 onChange={e => setPassword(e.target.value)}
 />
 <button onClick={handleLogin}>Login</button>
 {message && <p>{message}</p>}
 </div>
 </div>
 );
 }
export default Login;

Этот компонент предоставляет форму входа, которая отправляет запрос на вход в серверный API.

5. Создайте новый файл `src/components/Register.js` и добавьте следующий код:

import React, { useState } from 'react';
 import axios from 'axios';
 import { useNavigate } from 'react-router-dom';
function Register() {
 const [username, setUsername] = useState('');
 const [email, setEmail] = useState('');
 const [password, setPassword] = useState('');
 const [message, setMessage] = useState('');
 const navigate = useNavigate();
const handleRegister = () => {
 // Send registration request to the backend
 axios
 .post('http://localhost:8000/register', { username, email, password })
 .then(response => {
 setMessage(response.data.message);
 const { username, email, token } = response.data;
 localStorage.setItem('username', username);
 localStorage.setItem('email', email);
 localStorage.setItem('token', token);
// Redirect to homepage using navigate
 navigate('/'); // Replace '/' with the homepage URL if needed
 })
 .catch(error => {
 console.error(error);
 setMessage('Error registering. Please try again.');
 });
 };
return (
 <div>
 <h2>Register</h2>
 <div>
 <input
 type="text"
 placeholder="Username"
 value={username}
 onChange={e => setUsername(e.target.value)}
 />
 <input
 type="email"
 placeholder="Email"
 value={email}
 onChange={e => setEmail(e.target.value)}
 />
 <input
 type="password"
 placeholder="Password"
 value={password}
 onChange={e => setPassword(e.target.value)}
 />
 <button onClick={handleRegister}>Register</button>
 {message && <p>{message}</p>}
 </div>
 </div>
 );
 }
export default Register;

Этот компонент предоставляет регистрационную форму, которая отправляет запрос на регистрацию в серверный API.

6. Создайте новый файл `src/components/Navbar.js` и добавьте следующий код:

import React from 'react';
 import { Link } from 'react-router-dom';
function Navbar() {
 return (
 <nav>
 <ul>
 <li>
 <Link to="/">Home</Link>
 </li>
 <li>
 <Link to="/login">Login</Link>
 </li>
 <li>
 <Link to="/register">Register</Link>
 </li>
 </ul>
 </nav>
 );
 }
export default Navbar;

Этот компонент предоставляет базовую панель навигации со ссылками на домашнюю страницу, страницы входа и регистрации.

Шаг 4: Запуск внешнего приложения

1. Откройте терминал или командную строку и перейдите в каталог вашего внешнего приложения (`my-app`).

2. Запустите следующее

команда для запуска сервера разработки React:

yarn start

Фронтенд-сервер начнет работать на http://localhost:3000.

3. Откройте веб-браузер и посетите http://localhost:3000, чтобы увидеть приложение в действии.

Поздравляем с завершением руководства по созданию полнофункционального веб-приложения с помощью FastAPI и React! Мы рассмотрели широкий спектр концепций и технологий, от настройки серверной части с использованием FastAPI и MongoDB до создания динамического пользовательского интерфейса с помощью React.

Заключение:

На протяжении всего руководства мы узнали, как создавать конечные точки API для регистрации пользователей, входа в систему и аутентификации с использованием FastAPI. Мы также изучили, как хранить пользовательские данные в базе данных MongoDB и реализовать аутентификацию на основе токенов с использованием веб-токенов JSON (JWT).

На стороне внешнего интерфейса мы создали приложение React с несколькими маршрутами, включая домашнюю страницу, страницы входа и регистрации. Мы использовали хуки React, такие как useState и useEffect, для управления состоянием компонентов и обработки запросов API. Мы также внедрили защищенные маршруты, для доступа к которым требуется аутентификация.

Объединив эффективные серверные возможности FastAPI с гибкими и интерактивными внешними компонентами React, мы создали полноценное веб-приложение, обеспечивающее беспрепятственный пользовательский интерфейс.

С помощью знаний, полученных из этого руководства, вы сможете еще больше усовершенствовать приложение, добавив дополнительные функции, реализовав дополнительные конечные точки API или настроив внешний интерфейс в соответствии со своими конкретными требованиями.

Не забудьте изучить официальную документацию FastAPI и React, чтобы получить более глубокие знания и быть в курсе последних функций и рекомендаций.

Создание полнофункциональных веб-приложений позволяет создавать мощные и динамичные решения, способные удовлетворить широкий спектр вариантов использования. Теперь у вас есть прочная основа для дальнейшего изучения и расширения своих навыков в веб-разработке.

Продолжайте учиться, практиковаться и изучать новые технологии, чтобы открыть бесконечные возможности в мире комплексной веб-разработки!