From ed12b2bc894b8b37080d17620726f00120284e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20G=C3=B6k?= Date: Sun, 16 Jul 2023 16:09:21 +0300 Subject: [PATCH 1/6] dockerize --- fastapi_jwt/Dockerfile | 13 +++++++++++++ .../{static/style/main.css => app/__init__.py} | 0 fastapi_jwt/{ => app}/db.py | 2 +- fastapi_jwt/{ => app}/main.py | 12 ++++++------ fastapi_jwt/app/static/script/main.js | 7 +++++++ fastapi_jwt/app/static/style/main.css | 0 fastapi_jwt/{ => app}/templates/home.html | 8 ++++---- fastapi_jwt/{ => app}/templates/index.html | 0 fastapi_jwt/{ => app}/templates/login.html | 0 fastapi_jwt/{ => app}/templates/register.html | 0 fastapi_jwt/{ => app}/todo.py | 4 ++-- fastapi_jwt/{ => app}/user.py | 5 +++-- fastapi_jwt/readme.MD | 9 +++++++++ fastapi_jwt/requirements.txt | 2 -- fastapi_jwt/sqlite.db | Bin 12288 -> 0 bytes fastapi_jwt/static/script/main.js | 3 --- 16 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 fastapi_jwt/Dockerfile rename fastapi_jwt/{static/style/main.css => app/__init__.py} (100%) rename fastapi_jwt/{ => app}/db.py (96%) rename fastapi_jwt/{ => app}/main.py (93%) create mode 100644 fastapi_jwt/app/static/script/main.js create mode 100644 fastapi_jwt/app/static/style/main.css rename fastapi_jwt/{ => app}/templates/home.html (73%) rename fastapi_jwt/{ => app}/templates/index.html (100%) rename fastapi_jwt/{ => app}/templates/login.html (100%) rename fastapi_jwt/{ => app}/templates/register.html (100%) rename fastapi_jwt/{ => app}/todo.py (97%) rename fastapi_jwt/{ => app}/user.py (97%) create mode 100644 fastapi_jwt/readme.MD delete mode 100644 fastapi_jwt/sqlite.db delete mode 100644 fastapi_jwt/static/script/main.js diff --git a/fastapi_jwt/Dockerfile b/fastapi_jwt/Dockerfile new file mode 100644 index 0000000..4db1a1f --- /dev/null +++ b/fastapi_jwt/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.10 + +WORKDIR /api + +COPY ./requirements.txt /api/requirements.txt +RUN pip install --no-cache-dir --upgrade -r /api/requirements.txt + +COPY ./app /api/app +EXPOSE 80 + +ENV JWT_SECRET_KEY=SECRET + +CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] \ No newline at end of file diff --git a/fastapi_jwt/static/style/main.css b/fastapi_jwt/app/__init__.py similarity index 100% rename from fastapi_jwt/static/style/main.css rename to fastapi_jwt/app/__init__.py diff --git a/fastapi_jwt/db.py b/fastapi_jwt/app/db.py similarity index 96% rename from fastapi_jwt/db.py rename to fastapi_jwt/app/db.py index 2abedca..0a76598 100644 --- a/fastapi_jwt/db.py +++ b/fastapi_jwt/app/db.py @@ -2,7 +2,7 @@ import sqlalchemy # SQLAlchemy specific code, as with any other app -DATABASE_URL = "sqlite:///./sqlite.db" +DATABASE_URL = "sqlite:///./app/sqlite.db" # DATABASE_URL = "postgresql://user:password@postgresserver/db" database = databases.Database(DATABASE_URL) diff --git a/fastapi_jwt/main.py b/fastapi_jwt/app/main.py similarity index 93% rename from fastapi_jwt/main.py rename to fastapi_jwt/app/main.py index 2310f44..da0ec26 100644 --- a/fastapi_jwt/main.py +++ b/fastapi_jwt/app/main.py @@ -2,10 +2,10 @@ from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles from fastapi.responses import RedirectResponse -from user import user_router, JWTBearer, TokenData, UserLogin, UserIn -from user import login as user_login -from user import register as user_register -from todo import todo_router, get_todos, create_todo, update_todo_by_id, TodoIn +from .user import user_router, JWTBearer, TokenData, UserLogin, UserIn +from .user import login as user_login +from .user import register as user_register +from .todo import todo_router, get_todos, create_todo, update_todo_by_id, TodoIn import json app = FastAPI(docs_url = "/api/docs") @@ -30,9 +30,9 @@ async def root(): return {"message": "Hello World"} -app.mount("/static", StaticFiles(directory="static"), name="static") +app.mount("/static", StaticFiles(directory="app/static"), name="static") -templates = Jinja2Templates(directory="templates") +templates = Jinja2Templates(directory="app/templates") def is_logged_in(request: Request) -> TokenData if True else False: token = request.cookies.get("access_token") diff --git a/fastapi_jwt/app/static/script/main.js b/fastapi_jwt/app/static/script/main.js new file mode 100644 index 0000000..f7e960c --- /dev/null +++ b/fastapi_jwt/app/static/script/main.js @@ -0,0 +1,7 @@ +const update_todo = (id) => { + var todo = document.getElementById(`todo-${id}`); + var todo_name = todo.querySelector('h1').innerText; + var todo_description = todo.querySelector('p').innerText; + var todo_status = todo.querySelector('[name="status"]').value; + console.log(todo_name, todo_description, todo_status); +} diff --git a/fastapi_jwt/app/static/style/main.css b/fastapi_jwt/app/static/style/main.css new file mode 100644 index 0000000..e69de29 diff --git a/fastapi_jwt/templates/home.html b/fastapi_jwt/app/templates/home.html similarity index 73% rename from fastapi_jwt/templates/home.html rename to fastapi_jwt/app/templates/home.html index 0711e75..94b2b62 100644 --- a/fastapi_jwt/templates/home.html +++ b/fastapi_jwt/app/templates/home.html @@ -29,13 +29,13 @@ {% for todo in todos %}

