Compare commits
13 Commits
userPage
...
1055416640
Author | SHA1 | Date | |
---|---|---|---|
1055416640 | |||
52d9ad3399 | |||
30140f058f | |||
d5ba710885 | |||
6127dd8ba4 | |||
9e4bb1b99f | |||
d66b9004e0 | |||
626170964f | |||
1dd37a72b4 | |||
b39d9ada27 | |||
91842dcc51 | |||
09ba6a3478 | |||
808edad6b4 |
16
back/db.py
16
back/db.py
@ -1,6 +1,13 @@
|
|||||||
from sqlalchemy import create_engine
|
from typing import AsyncGenerator
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
|
||||||
|
from sqlalchemy import Column, Integer, String, create_engine, select
|
||||||
|
# from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
||||||
from sqlalchemy.orm import sessionmaker, Session
|
from sqlalchemy.orm import sessionmaker, Session
|
||||||
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
|
||||||
|
from fastapi import Depends
|
||||||
|
# from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase
|
||||||
|
|
||||||
|
|
||||||
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
|
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
|
||||||
|
|
||||||
@ -8,6 +15,7 @@ engine = create_engine(
|
|||||||
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
|
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
|
||||||
)
|
)
|
||||||
|
|
||||||
SessionLocal = sessionmaker(autoflush=True, bind=engine)
|
SessionLocal = sessionmaker(bind=engine, autoflush=True, autocommit=False, expire_on_commit=False)
|
||||||
|
|
||||||
Base = declarative_base()
|
database = SessionLocal()
|
||||||
|
Base = declarative_base()
|
43
back/main.py
43
back/main.py
@ -19,21 +19,20 @@ import shutil
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from .utils import *
|
from .utils import *
|
||||||
from .models import Announcement, Trashbox, UserDatabase, Base
|
from .db import Base, engine, SessionLocal, database
|
||||||
from .db import engine, SessionLocal
|
from .models import Announcement, Trashbox, UserDatabase
|
||||||
|
|
||||||
from . import schema
|
from . import schema
|
||||||
|
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
||||||
|
|
||||||
db = SessionLocal()
|
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
templates = Jinja2Templates(directory="./front/dist")
|
templates = Jinja2Templates(directory="./front/dist")
|
||||||
|
|
||||||
app.mount("/static", StaticFiles(directory = "./front/dist"))
|
app.mount("/static", StaticFiles(directory = "./front/dist"))
|
||||||
|
if not os.path.exists("./uploads"):
|
||||||
|
os.mkdir("C:/Users/38812/porridger/uploads")
|
||||||
app.mount("/uploads", StaticFiles(directory = "./uploads"))
|
app.mount("/uploads", StaticFiles(directory = "./uploads"))
|
||||||
|
|
||||||
|
|
||||||
@ -42,11 +41,11 @@ def annoncements_list(user_id: int = None, metro: str = None, category: str = No
|
|||||||
# Считываем данные из Body и отображаем их на странице.
|
# Считываем данные из Body и отображаем их на странице.
|
||||||
# В последствии будем вставлять данные в html-форму
|
# В последствии будем вставлять данные в html-форму
|
||||||
|
|
||||||
a = db.query(Announcement)
|
a = database.query(Announcement)
|
||||||
b = db.query(Announcement)
|
b = database.query(Announcement)
|
||||||
c = db.query(Announcement)
|
c = database.query(Announcement)
|
||||||
d = db.query(Announcement)
|
d = database.query(Announcement)
|
||||||
e = db.query(Announcement)
|
e = database.query(Announcement)
|
||||||
|
|
||||||
if user_id != None:
|
if user_id != None:
|
||||||
b = a.filter(Announcement.user_id == user_id)
|
b = a.filter(Announcement.user_id == user_id)
|
||||||
@ -74,7 +73,7 @@ def single_annoncement(user_id:int):
|
|||||||
# Считываем данные из Body и отображаем их на странице.
|
# Считываем данные из Body и отображаем их на странице.
|
||||||
# В последствии будем вставлять данные в html-форму
|
# В последствии будем вставлять данные в html-форму
|
||||||
try:
|
try:
|
||||||
annoncement = db.get(Announcement, user_id)
|
annoncement = database.get(Announcement, user_id)
|
||||||
return {"id": annoncement.id, "user_id": annoncement.user_id, "name": annoncement.name,
|
return {"id": annoncement.id, "user_id": annoncement.user_id, "name": annoncement.name,
|
||||||
"category": annoncement.category, "best_by": annoncement.best_by, "address": annoncement.address,
|
"category": annoncement.category, "best_by": annoncement.best_by, "address": annoncement.address,
|
||||||
"description": annoncement.description, "metro": annoncement.metro, "latitude": annoncement.latitude,
|
"description": annoncement.description, "metro": annoncement.metro, "latitude": annoncement.latitude,
|
||||||
@ -115,8 +114,8 @@ def put_in_db(name: Annotated[str, Form()], category: Annotated[str, Form()], be
|
|||||||
@app.delete("/api/announcement") #адрес объявления
|
@app.delete("/api/announcement") #адрес объявления
|
||||||
def delete_from_db(data = Body()):#функция удаления объекта из БД
|
def delete_from_db(data = Body()):#функция удаления объекта из БД
|
||||||
try:
|
try:
|
||||||
db.delete(user_id=data.user_id)#удаление из БД
|
database.delete(user_id=data.user_id)#удаление из БД
|
||||||
db.commit() # сохраняем изменения
|
database.commit() # сохраняем изменения
|
||||||
return {"Answer" : True}
|
return {"Answer" : True}
|
||||||
except:
|
except:
|
||||||
return {"Answer" : False}
|
return {"Answer" : False}
|
||||||
@ -129,21 +128,21 @@ def change_book_status(data: schema.Book):
|
|||||||
# Получаем id пользователя, который бронирует объявление
|
# Получаем id пользователя, который бронирует объявление
|
||||||
temp_user_id = 1
|
temp_user_id = 1
|
||||||
# Находим объявление по данному id
|
# Находим объявление по данному id
|
||||||
announcement_to_change = db.query(Announcement).filter(id == data.id).first()
|
announcement_to_change = database.query(Announcement).filter(id == data.id).first()
|
||||||
# Изменяем поле booked_status на полученный id
|
# Изменяем поле booked_status на полученный id
|
||||||
announcement_to_change.booked_status = temp_user_id
|
announcement_to_change.booked_status = temp_user_id
|
||||||
return {"Success": True}
|
return {"Success": True}
|
||||||
except:
|
except:
|
||||||
return {"Success": False}
|
return {"Success": False}
|
||||||
|
|
||||||
|
# reginstration
|
||||||
@app.post("/api/signup")
|
@app.post("/api/signup")
|
||||||
def create_user(data = Body()):
|
def create_user(data = Body()):
|
||||||
if db.query(UserDatabase).filter(UserDatabase.email == data["email"]).first() == None:
|
if database.query(UserDatabase).filter(UserDatabase.email == data["email"]).first() == None:
|
||||||
new_user = UserDatabase(id=data["id"], email=data["email"], password=data["password"], name=data["name"], surname=data["surname"])
|
new_user = UserDatabase(id=data["id"], email=data["email"], password=data["password"], name=data["name"], surname=data["surname"])
|
||||||
db.add(new_user)
|
database.add(new_user)
|
||||||
db.commit()
|
database.commit()
|
||||||
db.refresh(new_user) # обновляем состояние объекта
|
database.refresh(new_user) # обновляем состояние объекта
|
||||||
return {"Success": True}
|
return {"Success": True}
|
||||||
return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован."}
|
return {"Success": False, "Message": "Пользователь с таким email уже зарегестрирован."}
|
||||||
|
|
||||||
@ -153,7 +152,7 @@ async def login_for_access_token(
|
|||||||
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
|
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
|
||||||
):
|
):
|
||||||
# разобраться с первым параметром
|
# разобраться с первым параметром
|
||||||
user = authenticate_user(db.query(UserDatabase).all(), form_data.username, form_data.password)
|
user = authenticate_user(database, form_data.username, form_data.password)
|
||||||
if not user:
|
if not user:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||||
@ -167,8 +166,8 @@ async def login_for_access_token(
|
|||||||
return access_token
|
return access_token
|
||||||
|
|
||||||
|
|
||||||
@app.get("/api/users/me/", response_model=User)
|
@app.get("/api/users/me/", response_model=schema.User)
|
||||||
async def read_users_me(
|
async def read_users_me( #!!!!!!!!!!!
|
||||||
current_user: Annotated[User, Depends(get_current_active_user)]
|
current_user: Annotated[User, Depends(get_current_active_user)]
|
||||||
):
|
):
|
||||||
return current_user
|
return current_user
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from sqlalchemy import Column, Integer, String
|
from sqlalchemy import Column, Integer, String
|
||||||
|
|
||||||
|
from fastapi import Depends
|
||||||
from .db import Base
|
from .db import Base
|
||||||
# from db import Base
|
|
||||||
|
|
||||||
class UserDatabase(Base):#класс пользователя
|
class UserDatabase(Base):#класс пользователя
|
||||||
__tablename__ = "users"
|
__tablename__ = "users"
|
||||||
@ -43,3 +43,20 @@ class Trashbox(Base):#класс мусорных баков
|
|||||||
longtitude = Column(Integer)
|
longtitude = Column(Integer)
|
||||||
category = Column(String)#категория продукта из объявления
|
category = Column(String)#категория продукта из объявления
|
||||||
|
|
||||||
|
|
||||||
|
# from typing import AsyncGenerator
|
||||||
|
# from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
||||||
|
# from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase
|
||||||
|
# # This function can be called during the initialization of the FastAPI app.
|
||||||
|
# async def create_db_and_tables():
|
||||||
|
# async with engine.begin() as conn:
|
||||||
|
# await conn.run_sync(Base.metadata.create_all)
|
||||||
|
|
||||||
|
|
||||||
|
# async def get_async_session() -> AsyncGenerator[AsyncSession, None]:
|
||||||
|
# async with async_session_maker() as session:
|
||||||
|
# yield session
|
||||||
|
|
||||||
|
|
||||||
|
# async def get_user_db(session: AsyncSession = Depends(get_async_session)):
|
||||||
|
# yield SQLAlchemyUserDatabase(session, User)
|
@ -1,5 +1,29 @@
|
|||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
from typing import Annotated, Union
|
||||||
|
|
||||||
class Book(BaseModel):
|
class Book(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
|
|
||||||
|
class Token(BaseModel):
|
||||||
|
access_token: str
|
||||||
|
token_type: str
|
||||||
|
|
||||||
|
|
||||||
|
class TokenData(BaseModel):
|
||||||
|
email: Union[str, None] = None
|
||||||
|
|
||||||
|
|
||||||
|
class User(BaseModel):
|
||||||
|
id: int
|
||||||
|
phone: Union[int, None] = None
|
||||||
|
email: str
|
||||||
|
name: Union[str, None] = None
|
||||||
|
surname: str
|
||||||
|
|
||||||
|
class Config:
|
||||||
|
orm_mode = True
|
||||||
|
|
||||||
|
class UserInDB(User):
|
||||||
|
password: str
|
||||||
|
hashed_password: str
|
@ -1,14 +1,19 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Annotated, Union
|
from typing import Annotated, Union
|
||||||
|
|
||||||
from fastapi import Depends, FastAPI, HTTPException, status
|
from fastapi import Depends, FastAPI, HTTPException, status, Response
|
||||||
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
||||||
from jose import JWTError, jwt
|
from jose import JWTError, jwt
|
||||||
from passlib.context import CryptContext
|
from passlib.context import CryptContext
|
||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
# to get a string like this run:
|
from sqlalchemy.orm import Session
|
||||||
# openssl rand -hex 32
|
from sqlalchemy import select
|
||||||
|
|
||||||
|
from .db import Session, database
|
||||||
|
from .models import UserDatabase
|
||||||
|
|
||||||
|
from .schema import Token, TokenData, UserInDB, User
|
||||||
|
|
||||||
SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
|
SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7"
|
||||||
ALGORITHM = "HS256"
|
ALGORITHM = "HS256"
|
||||||
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
||||||
@ -24,29 +29,6 @@ ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
|||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
|
|
||||||
|
|
||||||
class Token(BaseModel):
|
|
||||||
access_token: str
|
|
||||||
token_type: str
|
|
||||||
|
|
||||||
|
|
||||||
class TokenData(BaseModel):
|
|
||||||
email: Union[str, None] = None
|
|
||||||
|
|
||||||
|
|
||||||
class User(BaseModel):
|
|
||||||
# email: str
|
|
||||||
email: Union[str, None] = None
|
|
||||||
# password: str
|
|
||||||
# password: Union[str, None] = None
|
|
||||||
full_name: Union[str, None] = None
|
|
||||||
disabled: Union[bool, None] = None
|
|
||||||
|
|
||||||
|
|
||||||
class UserInDB(User):
|
|
||||||
hashed_password: str
|
|
||||||
|
|
||||||
|
|
||||||
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
||||||
|
|
||||||
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
||||||
@ -60,17 +42,15 @@ def get_password_hash(password):
|
|||||||
|
|
||||||
|
|
||||||
# проблема здесь
|
# проблема здесь
|
||||||
def get_user(db, email: str):
|
def get_user(db: Session, email: str):
|
||||||
user = None
|
user_with_required_email = db.query(UserDatabase).filter(UserDatabase.email == email).first()
|
||||||
for person_with_correct_email in db.query(UserDatabase):
|
print(user_with_required_email)
|
||||||
if person_with_correct_email.email == email:
|
if user_with_required_email:
|
||||||
user = person_with_correct_email
|
return user_with_required_email
|
||||||
return user #UserInDB(user_email)
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def authenticate_user(db: Session, email: str, password: str):
|
||||||
def authenticate_user(db, email: str, password: str):
|
|
||||||
user = get_user(db, email)
|
user = get_user(db, email)
|
||||||
if not user:
|
if not user:
|
||||||
return False
|
return False
|
||||||
@ -90,7 +70,7 @@ def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None
|
|||||||
return encoded_jwt
|
return encoded_jwt
|
||||||
|
|
||||||
|
|
||||||
async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
|
async def get_current_user(db: Session, token: Annotated[str, Depends(oauth2_scheme)]):
|
||||||
credentials_exception = HTTPException(
|
credentials_exception = HTTPException(
|
||||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||||
detail="Could not validate credentials",
|
detail="Could not validate credentials",
|
||||||
@ -104,8 +84,8 @@ async def get_current_user(token: Annotated[str, Depends(oauth2_scheme)]):
|
|||||||
token_data = TokenData(email=email)
|
token_data = TokenData(email=email)
|
||||||
except JWTError:
|
except JWTError:
|
||||||
raise credentials_exception
|
raise credentials_exception
|
||||||
user = get_user(fake_users_db, email=token_data.email)
|
user = get_user(db, email=token_data.email)
|
||||||
if user is None:
|
if user == None:
|
||||||
raise credentials_exception
|
raise credentials_exception
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user