{"id":19176912,"url":"https://github.com/javi-cc/python-api-crud-template","last_synced_at":"2026-04-05T23:04:56.079Z","repository":{"id":248653245,"uuid":"829312439","full_name":"JAVI-CC/python-api-crud-template","owner":"JAVI-CC","description":"PYTHON 3.12 FASTAPI API CRUD USERS TEMPLATE","archived":false,"fork":false,"pushed_at":"2024-07-28T14:06:43.000Z","size":295,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-23T01:16:51.066Z","etag":null,"topics":["api","docker","email-sender","excel-export","fastapi","middleware","migrations","multi-language","pdf-export","pydantic","python","seeders","sqlalchemy","uuid"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JAVI-CC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-16T07:21:29.000Z","updated_at":"2024-07-28T14:06:47.000Z","dependencies_parsed_at":"2024-07-23T19:56:26.411Z","dependency_job_id":"2f2075c5-27b1-4d24-be07-903201bbf4a8","html_url":"https://github.com/JAVI-CC/python-api-crud-template","commit_stats":null,"previous_names":["javi-cc/python-api-crud-template"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JAVI-CC/python-api-crud-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JAVI-CC%2Fpython-api-crud-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JAVI-CC%2Fpython-api-crud-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JAVI-CC%2Fpython-api-crud-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JAVI-CC%2Fpython-api-crud-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JAVI-CC","download_url":"https://codeload.github.com/JAVI-CC/python-api-crud-template/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JAVI-CC%2Fpython-api-crud-template/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261756769,"owners_count":23205159,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","docker","email-sender","excel-export","fastapi","middleware","migrations","multi-language","pdf-export","pydantic","python","seeders","sqlalchemy","uuid"],"created_at":"2024-11-09T10:31:06.443Z","updated_at":"2025-12-30T22:25:30.657Z","avatar_url":"https://github.com/JAVI-CC.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://fastapi.tiangolo.com\"\u003e\u003cimg src=\"app/static/readme/logo-python-fastapi.png\" alt=\"FastAPI\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003cem\u003eFastAPI framework, high performance, easy to learn, fast to code, ready for production\u003c/em\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://github.com/tiangolo/fastapi/workflows/Test/badge.svg?event=push\u0026branch=master\" alt=\"Test\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://coverage-badge.samuelcolvin.workers.dev/redirect/tiangolo/fastapi\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://coverage-badge.samuelcolvin.workers.dev/tiangolo/fastapi.svg\" alt=\"Coverage\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/fastapi\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/v/fastapi?color=%2334D058\u0026label=pypi%20package\" alt=\"Package version\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/fastapi\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058\" alt=\"Supported Python versions\"\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003cspan\u003eApplication made with FastAPI that consists of the creation of a CRUD of a user and system authentication api that contains the following functionalities:\u003c/span\u003e\n\u003cul\u003e\n  \u003cli\u003eRelationships between different models.\u003c/li\u003e\n  \u003cli\u003ePrimary key format UUID.\u003c/li\u003e\n  \u003cli\u003eContains endpoints of type GET, POST, PATCH, PUT and DELETE\u003c/li\u003e\n  \u003cli\u003eGenerate token by JWT (Json web tokens)\u003c/li\u003e\n  \u003cli\u003eSQLAlchemy.\u003c/li\u003e\n  \u003cli\u003ePydantic.\u003c/li\u003e\n  \u003cli\u003ePostman collection.json file to import and create use endpoints.\u003c/li\u003e\n  \u003cli\u003eRequests validations.\u003c/li\u003e\n  \u003cli\u003eException handling.\u003c/li\u003e\n  \u003cli\u003eEmail sending notification to verify the user.\u003c/li\u003e\n  \u003cli\u003eEnums.\u003c/li\u003e\n  \u003cli\u003eMiddleware.\u003c/li\u003e\n  \u003cli\u003eDependencies validations.\u003c/li\u003e\n  \u003cli\u003eFile Storage.\u003c/li\u003e\n  \u003cli\u003eExports in Excel and PDF format.\u003c/li\u003e\n  \u003cli\u003eJinja2 Email Templates.\u003c/li\u003e\n  \u003cli\u003eMulti language support.\u003c/li\u003e\n  \u003cli\u003eMigration file to create all the tables in the database.\u003c/li\u003e\n  \u003cli\u003eSeeders are in JSON format.\u003c/li\u003e\n  \u003cli\u003ePython 3.12\u003c/li\u003e\n  \u003cli\u003eUsers contain different roles and permissions.\u003c/li\u003e\n  \u003cli\u003eThe project contains the files to deploy it in Docker.\u003c/li\u003e \n\u003c/ul\u003e \n\n\u003ch3\u003eHeaders\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eKey\u003c/th\u003e\n\u003cth\u003eValue\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuthorization\u003c/td\u003e\n\u003ctd\u003e{Token provided by JWT}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAccept\u003c/td\u003e\n\u003ctd\u003eapplication/json\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContent-Type\u003c/td\u003e\n\u003ctd\u003eapplication/json\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAccept-Language\u003c/td\u003e\n\u003ctd\u003eapplication/json\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ch3\u003eSetup\u003c/h3\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ apt-get install wkhtmltopdf\u003c/code\u003e\n\u003c/pre\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ cp .env.example .env.dev\u003c/code\u003e\n\u003c/pre\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ pip install --no-cache-dir --upgrade -r requirements.txt\u003c/code\u003e\n\u003c/pre\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ sed -i '/JWT_SECRET_KEY=\"\"/d' .env.dev \u0026\u0026 jwt_secret_key=\"JWT_SECRET_KEY=$(openssl rand -hex 32)\" \u0026\u0026 sed -i -e \"22i$jwt_secret_key\" .env.dev\u003c/code\u003e\n\u003c/pre\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ fastapi run app/main.py --port 8000 --reload\u003c/code\u003e\n\u003c/pre\u003e\n\n\u003ch3\u003eUser admin credentials\u003c/h3\u003e\n\u003cspan\u003eUser: \u003cb\u003eadmin@email.com\u003c/b\u003e\u003c/span\u003e\u003cbr\u003e\n\u003cspan\u003ePassword: \u003cb\u003ePass-1234\u003c/b\u003e\u003c/span\u003e\n\n\u003chr\u003e\n\n\u003cspan\u003e OpenAPI documentation: \u003ca href=\"http://localhost:8000/docs\" target=\"_blank\"\u003ehttp://localhost:8000/docs\u003c/a\u003e\n\u003c/span\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"app/static/readme/image-openapi-docs.png\" alt=\"FastAPI\"\u003e\n\n\n\u003ch3\u003eEndpoints Auth:\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003ePath\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eAuth\u003c/th\u003e\n\u003cth\u003eIs Admin\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePOST\u003c/td\u003e\n\u003ctd\u003e/auth/login\u003c/td\u003e\n\u003ctd\u003eLogin a user\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/auth/me\u003c/td\u003e\n\u003ctd\u003eCheck if user authenticated\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003ch3\u003eEndpoints Users:\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003ePath\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eAuth\u003c/th\u003e\n\u003cth\u003eIs Admin\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users\u003c/td\u003e\n\u003ctd\u003eGet all the users\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users/{id}\u003c/td\u003e\n\u003ctd\u003eGet a user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePOST\u003c/td\u003e\n\u003ctd\u003e/users\u003c/td\u003e\n\u003ctd\u003eAdd new user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePUT\u003c/td\u003e\n\u003ctd\u003e/users/{id}\u003c/td\u003e\n\u003ctd\u003eUpdate a user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePATCH\u003c/td\u003e\n\u003ctd\u003e/users/update_password\u003c/td\u003e\n\u003ctd\u003eUpdate password current user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDELETE\u003c/td\u003e\n\u003ctd\u003e/users/{id}\u003c/td\u003e\n\u003ctd\u003eDelete a user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users/export/excel\u003c/td\u003e\n\u003ctd\u003eExport all users in Excel format\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users/export/pdf\u003c/td\u003e\n\u003ctd\u003eExport all users in Pdf format\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users/confirm_email/{hash}\u003c/td\u003e\n\u003ctd\u003eConfirm verification user\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/users/resend/confirm_email\u003c/td\u003e\n\u003ctd\u003eResend email verification user\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003ch3\u003eEndpoints Roles:\u003c/h3\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eMethod\u003c/th\u003e\n\u003cth\u003ePath\u003c/th\u003e\n\u003cth\u003eDescription\u003c/th\u003e\n\u003cth\u003eAuth\u003c/th\u003e\n\u003cth\u003eIs Admin\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/roles\u003c/td\u003e\n\u003ctd\u003eGet all the roles\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET\u003c/td\u003e\n\u003ctd\u003e/roles/{id}\u003c/td\u003e\n\u003ctd\u003eGet a role\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003ctd\u003eYes\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cbr\u003e\n\n\n\u003cbr\u003e\n\n\u003ch2\u003eConfigure values in the .env.dev file\u003c/h2\u003e\n\n\u003cpre\u003e\u003ccode\u003e\n\u003cstrong\u003eAPP_URL=\"http://localhost:8000\"\u003c/strong\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003e\n\u003cstrong\u003eDB_DRIVER=\"\"\u003c/strong\u003e\n\u003cstrong\u003eDB_HOST=\"\"\u003c/strong\u003e\n\u003cstrong\u003eDB_PORT=\"\"\u003c/strong\u003e\n\u003cstrong\u003eDB_DATABASE=\"\"\u003c/strong\u003e\n\u003cstrong\u003eDB_USERNAME=\"\"\u003c/strong\u003e\n\u003cstrong\u003eDB_PASSWORD=\"\"\u003c/strong\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003e\n\u003cstrong\u003eMAIL_SERVER=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_PORT=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_USERNAME=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_PASSWORD=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_FROM_ADDRESS=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_FROM_NAME=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_STARTTLS=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_SSL_TLS=\"\"\u003c/strong\u003e\n\u003cstrong\u003eMAIL_USE_CREEDENTIALS=\"\"\u003c/strong\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cpre\u003e\u003ccode\u003e\n\u003cspan\u003e# command generate JWT_SECRET_KEY: openssl rand -hex 32\u003c/span\u003e\n\u003cstrong\u003eJWT_SECRET_KEY=\"\"\u003c/strong\u003e\n\u003cstrong\u003eJWT_ALGORITHM=\"\"\u003c/strong\u003e\n\u003c/code\u003e\u003c/pre\u003e\n\n\u003cbr\u003e\n\n\u003ch2\u003eDeploy to Docker \u003cg-emoji class=\"g-emoji\" alias=\"whale\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/1f433.png\"\u003e🐳\u003c/g-emoji\u003e\u003c/h2\u003e\n\n\u003cspan\u003eDocker repository: \u003ca href=\"https://hub.docker.com/r/javi98/python-api-crud-template\" target=\"_blank\"\u003ehttps://hub.docker.com/r/javi98/python-api-crud-template\u003c/a\u003e\u003c/span\u003e\n\n\u003ch4\u003eContainers:\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cspan\u003epython:3.12\u003c/span\u003e - \u003ccode\u003e:8000\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan\u003emariadb:11.2.2\u003c/span\u003e - \u003ccode\u003e:3306\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan\u003ephpmyadmin:5.2.1\u003c/span\u003e - \u003ccode\u003e:8085-\u003e80/tcp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cspan\u003emailhog:v1.0.1\u003c/span\u003e - \u003ccode\u003e:1025 # smtp server\u003c/code\u003e \u003ccode\u003e:8025 # web ui\u003c/code\u003e\n\u003c/ul\u003e\n\n\u003ch4\u003eContainers structure:\u003c/h4\u003e\n\u003cdiv class=\"highlight highlight-source-shell\"\u003e\u003cpre\u003e├── python-api-crud-template-app\n├── python-api-crud-template-db\n├── python-api-crud-template-smtp\n└── python-api-crud-template-phpmyadmin\u003c/pre\u003e\u003c/div\u003e\n\n\u003ch4\u003eSetup:\u003c/h4\u003e\n\u003cpre\u003e\n\u003ccode\u003e$ git clone https://github.com/JAVI-CC/python-api-crud-template.git\n$ cd python-api-crud-template\n$ cp .env.example .env.dev\n$ docker compose up -d\n$ docker compose exec app chmod +x ./docker-config/run.sh\n$ docker compose exec app ./docker-config/run.sh\u003c/code\u003e\n\u003c/pre\u003e\n\n\u003cbr\u003e\n\n\u003cspan\u003eOnce you have the containers deployed, you can access the API at \u003c/span\u003e \u003ca href=\"http://localhost:8000\" target=\"_blank\"\u003ehttp://localhost:8000\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavi-cc%2Fpython-api-crud-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavi-cc%2Fpython-api-crud-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavi-cc%2Fpython-api-crud-template/lists"}