<html><head></head><body><div style="font-family: Verdana;font-size: 12.0px;"><div>Hi all,</div>
<div> </div>
<div>I've a running project and want to know how to improve/refine it.</div>
<div>As I said it is running, but I don't know if the code is well-structured.</div>
<div> </div>
<div>Is there a better way to teach the uwsgi to output in json format?</div>
<div>The return of app.app in create_app looks strange, but seems correct?!</div>
<div> </div>
<div> </div>
<div>app.py</div>
<div> </div>
<div>
<div>import os<br/>
from project import create_app</div>
<div>app=create_app(os.environ.get('FLASK_CONFIG'))</div>
<div> </div>
<div> </div>
<div>project/__init__.py</div>
<div> </div>
<div>
<div>import os<br/>
import json<br/>
import pytz<br/>
import connexion<br/>
from datetime import datetime<br/>
import logging<br/>
import logging.config<br/>
from flask import Flask, url_for, redirect, request, request_started<br/>
from config import config_by_name<br/>
from flask_sqlalchemy import SQLAlchemy<br/>
from custom_logging import CustomJsonFormatter</div>
<div>db = SQLAlchemy()</div>
<div> </div>
<div>def create_app(config_name):</div>
<div> app = connexion.FlaskApp(__name__)<br/>
app.add_api('swagger.yaml')<br/>
app.app.config.from_object(config_by_name[config_name])</div>
<div> db.init_app(app.app)</div>
<div> </div>
<div> logger = logging.getLogger('connexion.app')<br/>
logHandler = logging.StreamHandler()<br/>
formatter = CustomJsonFormatter()<br/>
logHandler.setFormatter(formatter)<br/>
logger.setLevel(logging.DEBUG)<br/>
logger.addHandler(logHandler)</div>
<div> </div>
<div> def _init_logging():<br/>
logger = logging.getLogger()<br/>
logger.setLevel(logging.DEBUG)<br/>
logger.addHandler(logHandler)</div>
<div> </div>
<div> try:<br/>
@postfork<br/>
def init():<br/>
_init_logging()<br/>
except:</div>
<div> pass</div>
<div> </div>
<div> _init_logging()<br/>
return app.app</div>
<div> </div>
<div> </div>
<div> </div>
<div>custom_logging.py</div>
<div> </div>
<div>
<div>from datetime import datetime<br/>
from pythonjsonlogger import jsonlogger<br/>
import pytz</div>
<div>ATTR_TO_JSON = ['msg', 'name', 'threadName', 'levelname', 'levelno', 'X-Correlation-Id']</div>
<div>class CustomJsonFormatter(jsonlogger.JsonFormatter):<br/>
def add_fields(self, log_record, record, message_dict):<br/>
super(CustomJsonFormatter, self).add_fields(log_record, record, message_dict)</div>
<div><br/>
obj = {attr: getattr(record, attr, '')<br/>
for attr in ATTR_TO_JSON}</div>
<div> log_record['thread_name'] = obj.pop('threadName')<br/>
log_record['level'] = obj.pop('levelname')<br/>
log_record['level_value'] = obj.pop('levelno')<br/>
log_record['log'] = obj.pop('msg')<br/>
log_record['logger_name'] = obj.pop('name')<br/>
log_record['X-Correlation-Id'] = obj.pop('X-Correlation-Id')</div>
<div><br/>
dtObject = datetime.now()<br/>
local_tz = pytz.timezone('Europe/Berlin')<br/>
local_tz.localize(dtObject)<br/>
tz_date = local_tz.localize(dtObject).isoformat()<br/>
log_record['timestamp'] = tz_date</div>
</div>
<div> </div>
<div> </div>
<div> </div>
<div>wsgi.ini</div>
<div> </div>
<div>
<div>[uwsgi]<br/>
project = a_sample_api<br/>
http = 0.0.0.0:7889<br/>
socket = :7888<br/>
chmod-socket = 666</div>
<div>module = app:app<br/>
master = true<br/>
processes = 5<br/>
vacuum = true<br/>
die-on-term = true<br/>
pidfile = /tmp/%(project).pid</div>
<div>paste-logger = true<br/>
disable-logging = true<br/>
log-reopen=true<br/>
log-format = %(msg)</div>
<div> </div>
<div> </div>
<div> </div>
<div>Regards,</div>
<div>Sascha</div>
</div>
</div>
</div></div></body></html>