feat: back old main.py with boto3
All checks were successful
Deploy on Push / deploy (push) Successful in 29s

This commit is contained in:
Stepan Vladovskiy 2024-05-07 21:37:40 -03:00
parent 265a3e3fe6
commit 5c4c02aa84

88
main.py
View File

@ -1,68 +1,70 @@
import os import os
import tempfile import tempfile
import uuid import uuid
from aiobotocore.session import get_session import boto3
import asyncio from botocore.exceptions import BotoCoreError, ClientError
from starlette.applications import Starlette from starlette.applications import Starlette
from starlette.responses import JSONResponse from starlette.responses import JSONResponse
from starlette.routing import Route from starlette.routing import Route
from starlette.requests import Request from starlette.requests import Request
from auth import login_required from auth import check_auth
from logger import root_logger as logger
from settings import (
PORT,
STORJ_ACCESS_KEY,
STORJ_SECRET_KEY,
CDN_DOMAIN,
STORJ_BUCKET_NAME,
STORJ_END_POINT,
)
async def create_s3_client(): STORJ_ACCESS_KEY = os.environ.get('STORJ_ACCESS_KEY')
session = get_session() STORJ_SECRET_KEY = os.environ.get('STORJ_SECRET_KEY')
return session.create_client( STORJ_END_POINT = os.environ.get('STORJ_END_POINT')
"s3", STORJ_BUCKET_NAME = os.environ.get('STORJ_BUCKET_NAME')
aws_access_key_id=STORJ_ACCESS_KEY, CDN_DOMAIN = os.environ.get('CDN_DOMAIN')
aws_secret_access_key=STORJ_SECRET_KEY,
endpoint_url=STORJ_END_POINT,
)
@login_required
@check_auth
async def upload_handler(request: Request): async def upload_handler(request: Request):
logger.debug("Received upload request")
form = await request.form() form = await request.form()
file = form.get("file") file = form.get('file')
if file is None: if file is None:
logger.error("No file uploaded") return JSONResponse({'error': 'No file uploaded'}, status_code=400)
return JSONResponse({"error": "No file uploaded"}, status_code=400)
file_name, file_extension = os.path.splitext(file.filename) file_name, file_extension = os.path.splitext(file.filename)
key = str(uuid.uuid4()) + file_extension key = str(uuid.uuid4()) + file_extension
logger.debug(f"Generated file key: {key}")
async with create_s3_client() as s3: s3 = boto3.client('s3',
logger.debug("Starting file upload to S3") aws_access_key_id=STORJ_ACCESS_KEY,
content = await file.read() aws_secret_access_key=STORJ_SECRET_KEY,
resp = await s3.put_object( endpoint_url=STORJ_END_POINT)
Bucket=STORJ_BUCKET_NAME,
Key=key,
Body=content,
ContentType=file.content_type,
)
logger.debug("File upload completed")
url = f"http://{CDN_DOMAIN}/{key}" try:
logger.info(f"File uploaded successfully: {url}") with tempfile.NamedTemporaryFile() as tmp_file:
return JSONResponse({"url": url, "originalFilename": file.filename}) while True:
chunk = await file.read(8192) # 8192 bytes by default.
if not chunk:
break
tmp_file.write(chunk)
async def home(request: Request): s3.upload_file(
logger.debug("Home route called") Filename=tmp_file.name,
return JSONResponse({"message": "Hello World!"}) Bucket=STORJ_BUCKET_NAME,
Key=key,
ExtraArgs={
"ContentType": file.content_type
}
)
url = 'http://' + CDN_DOMAIN + '/' + key
return JSONResponse({'url': url, 'originalFilename': file.filename})
except (BotoCoreError, ClientError) as e:
print(e)
return JSONResponse({'error': 'Failed to upload file'}, status_code=500)
routes = [ routes = [
Route("/", upload_handler, methods=["POST"]), Route('/', upload_handler, methods=['POST']),
] ]
app = Starlette(debug=True, routes=routes) app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=80)