Initial commit
This commit is contained in:
		
						commit
						2e18ae47ee
					
				
							
								
								
									
										273
									
								
								flask-create.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										273
									
								
								flask-create.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,273 @@ | ||||
| # Create the blueprint for a new flask project | ||||
| if [[ -z $1 ]]; then | ||||
|     echo "[FlaskCreate] Syntax Error: flask-create.sh <project_name> <parent_directory:default cwd>" | ||||
|     exit; | ||||
| fi | ||||
| 
 | ||||
| PROJECT_NAME=$1 | ||||
| PROJECT_ROOT=$2 | ||||
| 
 | ||||
| if [[ -z $PROJECT_ROOT ]]; then | ||||
|     PROJECT_ROOT=$(pwd) | ||||
| fi | ||||
| 
 | ||||
| echo "-=[FlaskCreate]=-"; | ||||
| echo "Project Name: $PROJECT_NAME"; | ||||
| echo "Project Root: $PROJECT_ROOT/$PROJECT_NAME"; | ||||
| 
 | ||||
| echo "Start a new Flask project? (y/n)"; | ||||
| read START_CONFIRM; | ||||
| 
 | ||||
| if [[ $START_CONFIRM != y && $START_CONFIRM != Y ]]; then | ||||
|     exit; | ||||
| fi | ||||
| 
 | ||||
| PROJECT_FOLDER=$PROJECT_ROOT/$PROJECT_NAME | ||||
| 
 | ||||
| echo ""; | ||||
| echo ""; | ||||
| echo "[FlaskCreate] Creating directory $PROJECT_FOLDER..."; | ||||
| mkdir $PROJECT_FOLDER; | ||||
| 
 | ||||
| mkdir $PROJECT_FOLDER/data; | ||||
| mkdir $PROJECT_FOLDER/$PROJECT_NAME; | ||||
| 
 | ||||
| touch $PROJECT_FOLDER/uwsgi.ini; | ||||
| echo "[FlaskCreate] Generating uwsgi config..."; | ||||
| echo "[uwsgi] | ||||
| module = wsgi:application | ||||
| 
 | ||||
| master = true | ||||
| processes = 4 | ||||
| 
 | ||||
| socket = $PROJECT_NAME.sock | ||||
| chmod-scoket = 660 | ||||
| vacuum = true | ||||
| 
 | ||||
| die-on-term = true | ||||
| " > $PROJECT_FOLDER/uwsgi.ini; | ||||
| 
 | ||||
| touch $PROJECT_FOLDER/start.py; | ||||
| echo "from $PROJECT_NAME import create_app | ||||
| 
 | ||||
| 
 | ||||
| app = create_app() | ||||
| 
 | ||||
| if __name__ == \"__main__\": | ||||
|     app.run() | ||||
| " > $PROJECT_FOLDER/start.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Creating Flask app module files..."; | ||||
| touch $PROJECT_FOLDER/$PROJECT_NAME/__init__.py; | ||||
| echo "from flask import Flask | ||||
| 
 | ||||
| def create_app(): | ||||
|     app = Flask(__name__) | ||||
|     app.config.from_object('$PROJECT_NAME.default_settings') | ||||
|     app.config.from_envvar('FLASK_SETTINGS_FILE') | ||||
| 
 | ||||
| 
 | ||||
|     # Prep the database | ||||
|     from $PROJECT_NAME.models import db | ||||
|     app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///../data/$PROJECT_NAME.db' | ||||
|     app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False | ||||
|     db.init_app(app) | ||||
| 
 | ||||
|     # Load our views | ||||
|     from $PROJECT_NAME.views import default_views | ||||
|     app.register_blueprint(default_views) | ||||
| 
 | ||||
|     # from $PROJECT_NAME.<app_name>.views import app_views | ||||
|     # app.register_blueprint(app_views) | ||||
| 
 | ||||
|     # Load our CLI commands | ||||
|     from $PROJECT_NAME.commands import default_cli | ||||
|     app.cli.add_command(default_cli) | ||||
| 
 | ||||
|     # from $PROJECT_NAME.<app_name>.commands import app_cli | ||||
|     # app.cli.add_command(app_cli) | ||||
| 
 | ||||
|     return app | ||||
| " > $PROJECT_FOLDER/$PROJECT_NAME/__init__.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Generating SQLAlchemy base model..."; | ||||
| touch $PROJECT_FOLDER/$PROJECT_NAME/models.py; | ||||
| echo "from flask_sqlalchemy import SQLAlchemy | ||||
| 
 | ||||
| 
 | ||||
| db = SQLAlchemy() | ||||
| 
 | ||||
| class BaseModel(db.Model): | ||||
|     __abstract__ = True | ||||
| 
 | ||||
|     id = db.Column(db.Integer, primary_key=True) | ||||
|     created_at = db.Column(db.DateTime) | ||||
| " > $PROJECT_FOLDER/$PROJECT_NAME/models.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Generating basic CLI commands..."; | ||||
| touch $PROJECT_FOLDER/$PROJECT_NAME/commands.py; | ||||
| echo "import click | ||||
| from flask.cli import AppGroup | ||||
| 
 | ||||
| from $PROJECT_NAME.models import db | ||||
| 
 | ||||
| default_cli = AppGroup('$PROJECT_NAME') | ||||
| 
 | ||||
| @default_cli.command('initdb') | ||||
| def initialize_database(): | ||||
|     from $PROJECT_NAME import models | ||||
|     # from $PROJECT_NAME.<app_name> import models | ||||
|     db.create_all() | ||||
| " > $PROJECT_FOLDER/$PROJECT_NAME/commands.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Generating default views..."; | ||||
| touch $PROJECT_FOLDER/$PROJECT_NAME/views.py; | ||||
| echo "from flask import current_app, Blueprint, render_template | ||||
| 
 | ||||
| 
 | ||||
| default_views = Blueprint('default_views', __name__, url_prefix='/') | ||||
| 
 | ||||
| @default_views.route('/') | ||||
| def index(): | ||||
|     return render_template('index.html') | ||||
| " > $PROJECT_FOLDER/$PROJECT_NAME/views.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Initializing default templates..."; | ||||
| TEMPLATE_DIR=$PROJECT_FOLDER/$PROJECT_NAME/templates | ||||
| mkdir $TEMPLATE_DIR; | ||||
| touch $TEMPLATE_DIR/base.html; | ||||
| touch $TEMPLATE_DIR/index.html; | ||||
| 
 | ||||
| echo " <!doctype html> | ||||
| <html> | ||||
|     <head> | ||||
|         <title>{% block title %}{% endblock %} - $PROJECT_NAME</title> | ||||
|         <meta charset="utf-8"> | ||||
|         <meta name="viewport" contents="width=device-width, initial-scale=1"> | ||||
|         <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.2.0/css/uikit.min.css" integrity="sha256-5YtK9j+Nl/245lAkSjrIs600d6edKTevi+3JYdjuHhY=" crossorigin="anonymous" /> | ||||
|         <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.2.0/js/uikit.min.js" integrity="sha256-rhLALrRmAQVu/OxzVDpQaiHAEMxiRSN8h8RDydUEh2g=" crossorigin="anonymous"></script> | ||||
|         {% block head %} {% endblock %} | ||||
|     </head> | ||||
|     <body> | ||||
|         <nav class="uk-navbar-container" uk-navbar> | ||||
|             <div class="uk-navbar-left"> | ||||
|                 <a href="" class="uk-navbar-item uk-logo">$PROJECT_NAME</a> | ||||
|             </div> | ||||
|             <div class="uk-navbar-center"> | ||||
|                 <ul class="uk-navbar-nav"> | ||||
|                     <li class="uk-active"><a href="">Nav Item 1</a></li> | ||||
|                     <li><a href="">Nav Item 2</a></li> | ||||
|                     <li><a href="">Nav Item 3</a></li> | ||||
|                     <li><a href="">Nav Item 4</a></li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </nav> | ||||
|         <div class="uk-container"> | ||||
|         {% block content %}{% endblock %} | ||||
|         </div> | ||||
|     </body> | ||||
| </html> | ||||
| " > $TEMPLATE_DIR/base.html; | ||||
| 
 | ||||
| echo "{% extends "base.html" %} | ||||
| {% block title %}$PROJECT_NAME Home{% endblock %} | ||||
| {% block content %} | ||||
| <div> | ||||
| </div> | ||||
| {% endblock %} | ||||
| 
 | ||||
| {% block head %} | ||||
| <style> | ||||
| </style> | ||||
| {% endblock %} | ||||
| " > $TEMPLATE_DIR/index.html; | ||||
| 
 | ||||
| echo "[FlaskCreate] Creating default_settings config file..."; | ||||
| touch $PROJECT_FOLDER/$PROJECT_NAME/default_settings.py; | ||||
| echo "# Default Configuration | ||||
| SECRET_KEY = "" | ||||
| 
 | ||||
