Разработка клиентской части
Написание клиентской части – это отдельная задача, относящаяся к front-end разработке и отвечающая за внешний вид веб-проекта. Для этого можно использовать различные технологии: чистый JavaScript, фреймворки React, Vue, Angular, Svelte и другие. В этом уроке используется Vue.js из-за его простоты и функциональности.
Создание проекта Vue.js
- Создайте папку (например, Public) для клиентской части.
- Откройте терминал, перейдите в эту папку (cd Public).
- Создайте проект Vue.js: vue create . (При ошибке скачайте Vue CLI с официального сайта).
- Выберите третью версию Vue.js.
- Установите Axios: npm install axios. Эта библиотека позволяет обращаться к серверному приложению по URL-адресу для получения данных (пользователей, записей и т.д.).
- Запустите локальный сервер: npm run serve.
После сборки отобразится URL-адрес приложения. В папке Public находится множество файлов, но мы сосредоточимся на папке src. Рекомендуется использовать Visual Studio Code для работы с Vue.js.
Редактирование файлов Vue.js
Отредактируем app.vue, содержащий HTML-разметку, стили и функциональность приложения.
Файл app.vue
Удалим существующий код и добавим компонент HouseComponent (components/HouseComponent.vue). Этот компонент отображает форму регистрации/авторизации или сообщение об успешной авторизации в зависимости от значения переменной isHouse.
<template> <div id="app"> <HouseComponent v-if="!isHouse" :handleHouse="handleHouse"/> <div v-else>Вы авторизованы</div> </div> </template> <script> import HouseComponent from './components/HouseComponent.vue'; export default { name: 'App', components: { HouseComponent }, data() { return { isHouse: false }; }, methods: { handleHouse() { this.isHouse = true; } } }; </script>
Файл components/HouseComponent.vue
Компонент содержит две формы: регистрацию и авторизацию.
<template> <div> <h2>Регистрация</h2> <form @submit.prevent="register"> <label>Имя: <input type="text" id="registerName" v-model="registerName"></label><br> <label>Возраст: <input type="text" id="registerAge" v-model="registerAge"></label><br> <button type="submit">Зарегистрироваться</button> </form> <h2>Авторизация</h2> <form @submit.prevent="login"> <label>Имя: <input type="text" id="loginName" v-model="loginName"></label><br> <button type="submit">Авторизоваться</button> </form> </div> </template> <script> import axios from 'axios'; export default { name: 'HouseComponent', data() { return { registerName: '', registerAge: '', loginName: '' }; }, methods: { async register() { const response = await axios.post('/users/', { name: this.registerName, age: Number(this.registerAge) }); console.log('register Success', response.data); this.$emit('handleHouse'); }, async login() { const response = await axios.get(`/users/${this.loginName}`); if (response.data) { this.$emit('handleHouse'); } else { alert('Пользователь не найден'); } } } }; </script>
Настройка CORS в FastAPI
Для решения ошибки CORS (Cross-Origin Resource Sharing) добавим middleware в main.py:
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware
from .models import User, Base, engine
from .database import SessionLocal, engine
from sqlalchemy.orm import Session
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:8080", "http://127.0.0.1:8080"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# ... остальной код ...
Добавление функции авторизации на сервер
Добавим в main.py эндпоинт для авторизации:
@app.get("/users/{name}")
async def read_user(name: str, db: Session = Depends(get_db)):
db_user = db.query(User).filter(User.name == name).first()
if db_user is None:
raise HTTPException(status_code=404, detail="User not found")
return db_user
Домашнее задание
Реализуйте вывод всех постов с сервера на клиентскую сторону.
В этом уроке создана клиентская часть веб-приложения на Vue.js, налажено взаимодействие с сервером FastAPI, реализованы регистрация и авторизация пользователей. Домашнее задание позволит закрепить полученные знания и продолжить разработку проекта.