Mercurial > wikked
changeset 310:bc02d4925096
Don't initialize a wiki instance in Flask until we need one.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 04 Oct 2014 21:19:42 -0700 |
parents | 4097bb36026a |
children | 1c25cb99859f |
files | wikked/views/__init__.py wikked/views/admin.py wikked/views/edit.py wikked/views/history.py wikked/views/read.py wikked/views/special.py wikked/web.py |
diffstat | 7 files changed, 80 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/wikked/views/__init__.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/__init__.py Sat Oct 04 21:19:42 2014 -0700 @@ -6,7 +6,7 @@ from flask.ext.login import current_user from wikked.fs import PageNotFoundError from wikked.utils import split_page_url, get_absolute_url -from wikked.web import app +from wikked.web import app, get_wiki DONT_CHECK = 0 @@ -48,23 +48,25 @@ fields.append('is_resolved') try: - page = g.wiki.getPage(url, fields=fields) + wiki = get_wiki() + page = wiki.getPage(url, fields=fields) except PageNotFoundError: return None if auto_reload: + wiki = get_wiki() path_time = datetime.datetime.fromtimestamp( os.path.getmtime(page.path)) if path_time >= page.cache_time: app.logger.info("Page '%s' has changed, reloading." % url) - g.wiki.updatePage(path=page.path) - page = g.wiki.getPage(url, fields=fields) + wiki.updatePage(path=page.path) + page = wiki.getPage(url, fields=fields) elif not page.is_resolved: app.logger.info("Page '%s' was not resolved, resolving now." % url) - g.wiki.resolve(only_urls=[url]) - g.wiki.index.updatePage(g.wiki.db.getPage( + wiki.resolve(only_urls=[url]) + wiki.index.updatePage(wiki.db.getPage( url, fields=['url', 'path', 'title', 'text'])) - page = g.wiki.getPage(url, fields=fields) + page = wiki.getPage(url, fields=fields) if check_perms == CHECK_FOR_READ and not is_page_readable(page): abort(401) @@ -179,13 +181,14 @@ # just catching up. # Otherwise, everything is synchronous and we need to build the # list if needed. + wiki = get_wiki() build_inline = not app.config['WIKI_ASYNC_UPDATE'] - page_list = g.wiki.db.getPageListOrNone(list_name, fields=fields, + page_list = wiki.db.getPageListOrNone(list_name, fields=fields, valid_only=build_inline) if page_list is None and build_inline: app.logger.info("Regenerating list: %s" % list_name) page_list = builder() - g.wiki.db.addPageList(list_name, page_list) + wiki.db.addPageList(list_name, page_list) return page_list @@ -193,10 +196,11 @@ def get_generic_pagelist_builder(filter_func): def builder(): # Make sure all pages have been resolved. - g.wiki.resolve() + wiki = get_wiki() + wiki.resolve() pages = [] - for page in g.wiki.getPages(no_endpoint_only=True, + for page in wiki.getPages(no_endpoint_only=True, fields=['url', 'title', 'meta']): try: if filter_func(page):
--- a/wikked/views/admin.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/admin.py Sat Oct 04 21:19:42 2014 -0700 @@ -1,13 +1,14 @@ from flask import g, jsonify, abort, request from flask.ext.login import login_user, logout_user, current_user -from wikked.web import app, login_manager +from wikked.web import app, get_wiki, login_manager @app.route('/api/admin/reindex', methods=['POST']) def api_admin_reindex(): if not current_user.is_authenticated() or not current_user.is_admin(): return login_manager.unauthorized() - g.wiki.index.reset(g.wiki.getPages()) + wiki = get_wiki() + wiki.index.reset(wiki.getPages()) result = {'ok': 1} return jsonify(result) @@ -18,7 +19,8 @@ password = request.form.get('password') remember = request.form.get('remember') - user = g.wiki.auth.getUser(username) + wiki = get_wiki() + user = wiki.auth.getUser(username) if user is not None and app.bcrypt: if app.bcrypt.check_password_hash(user.password, password): login_user(user, remember=bool(remember)) @@ -58,7 +60,8 @@ @app.route('/api/user/info/<name>') def api_user_info(name): - user = g.wiki.auth.getUser(name) + wiki = get_wiki() + user = wiki.auth.getUser(name) if user is not None: result = { 'user': {
--- a/wikked/views/edit.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/edit.py Sat Oct 04 21:19:42 2014 -0700 @@ -7,7 +7,7 @@ from wikked.views import (make_page_title, get_page_or_none, is_page_writable, get_page_meta, url_from_viewarg, split_url_from_viewarg) -from wikked.web import app +from wikked.web import app, get_wiki class DummyPage(Page): @@ -67,7 +67,8 @@ def do_edit_page(url, default_message): page = get_page_or_none(url, convert_url=False) if page and not is_page_writable(page): - app.logger.error("Page '%s' is not writable for user '%s'." % (url, current_user.get_id())) + app.logger.error("Page '%s' is not writable for user '%s'." % ( + url, current_user.get_id())) abort(401) if not 'text' in request.form: @@ -85,7 +86,8 @@ 'author': author, 'message': message } - g.wiki.setPage(url, page_fields) + wiki = get_wiki() + wiki.setPage(url, page_fields) result = {'saved': 1} return jsonify(result) @@ -93,7 +95,8 @@ @app.route('/api/edit/', methods=['GET', 'POST']) def api_edit_main_page(): - return api_edit_page(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_edit_page(wiki.main_page_url.lstrip('/')) @app.route('/api/edit/<path:url>', methods=['GET', 'POST']) @@ -130,7 +133,8 @@ url = request.form.get('url') url = url_from_viewarg(url) text = request.form.get('text') - dummy = DummyPage(g.wiki, url, text) + wiki = get_wiki() + dummy = DummyPage(wiki, url, text) resolver = PageResolver(dummy) dummy._setExtendedData(resolver.run()) @@ -158,9 +162,10 @@ try: # Check that there's no page with that name already, and that # the name can be correctly mapped to a filename. - if g.wiki.pageExists(path): + wiki = get_wiki() + if wiki.pageExists(path): raise Exception("Page '%s' already exists" % path) - g.wiki.fs.getPhysicalPagePath(path, make_new=True) + wiki.fs.getPhysicalPagePath(path, make_new=True) except Exception: return '"This page name is invalid or unavailable"' return '"true"'
--- a/wikked/views/history.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/history.py Sat Oct 04 21:19:42 2014 -0700 @@ -9,11 +9,12 @@ from wikked.views import (is_page_readable, get_page_meta, get_page_or_404, url_from_viewarg, CHECK_FOR_READ) -from wikked.web import app +from wikked.web import app, get_wiki def get_history_data(history, needs_files=False): hist_data = [] + wiki = get_wiki() for i, rev in enumerate(reversed(history)): rev_data = { 'index': i + 1, @@ -27,9 +28,9 @@ rev_data['pages'] = [] for f in rev.files: url = None - path = os.path.join(g.wiki.root, f['path']) + path = os.path.join(wiki.root, f['path']) try: - page = g.wiki.db.getPage(path=path) + page = wiki.db.getPage(path=path) # Hide pages that the user can't see. if not is_page_readable(page): continue @@ -54,8 +55,9 @@ @app.route('/api/site-history') def api_site_history(): + wiki = get_wiki() after_rev = request.args.get('rev') - history = g.wiki.getHistory(limit=10, after_rev=after_rev) + history = wiki.getHistory(limit=10, after_rev=after_rev) hist_data = get_history_data(history, needs_files=True) result = {'history': hist_data} return jsonify(result) @@ -63,7 +65,8 @@ @app.route('/api/history/') def api_main_page_history(): - return api_page_history(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_page_history(wiki.main_page_url.lstrip('/')) @app.route('/api/history/<path:url>') @@ -125,7 +128,8 @@ 'author': author, 'message': message } - g.wiki.revertPage(url, page_fields) + wiki = get_wiki() + wiki.revertPage(url, page_fields) result = {'reverted': 1} return jsonify(result)
--- a/wikked/views/read.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/read.py Sat Oct 04 21:19:42 2014 -0700 @@ -8,7 +8,7 @@ url_from_viewarg, split_url_from_viewarg, RedirectNotFound, CircularRedirectError, CHECK_FOR_READ) -from wikked.web import app +from wikked.web import app, get_wiki from wikked.scm.base import STATE_NAMES @@ -43,7 +43,8 @@ @app.route('/api/list/<path:url>') def api_list_pages(url): - pages = filter(is_page_readable, g.wiki.getPages(url_from_viewarg(url))) + wiki = get_wiki() + pages = filter(is_page_readable, wiki.getPages(url_from_viewarg(url))) page_metas = [get_page_meta(page) for page in pages] result = {'path': url, 'pages': list(page_metas)} return jsonify(result) @@ -51,7 +52,8 @@ @app.route('/api/read/') def api_read_main_page(): - return api_read_page(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_read_page(wiki.main_page_url.lstrip('/')) @app.route('/api/read/<path:url>') @@ -107,7 +109,8 @@ convert_url=False, check_perms=CHECK_FOR_READ) - endpoint_info = g.wiki.endpoints.get(endpoint) + wiki = get_wiki() + endpoint_info = wiki.endpoints.get(endpoint) if endpoint_info is not None: # We have some information about this endpoint... if endpoint_info.default and info_page is None: @@ -131,7 +134,7 @@ # Get the list of pages to show here. value = path.lstrip('/') query = {endpoint: [value]} - pages = g.wiki.getPages(meta_query=query, + pages = wiki.getPages(meta_query=query, fields=['url', 'title', 'text', 'meta']) tpl_data = { 'name': endpoint, @@ -167,7 +170,8 @@ @app.route('/api/raw/') def api_read_main_page_raw(): - return api_read_page_raw(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_read_page_raw(wiki.main_page_url.lstrip('/')) @app.route('/api/raw/<path:url>') @@ -181,8 +185,9 @@ @app.route('/api/query') def api_query(): + wiki = get_wiki() query = dict(request.args) - pages = g.wiki.getPages(meta_query=query) + pages = wiki.getPages(meta_query=query) result = { 'query': query, 'pages': [get_page_meta(p) for p in pages] @@ -192,7 +197,8 @@ @app.route('/api/state/') def api_get_main_page_state(): - return api_get_state(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_get_state(wiki.main_page_url.lstrip('/')) @app.route('/api/state/<path:url>') @@ -208,7 +214,8 @@ @app.route('/api/outlinks/') def api_get_main_page_outgoing_links(): - return api_get_outgoing_links(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_get_outgoing_links(wiki.main_page_url.lstrip('/')) @app.route('/api/outlinks/<path:url>') @@ -233,7 +240,8 @@ @app.route('/api/inlinks/') def api_get_main_page_incoming_links(): - return api_get_incoming_links(g.wiki.main_page_url.lstrip('/')) + wiki = get_wiki() + return api_get_incoming_links(wiki.main_page_url.lstrip('/')) @app.route('/api/inlinks/<path:url>')
--- a/wikked/views/special.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/views/special.py Sat Oct 04 21:19:42 2014 -0700 @@ -4,7 +4,7 @@ get_or_build_pagelist, get_generic_pagelist_builder, get_redirect_target, CircularRedirectError, RedirectNotFound) from wikked.utils import get_absolute_url -from wikked.web import app +from wikked.web import app, get_wiki def orphans_filter_func(page): @@ -58,7 +58,8 @@ abort(400) readable_hits = [] - hits = list(g.wiki.index.search(query)) + wiki = get_wiki() + hits = list(wiki.index.search(query)) for h in hits: page = get_page_or_none(h.url, convert_url=False) if page is not None and is_page_readable(page): @@ -81,7 +82,8 @@ abort(400) readable_hits = [] - hits = list(g.wiki.index.previewSearch(query)) + wiki = get_wiki() + hits = list(wiki.index.previewSearch(query)) for h in hits: page = get_page_or_none(h.url, convert_url=False) if page is not None and is_page_readable(page):
--- a/wikked/web.py Sat Oct 04 21:05:49 2014 -0700 +++ b/wikked/web.py Sat Oct 04 21:19:42 2014 -0700 @@ -73,6 +73,16 @@ wiki.db.removeAllPageLists() +def get_wiki(): + wiki = getattr(g, '_wiki', None) + if wiki is None: + wiki = Wiki(app.wiki_params) + wiki.post_update_hooks.append(remove_page_lists) + wiki.start() + g.wiki = wiki + return wiki + + # Set the default wiki parameters. app.wiki_params = WikiParameters(wiki_root) @@ -84,10 +94,7 @@ # access to the context instance for the wiki. @app.before_request def before_request(): - wiki = Wiki(app.wiki_params) - wiki.post_update_hooks.append(remove_page_lists) - wiki.start() - g.wiki = wiki + pass @app.teardown_request @@ -109,7 +116,8 @@ # Login extension. def user_loader(username): - return g.wiki.auth.getUser(username) + wiki = get_wiki() + return wiki.auth.getUser(username) from flask.ext.login import LoginManager