前提・実現したいこと
下記サイトを参考にFastAPIでtodoアプリを制作しています。
https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-event-add-delete
StaticFilesを使ってディレクトリから静的ファイルを取得しようとしたところ、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "C:\Users\Documents\Desktop\FastAPITutrial-master\FastAPITutrial-master\run.py", line 1, in <module> from urls import app File "C:\Users\Documents\Desktop\FastAPITutrial-master\FastAPITutrial-master\urls.py", line 1, in <module> from controllers import * File "C:\Users\Documents\Desktop\FastAPITutrial-master\FastAPITutrial-master\controllers.py", line 30, in <module> app.mount("/static", StaticFiles(directory="static"), name="static") File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\starlette\staticfiles.py", line 57, in __init__ raise RuntimeError(f"Directory '{directory}' does not exist") RuntimeError: Directory 'static' does not exist
該当のソースコード
Python
1from fastapi import FastAPI, Depends, Form 2from fastapi.security import HTTPBasic, HTTPBasicCredentials 3 4from starlette.staticfiles import StaticFiles 5from starlette.templating import Jinja2Templates 6from starlette.requests import Request 7from starlette.responses import RedirectResponse 8from auth import auth 9 10import db 11from models import User, Task 12from mycalendar import MyCalendar 13from datetime import datetime, timedelta 14 15import hashlib 16import re 17 18pattern = re.compile(r'\w{4,20}') # 任意の4~20の英数字を示す正規表現 19pattern_pw = re.compile(r'\w{6,20}') # 任意の6~20の英数字を示す正規表現 20pattern_mail = re.compile(r'^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$') # e-mailの正規表現 21 22app = FastAPI( 23 title='FastAPIでつくるtoDoアプリケーション', 24 description='FastAPIチュートリアル:FastAPI(とstarlette)でシンプルなtoDoアプリを作りましょう.', 25 version='0.9 beta' 26) 27security = HTTPBasic() 28 29# staticディレクトリの設定 (starlette) 30app.mount("/static", StaticFiles(directory="static"), name="static") 31 32# テンプレート関連の設定 (jinja2) 33templates = Jinja2Templates(directory="templates") 34jinja_env = templates.env # Jinja2.Environment : filterやglobalの設定用 35 36 37def index(request: Request): 38 return templates.TemplateResponse('index.html', 39 {'request': request}) 40 41 42def admin(request: Request, credentials: HTTPBasicCredentials = Depends(security)): 43 44 username = auth(credentials) 45 46 user = db.session.query(User).filter(User.username == username).first() 47 task = db.session.query(Task).filter(Task.user_id == user.id).all() 48 db.session.close() 49 50 # 今日の日付と来週の日付 51 today = datetime.now() 52 next_w = today + timedelta(days=7) # 1週間後の日付 53 54 """ [new] カレンダー関連 """ 55 # カレンダーをHTML形式で取得 56 cal = MyCalendar(username, 57 {t.deadline.strftime('%Y%m%d'): t.done for t in task}) # 予定がある日付をキーとして渡す 58 59 cal = cal.formatyear(today.year, 4) # カレンダーをHTMLで取得 60 61 # 直近のタスクだけでいいので、リストを書き換える 62 task = [t for t in task if today <= t.deadline <= next_w] 63 links = [t.deadline.strftime('/todo/'+username+'/%Y/%m/%d') for t in task] # 直近の予定リンク 64 65 return templates.TemplateResponse('admin.html', 66 {'request': request, 67 'user': user, 68 'task': task, 69 'links': links, 70 'calender': cal}) 71
試したこと
https://fastapi.tiangolo.com/tutorial/static-files/
fastapiのリファレンスを参照してエラー箇所のマウント部分をHTMLモードで実行したり、
https://www.starlette.io/staticfiles/
starletteのリファレンスを参照して同様に試しましたが上手くいきませんでした。
補足情報(FW/ツールのバージョンなど)
Python 3.9.7
aiofiles 0.7.0
fastapi 0.68.1
starlette 0.14.2
あなたの回答
tips
プレビュー