add project skeleton code
parent
eee6e17037
commit
566f631bf6
@ -0,0 +1,20 @@
|
||||
setup:
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install -r requirements.txt
|
||||
|
||||
shell:
|
||||
bash manage.sh shell
|
||||
|
||||
dev:
|
||||
bash manage.sh run
|
||||
|
||||
prod:
|
||||
bash manage.sh prod
|
||||
|
||||
huey:
|
||||
mkdir -p data/
|
||||
.venv/bin/huey_consumer suchwowx.tasks.huey -w 1 -v | tee -a data/huey.log
|
||||
|
||||
kill:
|
||||
pkill -e -f huey
|
||||
pkill -e -f suchwowx
|
@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
|
||||
source .venv/bin/activate
|
||||
export FLASK_APP=suchwowx/app.py
|
||||
export FLASK_SECRETS=config.py
|
||||
export FLASK_DEBUG=1
|
||||
export FLASK_ENV=development
|
||||
|
||||
# override
|
||||
export $(cat .env)
|
||||
|
||||
if [[ ${1} == "prod" ]];
|
||||
then
|
||||
export BASE=./data/gunicorn
|
||||
export FLASK_ENV=production
|
||||
export FLASK_DEBUG=0
|
||||
mkdir -p $BASE
|
||||
pgrep -F $BASE/gunicorn.pid
|
||||
if [[ $? != 0 ]]; then
|
||||
gunicorn \
|
||||
--bind 127.0.0.1:4000 "suchwowx.app:app" \
|
||||
--daemon \
|
||||
--log-file $BASE/gunicorn.log \
|
||||
--pid $BASE/gunicorn.pid \
|
||||
--reload
|
||||
sleep 2
|
||||
echo "Started gunicorn on 127.0.0.1:4000 with pid $(cat $BASE/gunicorn.pid)"
|
||||
fi
|
||||
else
|
||||
flask $@
|
||||
fi
|
@ -0,0 +1,14 @@
|
||||
arrow
|
||||
Flask
|
||||
Flask-WTF
|
||||
Flask-SQLAlchemy
|
||||
Flask-Mobility
|
||||
peewee
|
||||
gunicorn
|
||||
huey
|
||||
redis
|
||||
Pillow
|
||||
ipfshttpclient
|
||||
python-dotenv
|
||||
requests
|
||||
web3
|
@ -0,0 +1,12 @@
|
||||
from logging.config import dictConfig
|
||||
|
||||
from suchwowx.factory import create_app
|
||||
from suchwowx import config
|
||||
|
||||
|
||||
app = create_app()
|
||||
|
||||
dictConfig(config.LOGGING_CONFIG)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run()
|
@ -0,0 +1,56 @@
|
||||
from os import getenv
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
# App
|
||||
SECRET_KEY = getenv('SECRET_KEY', 'yyyyyyyyyyyyy') # whatever you want it to be
|
||||
DATA_FOLDER = getenv('DATA_FOLDER', '/path/to/uploads') # some stable storage path
|
||||
SERVER_NAME = getenv('SERVER_NAME', '127.0.0.1:5000') # name of your DNS resolvable site (.com)
|
||||
|
||||
# Cache
|
||||
CACHE_HOST = getenv('CACHE_HOST', 'localhost')
|
||||
CACHE_PORT = getenv('CACHE_PORT', 6379)
|
||||
|
||||
# Uploads
|
||||
SESSION_TYPE = 'filesystem'
|
||||
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'svg', 'mp4', 'webp'}
|
||||
MAX_CONTENT_LENGTH = 32 * 1024 * 1024
|
||||
TEMPLATES_AUTO_RELOAD = getenv('TEMPLATES_AUTO_RELOAD', True)
|
||||
|
||||
# Logging
|
||||
LOGGING_CONFIG = {
|
||||
'version': 1,
|
||||
'formatters': {'default': {
|
||||
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
|
||||
}},
|
||||
'handlers': {
|
||||
'console': {
|
||||
'level': 'INFO',
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'default',
|
||||
'stream': 'ext://sys.stdout',
|
||||
},
|
||||
'wsgi': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'stream': 'ext://flask.logging.wsgi_errors_stream',
|
||||
'formatter': 'default'
|
||||
}
|
||||
},
|
||||
'loggers': {
|
||||
'gunicorn.error': {
|
||||
'handlers': ['console'],
|
||||
'level': 'INFO',
|
||||
'propagate': False,
|
||||
},
|
||||
'gunicorn.access': {
|
||||
'handlers': ['console'],
|
||||
'level': 'INFO',
|
||||
'propagate': False,
|
||||
}
|
||||
},
|
||||
'root': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['console'],
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
from logging.config import dictConfig
|
||||
|
||||
from flask import Flask
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from flask_mobility import Mobility
|
||||
|
||||
from suchwowx import config
|
||||
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
|
||||
def setup_db(app: Flask, db:SQLAlchemy=db):
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite://{config.DATA_FOLDER}/sqlite.db' # noqa
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
db.init_app(app)
|
||||
return db
|
||||
|
||||
def create_app_huey():
|
||||
app = Flask(__name__)
|
||||
db = SQLAlchemy()
|
||||
dictConfig(config.LOGGING_CONFIG)
|
||||
setup_db(app, db)
|
||||
return app
|
||||
|
||||
def create_app():
|
||||
app = Flask(__name__)
|
||||
app.config.from_envvar('FLASK_SECRETS')
|
||||
setup_db(app)
|
||||
Mobility(app)
|
||||
|
||||
with app.app_context():
|
||||
from suchwowx import filters, routes
|
||||
app.register_blueprint(filters.bp)
|
||||
app.register_blueprint(routes.bp)
|
||||
return app
|
@ -0,0 +1,15 @@
|
||||
from flask import Blueprint
|
||||
from arrow import get as arrow_get
|
||||
|
||||
|
||||
bp = Blueprint('filters', 'filters')
|
||||
|
||||
@bp.app_template_filter('shorten_address')
|
||||
def shorten_address(a):
|
||||
_p = a[0:4]
|
||||
_s = a[-4:]
|
||||
return f'{_p}...{_s}'
|
||||
|
||||
@bp.app_template_filter('humanize')
|
||||
def humanize(d):
|
||||
return arrow_get(d).humanize()
|
@ -0,0 +1,13 @@
|
||||
from uuid import uuid4
|
||||
|
||||
from suchwowx.factory import db
|
||||
|
||||
|
||||
def rand_id():
|
||||
return uuid4().hex
|
||||
|
||||
|
||||
class User(db.Model):
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
@ -0,0 +1,8 @@
|
||||
from flask import Blueprint
|
||||
|
||||
|
||||
bp = Blueprint('meta', 'meta')
|
||||
|
||||
@bp.route('/')
|
||||
def index():
|
||||
return 'interplanetary memes'
|
@ -0,0 +1,12 @@
|
||||
from huey import RedisHuey
|
||||
|
||||
from suchwowx.factory import create_app_huey
|
||||
from suchwowx import config
|
||||
|
||||
|
||||
huey = RedisHuey(
|
||||
host=config.CACHE_HOST,
|
||||
port=config.CACHE_PORT
|
||||
)
|
||||
|
||||
app = create_app_huey()
|
Loading…
Reference in New Issue