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