Brandon Cornejo
5 years ago
commit
2e18ae47ee
1 changed files with 273 additions and 0 deletions
-
273flask-create.sh
@ -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; |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue