Initial
This commit is contained in:
commit
62f3ae7881
8
.dockerignore
Normal file
8
.dockerignore
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
__pycache__
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
*.db
|
||||||
|
*.sqlite
|
||||||
|
*.log
|
||||||
|
*.env
|
||||||
4
.env
Normal file
4
.env
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FLASK_APP=run.py
|
||||||
|
FLASK_ENV=development
|
||||||
|
SECRET_KEY=your-secret-key
|
||||||
|
SQLALCHEMY_DATABASE_URI=sqlite:///development.db
|
||||||
20
Dockerfile
Normal file
20
Dockerfile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Use the official image as a parent image
|
||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
# Set the working directory in the container
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy the current directory contents into the container at /app
|
||||||
|
COPY . /app
|
||||||
|
|
||||||
|
# Install any needed packages specified in requirements.txt
|
||||||
|
RUN pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Make port 5000 available to the world outside this container
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
# Define environment variable
|
||||||
|
ENV FLASK_APP wsgi.py
|
||||||
|
|
||||||
|
# Run app.py when the container launches
|
||||||
|
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]
|
||||||
0
app/__init__.py
Normal file
0
app/__init__.py
Normal file
25
app/app.py
Normal file
25
app/app.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from flask import Flask
|
||||||
|
from app.config.config import get_config_by_name
|
||||||
|
from app.initialize_functions import initialize_route,initialize_db
|
||||||
|
|
||||||
|
def create_app(config=None) -> Flask:
|
||||||
|
"""
|
||||||
|
Create a Flask application.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
config: The configuration object to use.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A Flask application instance.
|
||||||
|
"""
|
||||||
|
app = Flask(__name__)
|
||||||
|
if config:
|
||||||
|
app.config.from_object(get_config_by_name(config))
|
||||||
|
|
||||||
|
# Initialize extensions
|
||||||
|
initialize_db(app)
|
||||||
|
|
||||||
|
# Register blueprints
|
||||||
|
initialize_route(app)
|
||||||
|
|
||||||
|
return app
|
||||||
0
app/config/__init__.py
Normal file
0
app/config/__init__.py
Normal file
34
app/config/config.py
Normal file
34
app/config/config.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
class BaseConfig:
|
||||||
|
"""Base configuration."""
|
||||||
|
DEBUG = False
|
||||||
|
TESTING = False
|
||||||
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||||
|
SECRET_KEY = 'your-secret-key'
|
||||||
|
|
||||||
|
class DevelopmentConfig(BaseConfig):
|
||||||
|
"""Development configuration."""
|
||||||
|
DEBUG = True
|
||||||
|
SQLALCHEMY_DATABASE_URI = 'sqlite:///development.db'
|
||||||
|
|
||||||
|
class TestingConfig(BaseConfig):
|
||||||
|
"""Testing configuration."""
|
||||||
|
DEBUG = True
|
||||||
|
TESTING = True
|
||||||
|
SQLALCHEMY_DATABASE_URI = 'sqlite:///testing.db'
|
||||||
|
|
||||||
|
class ProductionConfig(BaseConfig):
|
||||||
|
"""Production configuration."""
|
||||||
|
DEBUG = False
|
||||||
|
SQLALCHEMY_DATABASE_URI = 'sqlite:///production.db'
|
||||||
|
|
||||||
|
|
||||||
|
def get_config_by_name(config_name):
|
||||||
|
""" Get config by name """
|
||||||
|
if config_name == 'development':
|
||||||
|
return DevelopmentConfig()
|
||||||
|
elif config_name == 'production':
|
||||||
|
return ProductionConfig()
|
||||||
|
elif config_name == 'testing':
|
||||||
|
return TestingConfig()
|
||||||
|
else:
|
||||||
|
return DevelopmentConfig()
|
||||||
0
app/db/__init__.py
Normal file
0
app/db/__init__.py
Normal file
9
app/db/db.py
Normal file
9
app/db/db.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
from sqlalchemy.orm import DeclarativeBase
|
||||||
|
|
||||||
|
|
||||||
|
class Base(DeclarativeBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
db = SQLAlchemy(model_class=Base)
|
||||||
14
app/initialize_functions.py
Normal file
14
app/initialize_functions.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from flask import Flask
|
||||||
|
from app.modules.main.route import main_bp
|
||||||
|
from app.db.db import db
|
||||||
|
|
||||||
|
|
||||||
|
def initialize_route(app: Flask):
|
||||||
|
with app.app_context():
|
||||||
|
app.register_blueprint(main_bp)
|
||||||
|
|
||||||
|
|
||||||
|
def initialize_db(app: Flask):
|
||||||
|
with app.app_context():
|
||||||
|
db.init_app(app)
|
||||||
|
db.create_all()
|
||||||
0
app/modules/__init__.py
Normal file
0
app/modules/__init__.py
Normal file
0
app/modules/main/__init__.py
Normal file
0
app/modules/main/__init__.py
Normal file
3
app/modules/main/controller.py
Normal file
3
app/modules/main/controller.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
class MainController:
|
||||||
|
def index(self):
|
||||||
|
return {'message':'Hello, World!'}
|
||||||
10
app/modules/main/main_tests.py
Normal file
10
app/modules/main/main_tests.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import unittest
|
||||||
|
import json
|
||||||
|
|
||||||
|
from app.modules.main.controller import MainController
|
||||||
|
|
||||||
|
|
||||||
|
def test_index():
|
||||||
|
main_controller = MainController()
|
||||||
|
result = main_controller.index()
|
||||||
|
assert result == {'message': 'Hello, World!'}
|
||||||
11
app/modules/main/route.py
Normal file
11
app/modules/main/route.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from flask import Blueprint, make_response, jsonify
|
||||||
|
from .controller import MainController
|
||||||
|
|
||||||
|
main_bp = Blueprint('main', __name__)
|
||||||
|
|
||||||
|
main_controller = MainController()
|
||||||
|
|
||||||
|
@main_bp.route('/')
|
||||||
|
def index():
|
||||||
|
result=main_controller.index()
|
||||||
|
return make_response(jsonify(data=result))
|
||||||
0
app/tests/__init__.py
Normal file
0
app/tests/__init__.py
Normal file
15
app/tests/conftest.py
Normal file
15
app/tests/conftest.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from app.app import create_app
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def app():
|
||||||
|
app = create_app('testing')
|
||||||
|
app.config.update({"TESTING": True})
|
||||||
|
yield app
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def client(app):
|
||||||
|
return app.test_client()
|
||||||
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
build: .
|
||||||
|
command: gunicorn --bind 0.0.0.0:5000 wsgi:app
|
||||||
|
volumes:
|
||||||
|
- .:/app
|
||||||
|
ports:
|
||||||
|
- "5000:5000"
|
||||||
|
environment:
|
||||||
|
- FLASK_ENV=production
|
||||||
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Flask
|
||||||
|
Flask-SQLAlchemy
|
||||||
|
python-dotenv
|
||||||
|
pytest
|
||||||
|
gunicorn
|
||||||
16
run.py
Normal file
16
run.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
from app.app import create_app
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
config=os.getenv('FLASK_ENV') or 'development'
|
||||||
|
|
||||||
|
app = create_app(config)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if config == 'development':
|
||||||
|
app.run(debug=True)
|
||||||
|
else:
|
||||||
|
from werkzeug.serving import run_simple
|
||||||
|
run_simple('0.0.0.0', 5000, app)
|
||||||
Loading…
x
Reference in New Issue
Block a user