コード例 #1
0
ファイル: handlers.py プロジェクト: eklitzke/graff
    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
            }
コード例 #2
0
ファイル: handlers.py プロジェクト: eklitzke/graff
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)