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