πΊ QRKot
- Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
- ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°
- ΠΡΠ°Π²Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΠ΅ΠΊΡΠ°
- ΠΡΠΈΠΌΠ΅ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ API
- ΠΠ²ΡΠΎΡ
- Python 3.9.10
- Fastapi 0.78.0
- SQLalchemy 1.4.36
- Alembic 1.7.7
- Uvicorn 0.17.6
- Google API
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΠ»Π°Π³ΠΎΡΠ²ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ½Π΄Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΊΠΎΡΠΈΠΊΠΎΠ² QRKot.
Π€ΠΎΠ½Π΄ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΏΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ΅Π»Π΅Π²ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ: Π½Π° ΠΌΠ΅Π΄ΠΈΡΠΈΠ½ΡΠΊΠΎΠ΅ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π½ΡΠΆΠ΄Π°ΡΡΠΈΡ ΡΡ Ρ Π²ΠΎΡΡΠ°ΡΡΡ , Π½Π° ΠΎΠ±ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΊΠΎΡΠ°ΡΡΠ΅ΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΈΠΈ Π² ΠΏΠΎΠ΄Π²Π°Π»Π΅, Π½Π° ΠΊΠΎΡΠΌ ΠΎΡΡΠ°Π²ΡΠΈΠΌΡΡ Π±Π΅Π· ΠΏΠΎΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΠΊΠ°ΠΌ β Π½Π° Π»ΡΠ±ΡΠ΅ ΡΠ΅Π»ΠΈ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ΠΊΠΎΡΠ°ΡΡΠ΅ΠΉ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠΈ.
ΠΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΡΠ΅Π»Π΅Π²ΡΠ΅: ΠΎΠ½ΠΈ Π²Π½ΠΎΡΡΡΡΡ Π² ΡΠΎΠ½Π΄, Π° Π½Π΅ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΡΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π»Π΅Π²ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ². Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ ΡΡΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΠ°ΡΡ. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½ΡΠΆΠ½Π°Ρ ΡΡΠΌΠΌΠ° ΡΠΎΠ±ΡΠ°Π½Π° β ΠΏΡΠΎΠ΅ΠΊΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ.
ΠΡΠ±ΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΈΠ΄Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΠΈ ΡΠΆΠ΅ Π²Π½Π΅ΡΠ΅Π½Π½ΡΠ΅ ΡΡΠΌΠΌΡ. ΠΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² β ΠΈ ΠΎΡΠΊΡΡΡΡΡ , ΠΈ Π·Π°ΠΊΡΡΡΡΡ .
ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ²ΠΎΠΈΡ ΠΏΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠΉ.
ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ².
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΡΠ΄Π°Π»ΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, Π² ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ Π²Π½Π΅ΡΠ΅Π½ΠΎ ΡΡΠ΅Π΄ΡΡΠ², ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ Π½ΠΎΠ²ΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΡΡΠΌΠΌΡ (Π½ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠΆΠ΅ Π²Π½Π΅ΡΡΠ½Π½ΠΎΠΉ).
- ΠΠ»ΠΎΠ½ΠΈΡΡΠΉΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΈ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Π½Π΅Π³ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅:
mkdir cat_charity_fund
cd cat_charity_fund
git clone https://github.com/KomkovAleksey/cat_charity_fund
CΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠΉΡΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅:
python3 -m venv venv
-
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Linux/macOS
source venv/bin/activate
-
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ windows
source venv/scripts/activate
-
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈΠ· ΡΠ°ΠΉΠ»Π° requirements.txt ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ pip:
python -m pip install --upgrade pip
pip install -r requirements.txt
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ .env ΡΠ°ΠΉΠ» Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
touch .env
Π Π½Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΊΠ°Π·Π°Π½Ρ.
DATABASE_URL=
SECRET=
APP_TITLE=
FIRST_SUPERUSER_EMAIL=
FIRST_SUPERUSER_PASSWORD=
# ΠΠ°Π½Π½ΡΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°
TYPE=
PROJECT_ID=
PRIVATE_KEY_ID=
PRIVATE_KEY=
CLIENT_EMAIL=
CLIENT_ID=
AUTH_URI=
TOKEN_URI=
AUTH_PROVIDER_X509_CERT_URL=
CLIENT_X509_CERT_URL=
EMAIL=
Π ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Π΅ΡΡΡ ΡΠ°ΠΉΠ» .env.example, Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ .env ΡΠ°ΠΉΠ».
ΠΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ:
alembic upgrade head
ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ:
uvicorn app.main:app
Π‘Π΅ΡΠ²ΠΈΡ QRKot Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ: http://127.0.0.1:8000
ΠΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π΄Π΅Π»Π°Π»ΠΈΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Postman
POST charity_project
http://127.0.0.1:8000/charity_project/
{
"name": "string",
"description": "string",
"full_amount": 0
}
ΠΡΠ²Π΅Ρ
{
"name": "string",
"description": "string",
"full_amount": 0,
"id": 0,
"invested_amount": 0,
"fully_invested": true,
"create_date": "2019-08-24T14:15:22Z",
"close_date": "2019-08-24T14:15:22Z"
}
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ
POST donation
http://127.0.0.1:8000/donation/
{
"full_amount": 0,
"comment": "string"
}
ΠΡΠ²Π΅Ρ
{
"full_amount": 0,
"comment": "string",
"id": 0,
"create_date": "2019-08-24T14:15:22Z"
}
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
POST user
http://127.0.0.1:8000/auth/register
{
"email": "{{firstUserEmail}}",
"password": "{{firstUserPassword}}"
}
ΠΡΠ²Π΅Ρ
{
"id": 1,
"email": "[email protected]",
"is_active": true,
"is_superuser": false,
"is_verified": false
}