# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# MIT License. See license.txt
import sys, os
import json
sys.path.insert(0, '.')
sys.path.insert(0, 'app')
sys.path.insert(0, 'lib')
from werkzeug.wrappers import Request, Response
from werkzeug.local import LocalManager
from werkzeug.wsgi import SharedDataMiddleware
from werkzeug.exceptions import HTTPException, NotFound
from werkzeug.contrib.profiler import ProfilerMiddleware
import mimetypes
import webnotes
import webnotes.handler
import webnotes.auth
import webnotes.api
import webnotes.webutils
from webnotes.utils import get_site_name
local_manager = LocalManager([webnotes.local])
_site = None
def handle_session_stopped():
res = Response("""
Updating.
We will be back in a few moments...
""")
res.status_code = 503
res.content_type = 'text/html'
return res
@Request.application
def application(request):
webnotes.local.request = request
try:
site = _site or get_site_name(request.host)
webnotes.init(site=site)
if not webnotes.local.conf:
# site does not exist
raise NotFound
webnotes.local.form_dict = webnotes._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \
for k, v in (request.form or request.args).iteritems() })
webnotes.local._response = Response()
webnotes.http_request = webnotes.auth.HTTPRequest()
if webnotes.local.form_dict.cmd:
webnotes.handler.handle()
elif webnotes.request.path.startswith("/api/"):
webnotes.api.handle()
elif webnotes.local.request.method in ('GET', 'HEAD'):
webnotes.webutils.render(webnotes.request.path[1:])
else:
raise NotFound
except HTTPException, e:
return e
except webnotes.AuthenticationError, e:
webnotes._response.status_code=401
except webnotes.SessionStopped, e:
webnotes.local._response = handle_session_stopped()
finally:
if webnotes.conn:
webnotes.conn.close()
return webnotes.local._response
application = local_manager.make_middleware(application)
def serve(port=8000, profile=False, site=None):
global application, _site
_site = site
from werkzeug.serving import run_simple
if profile:
application = ProfilerMiddleware(application)
if not os.environ.get('NO_STATICS'):
application = SharedDataMiddleware(application, {
'/assets': 'assets',
})
if site:
application = SharedDataMiddleware(application, {
'/files': os.path.join(site, 'public', 'files')
})
run_simple('0.0.0.0', int(port), application, use_reloader=True,
use_debugger=True, use_evalex=True)