def main(global_config, **settings): """ This function returns a WSGI application. """ engine = engine_from_config(settings, 'sqlalchemy.') sqla_session = initialize_sql(engine) dogpile_region = cache.make_region() dogpile_region.configure_from_config(settings, 'cache.') def make_backend(): return Backend(sqla_session, settings['fanart.scratch_dir']) class FARequest(Request): fanart_settings = settings have_backend = False cache_region = dogpile_region @reify def backend(self): backend = make_backend() users.get_user(self, backend) self.have_backend = True return backend @property def user(self): return self.backend.logged_in_user @reify def csrf_token(self): token = self.session.get_csrf_token() if hasattr(token, 'decode'): token = token.decode('ascii') return token session_factory = pyramid_beaker.session_factory_from_settings(settings) config = Configurator(settings=settings, root_factory=Site, request_factory=FARequest, session_factory=session_factory, ) deform.Form.set_default_renderer(deform_renderer) config.add_tween('fanart.wsgi_app.autocommit', under=EXCVIEW) config.add_tween('fanart.wsgi_app.add_default_headers', under=EXCVIEW) config.add_subscriber(check_request_for_csrf, NewRequest) config.add_subscriber(set_locale, NewRequest) config.add_translation_dirs('colander:locale/', 'deform:locale/') config.add_static_view('static', 'fanart:static', cache_max_age=3600) config.add_static_view('static-deform', 'deform:static') config.add_static_view('scratch', path=settings['fanart.scratch_dir']) config.add_view('fanart.views.view_root', context='fanart.views.ViewBase') config.add_view('fanart.views:view_403', context='pyramid.httpexceptions.HTTPForbidden') app = config.make_wsgi_app() app._fanart__make_backend = make_backend return app
def get_backend(arguments): filename, source = get_config_filename(arguments) if filename: config_filename = os.path.abspath(filename) del filename if not os.path.exists(config_filename): raise SystemExit('config file does not exist: {}'.format( config_filename)) if arguments['--debug']: print('Using config file {} (from {})'.format(config_filename, source), file=sys.stderr) defaults = {'here': os.path.dirname(config_filename)} config = configparser.ConfigParser(defaults) config.read(config_filename) else: if arguments['--debug']: print('Cannot find config file', file=sys.stderr) config = None def get_value_with_source( argname, config_section, config_key, default=FAIL, boolean=False): if arguments[argname]: return arguments[argname], 'command line' try: section = config[config_section] if boolean: return section.getboolean(config_key), config_filename else: return section[config_key], config_filename except KeyError: pass return default, 'default' def get_value(argname, *args, **kwargs): value, source = get_value_with_source(argname, *args, **kwargs) if value is FAIL: if config: raise SystemExit('{} not given and not found in {}'.format( argname, config_filename)) else: raise SystemExit('{} not given, no config file found'.format( argname)) else: if arguments['--debug']: print('{}={} (from {})'.format(argname, value, source), file=sys.stderr) return value db_url = get_value('--db-url', 'app:main', 'sqlalchemy.url') scratch_die = get_value('--scratch', 'app:main', 'fanart.scratch_dir') guest = get_value('--guest', 'cli', 'guest', False, boolean=True) user = get_value('--user', 'cli', 'user', GUEST if guest else ADMIN) engine = engine_from_config({'url': db_url}, prefix='') db = initialize_sql(engine) backend = Backend(db, scratch_die) if user is ADMIN: backend.login_admin() elif user is GUEST: pass else: backend.login(backend.users[user]) return backend