Fixes for use with gunicorn reload and debug

This commit is contained in:
Antonio de la Rosa 2017-02-06 04:45:31 +01:00
parent d8d803e85a
commit 5ae46996fe
3 changed files with 90 additions and 148 deletions

View file

@ -1,7 +1,7 @@
import os, sys, traceback, inspect, resource import os, sys, traceback, inspect, resource
from importlib import import_module from importlib import import_module
from bottle import route, get, post, run, default_app, abort, request, response, static_file, load, hook, error from bottle import route, get, post, run, default_app, abort, request, response, static_file, load, hook, error, debug, redirect
from settings import config, modules from settings import config
#from beaker.middleware import SessionMiddleware #from beaker.middleware import SessionMiddleware
from mimetypes import guess_type from mimetypes import guess_type
from paramecio.cromosoma.webmodel import WebModel from paramecio.cromosoma.webmodel import WebModel
@ -9,6 +9,11 @@ from paramecio.citoplasma.datetime import set_timezone
from itsdangerous import JSONWebSignatureSerializer from itsdangerous import JSONWebSignatureSerializer
from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key
from paramecio.wsgiapp import app from paramecio.wsgiapp import app
modules_pass=False
#app.reset()
#from paramecio.citoplasma.sessions import generate_session #from paramecio.citoplasma.sessions import generate_session
#Prepare links for static. #Prepare links for static.
@ -17,6 +22,62 @@ from paramecio.wsgiapp import app
#def create_app(): #def create_app():
workdir=os.getcwd() workdir=os.getcwd()
arr_module_path={} arr_module_path={}
def prepare_app():
def print_memory():
print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
routes={}
module_loaded=None
#Getting paths for loaded modules for use in media load files
for module in config.modules:
#controller_path=sys.modules[module]
controller_base=sys.modules[module].__path__[0]
base_module=module.split('.')[-1]
arr_module_path[base_module]=controller_base
#app.add_hook('before_request', print_memory)
if config.session_enabled==True:
#Create dir for sessions
if 'session.data_dir' in config.session_opts:
if not os.path.isdir(config.session_opts['session.data_dir']):
os.makedirs(config.session_opts['session.data_dir'], 0o700, True)
set_timezone()
# Clean last slash
@app.hook('before_request')
def strip_path():
request.environ['PATH_INFO'] = request.environ['PATH_INFO'].rstrip('/')
# Set error screen if not debug setted
if config.debug==False:
@app.error(404)
def error404(error):
return 'Error: page not found'
debug(config.debug)
#Prepare app
application=app
# Prepare static routes
if config.yes_static==True: if config.yes_static==True:
@app.route('/media/<filename:path>') @app.route('/media/<filename:path>')
@ -45,154 +106,35 @@ if config.yes_static==True:
else: else:
mimetype=guess_type(path_module+'/'+filename) mimetype=guess_type(path_module+'/'+filename)
return static_file(filename, root=path_module) return static_file(filename, root=path_module)
"""
else:
def add_func_static_module(module): # Load modules
pass
"""
def print_memory(): try:
print(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
#print(request.cookies)
routes={} from settings import modules
module_loaded=None prepare_app()
#Getting paths for loaded modules for use in media load files except:
for module in config.modules:
#controller_path=sys.modules[module]
controller_base=sys.modules[module].__path__[0]
base_module=module.split('.')[-1]
arr_module_path[base_module]=controller_base
#Prepare ssl
if config.ssl==True:
from citoplasma.gunicornssl import GunicornServerSSL
GunicornServerSSL.cert_pem=config.cert_pem
GunicornServerSSL.privkey_pem=config.privkey_pem
config.server_used=GunicornServerSSL
#Prepare app
application=app
#app.add_hook('before_request', print_memory)
#app.add_hook('after_request', WebModel.close)
if config.session_enabled==True:
#Create dir for sessions
if 'session.data_dir' in config.session_opts:
if not os.path.isdir(config.session_opts['session.data_dir']):
os.makedirs(config.session_opts['session.data_dir'], 0o700, True)
"""
key_encrypt=config.key_encrypt
if config.session_opts['session.type']=='file':
def load_session():
code_session=request.get_cookie(config.cookie_name, secret=config.key_encrypt)
if code_session==None:
# Send cookie
generate_session()
else:
# Check if file exists
if os.path.isfile(config.session_opts['session.data_dir']+'/session_'+code_session):
with open(config.session_opts['session.data_dir']+'/session_'+code_session, 'r') as f:
@app.route('/')
def catch_errors(all='/'):
try: try:
from pathlib import Path
s = JSONWebSignatureSerializer(key_encrypt) from settings import modules
session_dict=f.read() import time
request.environ[config.cookie_name]=s.loads(session_dict) prepare_app()
request.environ[config.cookie_name]['token']=code_session p=Path('index.py')
p.touch()
time.sleep(1)
except: except:
raise
# Clean fake session redirect(request.url)
catch_errors=app.route('/<all:path>')(catch_errors)
try:
os.remove(config.session_opts['session.data_dir']+'/session_'+code_session)
except:
pass
generate_session()
else:
request.environ[config.cookie_name]={'token': code_session}
def save_session():
save_session=request.environ[config.cookie_name]
if 'save' in save_session:
del save_session['save']
# Here define the session type, if memcached, save data in memcached
try:
with open(config.session_opts['session.data_dir']+'/session_'+save_session['token'], 'w') as f:
s = JSONWebSignatureSerializer(key_encrypt)
json_encode=s.dumps(save_session)
f.write(json_encode.decode('utf8'))
except:
pass
#request.environ[config.cookie_name]['save']
#def save_session()
app.add_hook('before_request', load_session)
app.add_hook('after_request', save_session)
#def
"""
#app = SessionMiddleware(app, config.session_opts, environ_key=config.cookie_name)
# Clean last slash
@app.hook('before_request')
def strip_path():
request.environ['PATH_INFO'] = request.environ['PATH_INFO'].rstrip('/')
# Set error screen if not debug setted
if config.debug==False:
@app.error(404)
def error404(error):
return 'Error: page not found'
"""
else:
@app.error(500)
def error500(error):
return error
"""
set_timezone()
def run_app(app): def run_app(app):
run(app=app, host=config.host, server=config.server_used, port=config.port, debug=config.debug, reloader=config.reloader, interval=0.5)
"""
if __name__ == "__main__":
run(app=app, host=config.host, server=config.server_used, port=config.port, debug=config.debug, reloader=config.reloader) run(app=app, host=config.host, server=config.server_used, port=config.port, debug=config.debug, reloader=config.reloader)
#else:
#return run(app=app, host=config.host, server=config.server_used, port=config.port, debug=config.debug, reloader=config.reloader)
"""

View file

@ -4,6 +4,7 @@ from paramecio.citoplasma.mtemplates import PTemplate, env_theme
from paramecio.citoplasma.urls import make_url from paramecio.citoplasma.urls import make_url
from paramecio.wsgiapp import app from paramecio.wsgiapp import app
from settings import config from settings import config
from bottle import request
#t=ptemplate(__file__) #t=ptemplate(__file__)
env=env_theme(__file__) env=env_theme(__file__)
@ -17,7 +18,6 @@ def home():
@app.route('/welcome/<id:int>') @app.route('/welcome/<id:int>')
def page(id): def page(id):
return t.render_template('index.html', title="A simple example of a page", id=id, value=request.query.value) return t.render_template('index.html', title="A simple example of a page", id=id, value=request.query.value)
@app.route('/welcome/test/<id:int>') @app.route('/welcome/test/<id:int>')

View file

@ -1,5 +1,5 @@
from bottle import Bottle import bottle
app=Bottle() app=bottle.app()