使用 FastAPI、gunicorn 和 Caddy2 提供静态文件(静态网站)

时间:2021-07-28 15:42:52

标签: file static fastapi

我按照教程Deploy FastAPI on Ubuntu and Serve using Caddy 2 Web Server 我还在 Ubuntu 服务器上安装了 aiofiles(pip install aiofiles)。

我的目录支出: enter image description here

查看我的 main.py 文件中的行以启用静态文件的服务,用 # <--- 静态文件表示:

from typing import List
import databases
import sqlalchemy
from fastapi.staticfiles import StaticFiles               # <--- static files
from fastapi import FastAPI, status
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import os
import urllib
from dotenv import load_dotenv
load_dotenv()
#DATABASE_URL = "sqlite:///./test.db"

host_server = os.environ.get('host_server')
db_server_port = urllib.parse.quote_plus(str(os.environ.get('db_server_port')))
database_name = os.environ.get('database_name')
db_username = urllib.parse.quote_plus(str(os.environ.get('db_username')))
db_password = urllib.parse.quote_plus(str(os.environ.get('db_password')))
ssl_mode = urllib.parse.quote_plus(str(os.environ.get('ssl_mode')))
DATABASE_URL = 'postgresql://{}:{}@{}:{}/{}?sslmode={}'.format(db_username, db_password, host_server, db_server_port, database_name, ssl_mode)

database = databases.Database(DATABASE_URL)

metadata = sqlalchemy.MetaData()

notes = sqlalchemy.Table(
    "notes",
    metadata,
    sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
    sqlalchemy.Column("text", sqlalchemy.String),
    sqlalchemy.Column("completed", sqlalchemy.Boolean),
)

engine = sqlalchemy.create_engine(
    #DATABASE_URL, connect_args={"check_same_thread": False}
    DATABASE_URL, pool_size=3, max_overflow=0
)
metadata.create_all(engine)

class NoteIn(BaseModel):
    text: str
    completed: bool

class Note(BaseModel):
    id: int
    text: str
    completed: bool

app = FastAPI(title="REST API using FastAPI PostgreSQL Async EndPoints")

#app.mount("/static", StaticFiles(directory="/static"), name="static")               # <--- static files
app.mount("/static", StaticFiles(directory="/static", html = True), name="static")   # <--- static files
#app.mount("/", StaticFiles(directory="static",html = True), name="static")          # <--- static files

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)



@app.on_event("startup")
async def startup():
    await database.connect()

@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

@app.post("/notes/", response_model=Note, status_code = status.HTTP_201_CREATED)
async def create_note(note: NoteIn):
    query = notes.insert().values(text=note.text, completed=note.completed)
    last_record_id = await database.execute(query)
    return {**note.dict(), "id": last_record_id}

@app.put("/notes/{note_id}/", response_model=Note, status_code = status.HTTP_200_OK)
async def update_note(note_id: int, payload: NoteIn):
    query = notes.update().where(notes.c.id == note_id).values(text=payload.text, completed=payload.completed)
    await database.execute(query)
    return {**payload.dict(), "id": note_id}

@app.get("/notes/", response_model=List[Note], status_code = status.HTTP_200_OK)
async def read_notes(skip: int = 0, take: int = 20):
    query = notes.select().offset(skip).limit(take)
    return await database.fetch_all(query)

@app.get("/notes/{note_id}/", response_model=Note, status_code = status.HTTP_200_OK)
async def read_notes(note_id: int):
    query = notes.select().where(notes.c.id == note_id)
    return await database.fetch_one(query)

@app.delete("/notes/{note_id}/", status_code = status.HTTP_200_OK)
async def delete_note(note_id: int):
    query = notes.delete().where(notes.c.id == note_id)
    await database.execute(query)
    return {"message": "Note with id: {} deleted successfully!".format(note_id)}

当我检查设置状态时,一切正常

enter image description here

当我测试数据库的 Rest 接口 (Postgres) 时,没问题

enter image description here

但是如果我尝试访问我的静态网站,那就没有运气了!

enter image description here

参考我的文件夹支出,我怀疑 main.py 中的以下行不正确。

app.mount("/static", StaticFiles(directory="/static", html = True), name="static") 

任何帮助将不胜感激。

问候,

Nols Smit

0 个答案:

没有答案
相关问题