{{ todo.title }}

-

{{ todo.description }}

+

{{ todo.description }}

{% if todo.completed %} - Completed + Completed {% else %} - Completed + Completed {% endif %} - +
{% endfor %} diff --git a/fastapi_jwt/templates/index.html b/fastapi_jwt/app/templates/index.html similarity index 100% rename from fastapi_jwt/templates/index.html rename to fastapi_jwt/app/templates/index.html diff --git a/fastapi_jwt/templates/login.html b/fastapi_jwt/app/templates/login.html similarity index 100% rename from fastapi_jwt/templates/login.html rename to fastapi_jwt/app/templates/login.html diff --git a/fastapi_jwt/templates/register.html b/fastapi_jwt/app/templates/register.html similarity index 100% rename from fastapi_jwt/templates/register.html rename to fastapi_jwt/app/templates/register.html diff --git a/fastapi_jwt/todo.py b/fastapi_jwt/app/todo.py similarity index 97% rename from fastapi_jwt/todo.py rename to fastapi_jwt/app/todo.py index 4cf39fb..1d7ab31 100644 --- a/fastapi_jwt/todo.py +++ b/fastapi_jwt/app/todo.py @@ -1,8 +1,8 @@ from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from db import database, todos +from .db import database, todos from fastapi import Depends -from user import JWTBearer, TokenData +from .user import JWTBearer, TokenData todo_router = APIRouter() diff --git a/fastapi_jwt/user.py b/fastapi_jwt/app/user.py similarity index 97% rename from fastapi_jwt/user.py rename to fastapi_jwt/app/user.py index 9b8a290..2ef284c 100644 --- a/fastapi_jwt/user.py +++ b/fastapi_jwt/app/user.py @@ -3,12 +3,13 @@ from fastapi import APIRouter, Depends from fastapi import HTTPException from pydantic import BaseModel -from db import database, users +from .db import database, users from passlib.context import CryptContext +import os user_router = APIRouter() -JWT_SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" +JWT_SECRET_KEY = os.environ.get("JWT_SECRET_KEY") pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/fastapi_jwt/readme.MD b/fastapi_jwt/readme.MD new file mode 100644 index 0000000..01f0257 --- /dev/null +++ b/fastapi_jwt/readme.MD @@ -0,0 +1,9 @@ +# FastAPI Todo App + + +# Build Docker + +```bash +docker build -t fastapi_todo . +docker run -d --name my_todo_app -p 80:80 fastapi_todo +``` \ No newline at end of file diff --git a/fastapi_jwt/requirements.txt b/fastapi_jwt/requirements.txt index e998f61..d43fa7a 100644 --- a/fastapi_jwt/requirements.txt +++ b/fastapi_jwt/requirements.txt @@ -20,7 +20,6 @@ httpx==0.24.1 idna==3.4 itsdangerous==2.1.2 Jinja2==3.1.2 -MarkupSafe==2.1.3 orjson==3.9.1 passlib==1.7.4 pyasn1==0.5.0 @@ -40,4 +39,3 @@ typing_extensions==4.6.3 ujson==5.8.0 uvicorn==0.22.0 watchfiles==0.19.0 -websockets==11.0.3 diff --git a/fastapi_jwt/sqlite.db b/fastapi_jwt/sqlite.db deleted file mode 100644 index 233f1560c7495b0850eb8f9c19f32833dfc1da75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI#!EV|x7yw|0cFSN|sZ>>*s<~1RWtv(7t441NnMoNTp-F(!OBE6WE+v5^KceZ7UNW5A;n$KA6g+UpiRVa=mW+GAwIg+ zqHEa_(PVx35Z$?z`BPIK9oXEfXf?5MgVIJcKm!2~009sH0T2KI5C8!X009vA&jfCp z2|km_a9>`AR_BU_p5q0JVNKGBXcBCSC57Nc2=Awo%)u4aBr?&ls+m}AD9T%$N`@@F zqPQvQ(ut_Y0fz>*&qg8h+|{t{4M)*esDn$IrVvq$-}PoL^)K!-$FaIzsfl_US4kW1 zGbbCz%9>6pvKq(smwU2UCuO1&RU!tS1k?`}ucxxNZ@5Kap9_n^7E6mE@u0A~El(B} zue;XpL2Zwp`&Q7W&c(j)rK|Nmt}T^~|IODoexUTX^jVsZCeT0t z1V8`;KmY_l00ck)1V8`;K;SPEsI2p7YwPw|(h8iY@8vstLVj<0E|Q)wv|4kmD4Qq7 z;iz^^C$b@kMXOA^j86R0wL2IGEHDb^SCt$s-Hf$09=(oJQ8%#so;S$fCv=XQrZ&x4 zz4N*-7F4BaABPjICSM-u$96+&m0Lwiu=;+hrbuFcVBXkLo@xmmZSO=0Nnkn4q<1IG z7bIGl7n`%Wr=Fh88?&%99%;5S)wRmZHHDKRp}CNT1tZ6V_aDck^XahK;CQsNyK+Jj zpA^eKzYp%x*7eR Date: Sun, 16 Jul 2023 16:13:16 +0300 Subject: [PATCH 2/6] Update readme.MD --- fastapi_jwt/readme.MD | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fastapi_jwt/readme.MD b/fastapi_jwt/readme.MD index 01f0257..96ca4be 100644 --- a/fastapi_jwt/readme.MD +++ b/fastapi_jwt/readme.MD @@ -1,7 +1,10 @@ # FastAPI Todo App +## Configure -# Build Docker +Change the `ENV JWT_SECRET_KEY=SECRET` in the Dockerfile to a secret key of your choice. + +## Build Docker ```bash docker build -t fastapi_todo . From b3cc6feb6be9dc5806340c63fa296845e23cd802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20G=C3=B6k?= <116498667+ensargx@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:14:04 +0300 Subject: [PATCH 3/6] Rename readme.MD to README.md --- fastapi_jwt/{readme.MD => README.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename fastapi_jwt/{readme.MD => README.md} (98%) diff --git a/fastapi_jwt/readme.MD b/fastapi_jwt/README.md similarity index 98% rename from fastapi_jwt/readme.MD rename to fastapi_jwt/README.md index 96ca4be..479bb12 100644 --- a/fastapi_jwt/readme.MD +++ b/fastapi_jwt/README.md @@ -9,4 +9,4 @@ Change the `ENV JWT_SECRET_KEY=SECRET` in the Dockerfile to a secret key of your ```bash docker build -t fastapi_todo . docker run -d --name my_todo_app -p 80:80 fastapi_todo -``` \ No newline at end of file +``` From 2600648297af98b488b3ea4ea5f3dd3903ed3c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20G=C3=B6k?= <116498667+ensargx@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:17:47 +0300 Subject: [PATCH 4/6] Add files via upload --- fastapi_jwt/screen.PNG | Bin 0 -> 32366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastapi_jwt/screen.PNG diff --git a/fastapi_jwt/screen.PNG b/fastapi_jwt/screen.PNG new file mode 100644 index 0000000000000000000000000000000000000000..86b48821a631c300a3446375376b67e5d0a606a3 GIT binary patch literal 32366 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 BF3bP` literal 0 HcmV?d00001 From 5ba9390c6707110329ee2381eac655ff1bb62afd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20G=C3=B6k?= <116498667+ensargx@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:18:27 +0300 Subject: [PATCH 5/6] Update README.md --- fastapi_jwt/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fastapi_jwt/README.md b/fastapi_jwt/README.md index 479bb12..07f67c3 100644 --- a/fastapi_jwt/README.md +++ b/fastapi_jwt/README.md @@ -1,5 +1,9 @@ # FastAPI Todo App +## Docs + +[FastAPI](./screen.PNG) + ## Configure Change the `ENV JWT_SECRET_KEY=SECRET` in the Dockerfile to a secret key of your choice. From 05fbc65732f6e718ede963f40e1961d5fdf51c07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20G=C3=B6k?= <116498667+ensargx@users.noreply.github.com> Date: Sun, 16 Jul 2023 16:19:03 +0300 Subject: [PATCH 6/6] Update README.md --- fastapi_jwt/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastapi_jwt/README.md b/fastapi_jwt/README.md index 07f67c3..1dd1c72 100644 --- a/fastapi_jwt/README.md +++ b/fastapi_jwt/README.md @@ -2,7 +2,7 @@ ## Docs -[FastAPI](./screen.PNG) +![FastAPI](./screen.PNG?raw=true) ## Configure