Created
April 30, 2014 03:31
-
-
Save maxp/11417535 to your computer and use it in GitHub Desktop.
python-session-example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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