Skip to content

Instantly share code, notes, and snippets.

@maxp
Created April 30, 2014 03:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maxp/11417535 to your computer and use it in GitHub Desktop.
Save maxp/11417535 to your computer and use it in GitHub Desktop.
python-session-example
# -*- coding: utf-8 -*-
"""
mpws: main
@author: maxp
"""
from datetime import datetime, timedelta
import conf
import logging.config
logging.config.fileConfig( conf.LOGGING_CONF )
from werkzeug.wrappers import Request
from werkzeug.exceptions import HTTPException
from auth.user import User #, AuthToken #, Profile9
from lib import local, local_manager
from lib.db import db_main as db
from lib.db import db_meteo
from lib.db import angara_db, ensure_index
from lib.frame import Ctx, MainMenu
from lib.sess import Session, sess_track, \
SESS_TS, SESS_IP, SESSTRACK_EVT_NEW_IP, SESSTRACK_EVT_MARK, SESSTRACK_MARK_TIME
import tourserv.recs
import search.sitemap
# import it after all other imports
from urls import url_map
class App(object):
def __init__(self):
self.mainmenu = MainMenu()
self.sitemap = search.sitemap.Sitemap()
self.servrecs = tourserv.recs.ServRecs()
#--
def prepare_db(self):
ensure_index()
#--
def serve(self, environ, request):
request.max_content_length = conf.REQUEST_MAX_LENGTH
try:
sess = Session.load(
str(request.cookies.get(conf.SESS_COOKIE)), local.db_angara
)
user = User.from_sess(sess)
ctx = Ctx(app=self, conf=conf, request=request, session=sess, user=user)
if user.is_auth():
if sess.get(SESS_IP) != ctx.remote_addr:
sess.put(SESS_IP, ctx.remote_addr)
sess_track(ctx, local.angara_db, SESSTRACK_EVT_NEW_IP)
else:
utcnow = datetime.utcnow()
sess_ts = sess.get_ts()
if not sess_ts:
sess.put(SESS_TS, utcnow)
elif utcnow > sess_ts + timedelta(microseconds=1000*SESSTRACK_MARK_TIME):
sess.put(SESS_TS, utcnow)
sess_track(ctx, local.angara_db, SESSTRACK_EVT_MARK)
#-
#-
#-
local.urls = url_map.bind_to_environ(environ)
response = local.urls.dispatch(lambda e,v: e(ctx,**v))
if (sess.is_modified() or sess.new_sid) and hasattr(response, "set_cookie"):
kwa = dict(domain=conf.SESS_DOMAIN, httponly=True)
if not sess.get('tmp'):
kwa['max_age'] = conf.SESS_MAX_AGE
response.set_cookie(conf.SESS_COOKIE, sess.sid, **kwa)
#-
sess.save(local.db_angara) # if modified_keys
# except NotFound, e:
# response = views.not_found(request)
# response.status_code = 404
except HTTPException as e:
response = e
return response
#--
def __call__(self, environ, start_response ):
try:
local.db_main = db
local.db_meteo = db_meteo
local.db_angara = angara_db()
response = self.serve(environ, Request(environ))
return response(environ, start_response)
finally:
local_manager.cleanup()
db_meteo.remove()
db.remove()
#--
#--
from logbook.handlers import StderrHandler
handler = StderrHandler(
format_string=u'[{record.time:%Y-%m-%d %H:%M:%S}] {record.level_name} {record.channel}: {record.message}'
)
handler.push_application()
from logbook import Logger
log = Logger("main")
log.info("anga: start App()")
# with logbook_handler
application = App()
application.prepare_db()
if __name__ == '__main__':
from werkzeug import run_simple
run_simple(
conf.DEV_HOST, conf.DEV_PORT,
application, threaded=True, processes=1,
use_reloader=True, use_debugger=conf.DEBUG,
)
#--
#.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment