def initialize(self): super(RequestHandler, self).initialize() self._force_rollback = False self._session = None self._force_redirect = None flash_cookie = self.get_cookie('flash') if flash_cookie: self.flash = Flash.load(url_unescape(flash_cookie)) else: self.flash = Flash() host = self.request.host.lower() self.production = (host == 'graffspotting.com' or host.endswith('.graffspotting.com')) mobile = None mobile_cookie = self.get_cookie('m', None) if mobile_cookie is None: if detect_mobile(self.request.headers.get('User-Agent')): self.set_cookie('m', '1') mobile = True if host == 'graffspotting.com': self._force_redirect = 'm.graffspotting.com' return else: mobile = False self.set_cookie('m', '0') elif host == 'm.graffspotting.com' and mobile_cookie == '0': self._force_redirect = 'graffspotting.com' return elif host == 'graffspotting.com' and mobile_cookie == '1': self._force_redirect = 'm.graffspotting.com' return if mobile is None: mobile = mobile_cookie == '1' user_id = self.get_secure_cookie('s') if user_id: user_id, = struct.unpack('<I', user_id) self.user = db.User.by_id(self.session, user_id) else: self.user = None # ensure the user has a unique visitor cookie if self.get_secure_cookie('v', None) is None: self.set_secure_cookie('v', os.urandom(10)) self.env = { 'config': config, 'debug': self.settings['debug'], 'esc': url_escape, 'flash': self.flash, 'gmaps_api_key': config.get('gmaps_api_key', 'AIzaSyCTd_7j6ZeXATLOfTvpAqaqCkxM0zFP5Oc'), 'is_error': False, 'mobile': mobile, 'today': datetime.date.today(), 'user': self.user }
class RequestHandler(tornado.web.RequestHandler): def initialize(self): super(RequestHandler, self).initialize() self._force_rollback = False self._session = None self._force_redirect = None flash_cookie = self.get_cookie('flash') if flash_cookie: self.flash = Flash.load(url_unescape(flash_cookie)) else: self.flash = Flash() host = self.request.host.lower() self.production = (host == 'graffspotting.com' or host.endswith('.graffspotting.com')) mobile = None mobile_cookie = self.get_cookie('m', None) if mobile_cookie is None: if detect_mobile(self.request.headers.get('User-Agent')): self.set_cookie('m', '1') mobile = True if host == 'graffspotting.com': self._force_redirect = 'm.graffspotting.com' return else: mobile = False self.set_cookie('m', '0') elif host == 'm.graffspotting.com' and mobile_cookie == '0': self._force_redirect = 'graffspotting.com' return elif host == 'graffspotting.com' and mobile_cookie == '1': self._force_redirect = 'm.graffspotting.com' return if mobile is None: mobile = mobile_cookie == '1' user_id = self.get_secure_cookie('s') if user_id: user_id, = struct.unpack('<I', user_id) self.user = db.User.by_id(self.session, user_id) else: self.user = None # ensure the user has a unique visitor cookie if self.get_secure_cookie('v', None) is None: self.set_secure_cookie('v', os.urandom(10)) self.env = { 'config': config, 'debug': self.settings['debug'], 'esc': url_escape, 'flash': self.flash, 'gmaps_api_key': config.get('gmaps_api_key', 'AIzaSyCTd_7j6ZeXATLOfTvpAqaqCkxM0zFP5Oc'), 'is_error': False, 'mobile': mobile, 'today': datetime.date.today(), 'user': self.user } def prepare(self): """This has to be done in prepare() instead of initialize(), in order for redirects to work with flush(). """ super(RequestHandler, self).prepare() if self._force_redirect is not None: redir_loc = self.request.protocol + '://' + self._force_redirect + self.request.path if self.request.query: redir_loc += '?' + self.request.query self.redirect(redir_loc) def set_cookie(self, name, value, domain=None, **kwargs): if domain is None and self.production: domain = 'graffspotting.com' return super(RequestHandler, self).set_cookie(name, value, domain, **kwargs) def set_secure_cookie(self, name, value, key=None, timestamp=True, **kwargs): if key is None: key = config.get('cookie_secret') value = str(value) if timestamp: value += struct.pack('<I', int(time.time())) return self.set_cookie(name, crypto.encrypt_string(value, key=key), **kwargs) def get_secure_cookie(self, name, default=None, key=None, timestamp=True): if key is None: key = config.get('cookie_secret') val = self.get_cookie(name, default) if val == default: return val try: val = crypto.decrypt_string(val, key=key) if timestamp: val = val[:-struct.calcsize('<I')] # chop off the timestamp return val except ValueError: self.clear_cookie(name) return default @property def session(self): if self._session is None: self._session = db.Session() self._session.rollback() # XXX: fixme return self._session def finish(self, chunk=None): if self._session is not None: if self._force_rollback or self.request.method != 'POST': self.session.rollback() else: self.session.commit() if not self.flash.empty: self.set_cookie('flash', url_escape(self.flash.dump())) elif 'flash' in self.request.cookies: self.clear_cookie('flash') return super(RequestHandler, self).finish(chunk) def write_error(self, status_code, **kwargs): self._force_rollback = True self.set_header('Content-Type', 'text/html') e = {'env': self.env, 'debug': self.settings['debug'], 'flash': self.flash, 'mobile': self.env['mobile'], 'is_error': False, 'user': self.env['user'], 'title': httplib.responses[status_code], } if 500 <= status_code <= 599: e['is_error'] = True tb = [] for line in traceback.format_exception(*kwargs['exc_info']): tb.append(line) e['traceback'] = '\n'.join(tb) self.write(self.render_string("error.html", **e)) return self.finish() def render(self, name): return super(RequestHandler, self).render(name, **self.env)