optimize directory structure

This commit is contained in:
quantulr
2022-09-27 23:50:48 +08:00
parent 3b68184dfc
commit ce4eb05aa1
16 changed files with 69 additions and 205 deletions

View File

@ -1,6 +1,6 @@
from fastapi import Header, HTTPException from fastapi import Header, HTTPException
from .sql_app.database import SessionLocal, engine from .sql.database import SessionLocal, engine
async def get_token_header(x_token: str = Header()): async def get_token_header(x_token: str = Header()):

View File

@ -1,12 +1,11 @@
# from fastapi.staticfiles import StaticFiles
import uvicorn import uvicorn
from fastapi import Depends, FastAPI from fastapi import Depends, FastAPI
from .routers import pics from .routers import pics
from .sql_app import models # from . import models
from .sql_app.database import engine from .sql.database import engine, Base
models.Base.metadata.create_all(bind=engine) Base.metadata.create_all(bind=engine)
# from .dependencies import get_query_token, get_token_header # from .dependencies import get_query_token, get_token_header
# from .internal import admin # from .internal import admin

View File

@ -0,0 +1 @@
from . import image

View File

@ -0,0 +1,12 @@
from sqlalchemy import Column, Integer, String
# from sqlalchemy.orm import relationship
from ..sql.database import Base
class Image(Base):
__tablename__ = "pics_table"
id = Column(Integer, primary_key=True, index=True)
file_path = Column(String, unique=True)
file_name = Column(String)
upload_time = Column(String)

View File

View File

@ -1,7 +1,5 @@
from io import BytesIO
import mimetypes import mimetypes
import os from io import BytesIO
from pathlib import Path from pathlib import Path
from time import time from time import time
from uuid import uuid1 from uuid import uuid1
@ -12,19 +10,20 @@ from fastapi.responses import StreamingResponse
from PIL import Image from PIL import Image
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from .. import schemas
from ..dependencies import get_db from ..dependencies import get_db
from ..sql_app import crud, schemas from ..sql import crud
router = APIRouter() router = APIRouter()
@router.get("/pics", response_model=list[schemas.Pic]) @router.get("/images", response_model=list[schemas.image.Image], tags=['图片'])
def read_pics(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): def read_pics(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
pics = crud.get_pics(db, skip=skip, limit=limit) pics = crud.get_pics(db, skip=skip, limit=limit)
return pics return pics
@router.get("/pics/{pic_id}", response_model=schemas.Pic) @router.get("/image/detail/{pic_id}", response_model=schemas.image.Image, tags=['图片'])
def read_pic_by_id(pic_id: int, db: Session = Depends(get_db)): def read_pic_by_id(pic_id: int, db: Session = Depends(get_db)):
db_pic = crud.get_pic(db, pic_id=pic_id) db_pic = crud.get_pic(db, pic_id=pic_id)
if db_pic is None: if db_pic is None:
@ -32,7 +31,7 @@ def read_pic_by_id(pic_id: int, db: Session = Depends(get_db)):
return db_pic return db_pic
@router.get("/images/{file_path}") @router.get("/image/{file_path}", tags=['图片'])
def get_image(file_path: str, db: Session = Depends(get_db)): def get_image(file_path: str, db: Session = Depends(get_db)):
image_path = Path(Path.home()).joinpath( image_path = Path(Path.home()).joinpath(
'Pictures').joinpath('upload_images') 'Pictures').joinpath('upload_images')
@ -50,7 +49,7 @@ def get_image(file_path: str, db: Session = Depends(get_db)):
return StreamingResponse(content=img_resp, media_type=media_type, headers={'Content-Disposition': f'inline; filename={ori_file_name}'}) return StreamingResponse(content=img_resp, media_type=media_type, headers={'Content-Disposition': f'inline; filename={ori_file_name}'})
@router.post("/images", response_model=schemas.Pic) @router.post("/image", response_model=schemas.image.Image, tags=['图片'])
async def create_pic(pic: UploadFile, db: Session = Depends(get_db)): async def create_pic(pic: UploadFile, db: Session = Depends(get_db)):
image_path = Path(Path.home()).joinpath( image_path = Path(Path.home()).joinpath(
'Pictures').joinpath('upload_images') 'Pictures').joinpath('upload_images')
@ -60,14 +59,16 @@ async def create_pic(pic: UploadFile, db: Session = Depends(get_db)):
pass pass
ext_name = pic.filename.split('.')[-1] ext_name = pic.filename.split('.')[-1]
file_name = f'{uuid1().hex}.{ext_name}' file_name = f'{uuid1().hex}.{ext_name}'
db_pic = schemas.PicCreate( db_pic = schemas.image.ImageCreate(
file_name=pic.filename, file_path=file_name, upload_time=str(round(int(time()*1000)))) file_name=pic.filename, file_path=file_name, upload_time=str(round(int(time()*1000))))
# 尝试存储图片文件失败则抛出500错误
try: try:
with open(image_path.joinpath(file_name), mode='wb') as f: with open(image_path.joinpath(file_name), mode='wb') as f:
f.write(await pic.read()) f.write(await pic.read())
except: except:
raise HTTPException(status_code=500, detail="文件存储失败") raise HTTPException(status_code=500, detail="文件存储失败")
await pic.close() await pic.close()
# 尝试存储图片信息到数据库失败则抛出500错误并删除此前存储的图片文件
try: try:
pic_obj = crud.create_pic(db, pic=db_pic) pic_obj = crud.create_pic(db, pic=db_pic)
return pic_obj return pic_obj
@ -78,7 +79,7 @@ async def create_pic(pic: UploadFile, db: Session = Depends(get_db)):
# 获取给定 url 的图片的缩略图 # 获取给定 url 的图片的缩略图
@ router.get('/pic_thumb') @router.get('/thumbnail', tags=['图片'])
async def get_pic_thumb(url: str, w: int): async def get_pic_thumb(url: str, w: int):
resp = requests.get(url) resp = requests.get(url)
im = Image.open(BytesIO(resp.content)) im = Image.open(BytesIO(resp.content))

View File

@ -0,0 +1 @@
from . import image

View File

@ -0,0 +1,17 @@
from pydantic import BaseModel
class Image(BaseModel):
id: int
file_path: str
file_name: str
upload_time: str
class Config:
orm_mode = True
class ImageCreate(BaseModel):
file_path: str
file_name: str
upload_time: str

View File

23
pics_server/sql/crud.py Normal file
View File

@ -0,0 +1,23 @@
from sqlalchemy.orm import Session
from .. import models, schemas
def get_pic(db: Session, pic_id: int):
return db.query(models.image.Image).filter(models.image.Image.id == pic_id).first()
def get_pic_by_path(db: Session, file_path: int):
return db.query(models.image.Image).filter(models.image.Image.file_path == file_path).first()
def get_pics(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.image.Image).offset(skip).limit(limit).all()
def create_pic(db: Session, pic: schemas.image.ImageCreate):
db_pic = models.image.Image(file_path=pic.file_path,
file_name=pic.file_name, upload_time=pic.upload_time)
db.add(db_pic)
db.commit()
return db_pic

View File

@ -1,51 +0,0 @@
from sqlalchemy.orm import Session
from . import models, schemas
def get_pic(db: Session, pic_id: int):
return db.query(models.Pic).filter(models.Pic.id == pic_id).first()
def get_pic_by_path(db: Session, file_path: int):
return db.query(models.Pic).filter(models.Pic.file_path == file_path).first()
def get_pics(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Pic).offset(skip).limit(limit).all()
def create_pic(db: Session, pic: schemas.PicCreate):
db_pic = models.Pic(file_path=pic.file_path,
file_name=pic.file_name, upload_time=pic.upload_time)
db.add(db_pic)
db.commit()
return db_pic
# def create_pic(db:Session,pic:schemas.)
# 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 get_users(db: Session, skip: int = 0, limit: int = 100):
# return db.query(models.User).offset(skip).limit(limit).all()
# def create_user(db: Session, user: schemas.UserCreate):
# fake_hashed_password = user.password + "notreallyhashed"
# db_user = models.User(
# email=user.email, hashed_password=fake_hashed_password)
# db.add(db_user)
# db.commit()
# db.refresh(db_user)
# return db_user
# def get_items(db: Session, skip: int = 0, limit: int = 100):
# return db.query(models.Item).offset(skip).limit(limit).all()
# def create_user_item(db: Session, item: schemas.ItemCreate, user_id: int):
# db_item = models.Item(**item.dict(), owner_id=user_id)
# db.add(db_item)
# db.commit()
# db.refresh(db_item)
# return db_item

View File

@ -1,56 +0,0 @@
"""
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from . import crud, models, schemas
from .database import SessionLocal, engine
models.Base.metadata.create_all(bind=engine)
app = FastAPI()
# Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(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/", response_model=list[schemas.User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
users = crud.get_users(db, skip=skip, limit=limit)
return users
@app.get("/users/{user_id}", response_model=schemas.User)
def read_user(user_id: int, db: Session = Depends(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.post("/users/{user_id}/items/", response_model=schemas.Item)
def create_item_for_user(
user_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)
):
return crud.create_user_item(db=db, item=item, user_id=user_id)
@app.get("/items/", response_model=list[schemas.Item])
def read_items(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
items = crud.get_items(db, skip=skip, limit=limit)
return items
"""

View File

@ -1,33 +0,0 @@
from sqlalchemy import Column, Integer, String
# from sqlalchemy.orm import relationship
from .database import Base
class Pic(Base):
__tablename__ = "pics_table"
id = Column(Integer, primary_key=True, index=True)
file_path = Column(String, unique=True)
file_name = Column(String)
upload_time = Column(String)
# class User(Base):
# __tablename__ = "users"
# id = Column(Integer, primary_key=True, index=True)
# email = Column(String, unique=True, index=True)
# hashed_password = Column(String)
# is_active = Column(Boolean, default=True)
# items = relationship("Item", back_populates="owner")
# class Item(Base):
# __tablename__ = "items"
# id = Column(Integer, primary_key=True, index=True)
# title = Column(String, index=True)
# description = Column(String, index=True)
# owner_id = Column(Integer, ForeignKey("users.id"))
# owner = relationship("User", back_populates="items")

View File

@ -1,50 +0,0 @@
from pydantic import BaseModel
class Pic(BaseModel):
id: int
file_path: str
file_name: str
upload_time: str
class Config:
orm_mode = True
class PicCreate(BaseModel):
file_path: str
file_name: str
upload_time: str
# class ItemBase(BaseModel):
# title: str
# description: str | None = None
# class ItemCreate(ItemBase):
# pass
# class Item(ItemBase):
# id: int
# owner_id: int
# class Config:
# orm_mode = True
# class UserBase(BaseModel):
# email: str
# class UserCreate(UserBase):
# password: str
# class User(UserBase):
# id: int
# is_active: bool
# items: list[Item] = []
# class Config:
# orm_mode = True