| # Flask-SQLAlchemy | ||||
| SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||
| " > $PROJECT_FOLDER/$PROJECT_NAME/default_settings.py; | ||||
| 
 | ||||
| echo "[FlaskCreate] Creating environment config files..."; | ||||
| mkdir $PROJECT_FOLDER/config; | ||||
| touch $PROJECT_FOLDER/config/prod.cfg; touch $PROJECT_FOLDER/config/dev.py | ||||
| 
 | ||||
| PROD_KEY=$(echo $(od -vN 20 -An -tx1 /dev/urandom | tr -d " \n")) | ||||
| DEV_KEY=$(echo $(od -vN 20 -An -tx1 /dev/urandom | tr -d " \n")) | ||||
| echo "# Default Configuration | ||||
| DEBUG = True | ||||
| SECRET_KEY = \"$DEV_KEY\" | ||||
| 
 | ||||
| # Flask-SQLAlchemy | ||||
| SQLALCHEMY_DATABASE_URI = 'sqlite:///../data/acks.db' | ||||
| SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||
| " > $PROJECT_FOLDER/config/dev.cfg | ||||
| 
 | ||||
| echo "# Default Configuration | ||||
| DEBUG = False | ||||
| SECRET_KEY = \"$PROD_KEY\" | ||||
| 
 | ||||
| # Flask-SQLAlchemy | ||||
| SQLALCHEMY_DATABASE_URI = 'sqlite:///../data/acks.db' | ||||
| SQLALCHEMY_TRACK_MODIFICATIONS = False | ||||
| " > $PROJECT_FOLDER/config/prod.cfg | ||||
| 
 | ||||
| echo "[FlaskCreate] Generating a Makefile..."; | ||||
| touch $PROJECT_FOLDER/Makefile; | ||||
| echo -e ".PHONY: run debug clean | ||||
| 
 | ||||
| bin/activate: requirements.txt | ||||
| \t test -f bin/activate || $(which python3) -m venv . | ||||
| \t bin/pip install -Ur requirements.txt | ||||
| \t touch bin/activate | ||||
| 
 | ||||
| run: bin/activate | ||||
| \t . bin/activate; FLASK_SETTINGS_FILE=config/prod.cfg FLASK_ENV=production FLASK_APP=start.py flask run --host=0.0.0.0 | ||||
| 
 | ||||
| debug: bin/activate | ||||
| \t . bin/activate; FLASK_SETTINGS_FILE=config/dev.cfg FLASK_ENV=development FLASK_APP=start.py flask run --host=0.0.0.0 | ||||
| 
 | ||||
| clean: | ||||
| \t rm -rf bin/ include/ lib/ lib64/ __pycache__/ share/; rm pyvenv.cfg | ||||
| " > $PROJECT_FOLDER/Makefile | ||||
| 
 | ||||
| echo "[FlaskCreate] Initializing a git repository and creating initial commit..."; | ||||
| cd $PROJECT_FOLDER; | ||||
| touch $PROJECT_FOLDER/.gitignore | ||||
| echo "# Python | ||||
| *.py[co] | ||||
| 
 | ||||
| # Vim | ||||
| *.swp | ||||
| 
 | ||||
| # Virtualenv | ||||
| bin | ||||
| include | ||||
| lib | ||||
| lib64 | ||||
| __pycache__ | ||||
| share | ||||
| pyvenv.cfg | ||||
| 
 | ||||
| # App specific | ||||
| data | ||||
| config | ||||
| " > $PROJECT_FOLDER/.gitignore | ||||
| git init $PROJECT_FOLDER &> /dev/null; | ||||
| git add . &> /dev/null; | ||||
| git commit -m "Initial commit (FlaskCreate)" &> /dev/null; | ||||
| 
 | ||||
| echo "[FlaskCreate] Creating Python3 virtual environment..."; | ||||
| python3 -m venv $PROJECT_FOLDER | ||||
| source $PROJECT_FOLDER/bin/activate | ||||
| 
 | ||||
| echo "[FlaskCreate] Installing dependencies..."; | ||||
| pip install flask flask-sqlalchemy &> /dev/null | ||||
| pip freeze > $PROJECT_FOLDER/requirements.txt; | ||||
| 
 | ||||
| echo "[FlaskCreate] Finished. Project lives at $PROJECT_FOLDER." | ||||
| cd $PROJECT_FOLDER; | ||||
| 
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user