From 52da4fb4f1726326b81a06124bd5d434461df42d Mon Sep 17 00:00:00 2001 From: nagaetty Date: Mon, 12 Nov 2012 09:54:09 +0900 Subject: [PATCH] first commit --- html/.buildinfo | 4 + html/.doctrees/api.doctree | Bin 0 -> 379925 bytes html/.doctrees/async.doctree | Bin 0 -> 33023 bytes html/.doctrees/changelog.doctree | Bin 0 -> 92591 bytes html/.doctrees/contact.doctree | Bin 0 -> 11120 bytes html/.doctrees/deployment.doctree | Bin 0 -> 53333 bytes html/.doctrees/development.doctree | Bin 0 -> 61385 bytes html/.doctrees/environment.pickle | Bin 0 -> 1571655 bytes html/.doctrees/faq.doctree | Bin 0 -> 15336 bytes html/.doctrees/index.doctree | Bin 0 -> 27727 bytes html/.doctrees/plugindev.doctree | Bin 0 -> 73347 bytes html/.doctrees/plugins/index.doctree | Bin 0 -> 23900 bytes html/.doctrees/plugins/sqlite.doctree | Bin 0 -> 14884 bytes html/.doctrees/plugins/werkzeug.doctree | Bin 0 -> 17907 bytes html/.doctrees/recipes.doctree | Bin 0 -> 49664 bytes html/.doctrees/routing.doctree | Bin 0 -> 32459 bytes html/.doctrees/stpl.doctree | Bin 0 -> 51728 bytes html/.doctrees/tutorial.doctree | Bin 0 -> 255646 bytes html/.doctrees/tutorial_app.doctree | Bin 0 -> 134479 bytes html/_images/myface_small.png | Bin 0 -> 22926 bytes html/_modules/bottle.html | 3408 ++++++++++++ html/_modules/index.html | 157 + html/_sources/api.txt | 193 + html/_sources/async.txt | 127 + html/_sources/changelog.txt | 141 + html/_sources/contact.txt | 30 + html/_sources/deployment.txt | 205 + html/_sources/development.txt | 181 + html/_sources/faq.txt | 62 + html/_sources/index.txt | 112 + html/_sources/plugindev.txt | 240 + html/_sources/plugins/index.txt | 59 + html/_sources/plugins/sqlite.txt | 1 + html/_sources/plugins/werkzeug.txt | 1 + html/_sources/recipes.txt | 257 + html/_sources/routing.txt | 129 + html/_sources/stpl.txt | 231 + html/_sources/tutorial.txt | 968 ++++ html/_sources/tutorial_app.txt | 711 +++ html/_static/ajax-loader.gif | Bin 0 -> 673 bytes html/_static/basic.css | 540 ++ html/_static/bgrad.png | Bin 0 -> 159 bytes html/_static/bottle.css | 254 + html/_static/browser-example.png | Bin 0 -> 7179 bytes html/_static/comment-bright.png | Bin 0 -> 3500 bytes html/_static/comment-close.png | Bin 0 -> 3578 bytes html/_static/comment.png | Bin 0 -> 3445 bytes html/_static/default.css | 256 + html/_static/default.js | 137 + html/_static/doctools.js | 247 + html/_static/down-pressed.png | Bin 0 -> 368 bytes html/_static/down.png | Bin 0 -> 363 bytes html/_static/favicon.ico | Bin 0 -> 4286 bytes html/_static/file.png | Bin 0 -> 392 bytes html/_static/jquery.js | 9266 +++++++++++++++++++++++++++++++ html/_static/link_icon.png | Bin 0 -> 218 bytes html/_static/logo_bg.png | Bin 0 -> 21285 bytes html/_static/logo_full.png | Bin 0 -> 13154 bytes html/_static/logo_icon.png | Bin 0 -> 17336 bytes html/_static/logo_nav.png | Bin 0 -> 6820 bytes html/_static/logo_reddit.png | Bin 0 -> 8086 bytes html/_static/minus.png | Bin 0 -> 199 bytes html/_static/myface.png | Bin 0 -> 229341 bytes html/_static/myface_small.png | Bin 0 -> 22926 bytes html/_static/paypal.png | Bin 0 -> 1509 bytes html/_static/plus.png | Bin 0 -> 199 bytes html/_static/pygments.css | 62 + html/_static/searchtools.js | 560 ++ html/_static/sidebar.js | 151 + html/_static/underscore.js | 807 +++ html/_static/up-pressed.png | Bin 0 -> 372 bytes html/_static/up.png | Bin 0 -> 363 bytes html/_static/websupport.js | 808 +++ html/api.html | 1548 ++++++ html/async.html | 301 + html/changelog.html | 380 ++ html/contact.html | 181 + html/deployment.html | 393 ++ html/development.html | 328 ++ html/faq.html | 235 + html/genindex.html | 1094 ++++ html/index.html | 386 ++ html/objects.inv | Bin 0 -> 1757 bytes html/plugindev.html | 439 ++ html/plugins/index.html | 216 + html/plugins/sqlite.html | 272 + html/plugins/werkzeug.html | 248 + html/py-modindex.html | 172 + html/recipes.html | 421 ++ html/routing.html | 330 ++ html/search.html | 163 + html/searchindex.js | 1 + html/stpl.html | 427 ++ html/tutorial.html | 988 ++++ html/tutorial_app.html | 772 +++ 95 files changed, 29600 insertions(+) create mode 100644 html/.buildinfo create mode 100644 html/.doctrees/api.doctree create mode 100644 html/.doctrees/async.doctree create mode 100644 html/.doctrees/changelog.doctree create mode 100644 html/.doctrees/contact.doctree create mode 100644 html/.doctrees/deployment.doctree create mode 100644 html/.doctrees/development.doctree create mode 100644 html/.doctrees/environment.pickle create mode 100644 html/.doctrees/faq.doctree create mode 100644 html/.doctrees/index.doctree create mode 100644 html/.doctrees/plugindev.doctree create mode 100644 html/.doctrees/plugins/index.doctree create mode 100644 html/.doctrees/plugins/sqlite.doctree create mode 100644 html/.doctrees/plugins/werkzeug.doctree create mode 100644 html/.doctrees/recipes.doctree create mode 100644 html/.doctrees/routing.doctree create mode 100644 html/.doctrees/stpl.doctree create mode 100644 html/.doctrees/tutorial.doctree create mode 100644 html/.doctrees/tutorial_app.doctree create mode 100644 html/_images/myface_small.png create mode 100644 html/_modules/bottle.html create mode 100644 html/_modules/index.html create mode 100644 html/_sources/api.txt create mode 100644 html/_sources/async.txt create mode 100644 html/_sources/changelog.txt create mode 100644 html/_sources/contact.txt create mode 100644 html/_sources/deployment.txt create mode 100644 html/_sources/development.txt create mode 100644 html/_sources/faq.txt create mode 100644 html/_sources/index.txt create mode 100644 html/_sources/plugindev.txt create mode 100644 html/_sources/plugins/index.txt create mode 100644 html/_sources/plugins/sqlite.txt create mode 100644 html/_sources/plugins/werkzeug.txt create mode 100644 html/_sources/recipes.txt create mode 100644 html/_sources/routing.txt create mode 100644 html/_sources/stpl.txt create mode 100644 html/_sources/tutorial.txt create mode 100644 html/_sources/tutorial_app.txt create mode 100644 html/_static/ajax-loader.gif create mode 100644 html/_static/basic.css create mode 100644 html/_static/bgrad.png create mode 100644 html/_static/bottle.css create mode 100644 html/_static/browser-example.png create mode 100644 html/_static/comment-bright.png create mode 100644 html/_static/comment-close.png create mode 100644 html/_static/comment.png create mode 100644 html/_static/default.css create mode 100644 html/_static/default.js create mode 100644 html/_static/doctools.js create mode 100644 html/_static/down-pressed.png create mode 100644 html/_static/down.png create mode 100644 html/_static/favicon.ico create mode 100644 html/_static/file.png create mode 100644 html/_static/jquery.js create mode 100644 html/_static/link_icon.png create mode 100644 html/_static/logo_bg.png create mode 100644 html/_static/logo_full.png create mode 100644 html/_static/logo_icon.png create mode 100644 html/_static/logo_nav.png create mode 100644 html/_static/logo_reddit.png create mode 100644 html/_static/minus.png create mode 100644 html/_static/myface.png create mode 100644 html/_static/myface_small.png create mode 100644 html/_static/paypal.png create mode 100644 html/_static/plus.png create mode 100644 html/_static/pygments.css create mode 100644 html/_static/searchtools.js create mode 100644 html/_static/sidebar.js create mode 100644 html/_static/underscore.js create mode 100644 html/_static/up-pressed.png create mode 100644 html/_static/up.png create mode 100644 html/_static/websupport.js create mode 100644 html/api.html create mode 100644 html/async.html create mode 100644 html/changelog.html create mode 100644 html/contact.html create mode 100644 html/deployment.html create mode 100644 html/development.html create mode 100644 html/faq.html create mode 100644 html/genindex.html create mode 100644 html/index.html create mode 100644 html/objects.inv create mode 100644 html/plugindev.html create mode 100644 html/plugins/index.html create mode 100644 html/plugins/sqlite.html create mode 100644 html/plugins/werkzeug.html create mode 100644 html/py-modindex.html create mode 100644 html/recipes.html create mode 100644 html/routing.html create mode 100644 html/search.html create mode 100644 html/searchindex.js create mode 100644 html/stpl.html create mode 100644 html/tutorial.html create mode 100644 html/tutorial_app.html diff --git a/html/.buildinfo b/html/.buildinfo new file mode 100644 index 0000000..e26ce06 --- /dev/null +++ b/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: ab131a67559bfa85a0c2739ac85f9423 +tags: fbb0d17656682115ca4d033fb2f83ba1 diff --git a/html/.doctrees/api.doctree b/html/.doctrees/api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b23196f1b0dfaa9f89c61f23430269d925bf9e35 GIT binary patch literal 379925 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 C0yVt= literal 0 HcmV?d00001 diff --git a/html/.doctrees/async.doctree b/html/.doctrees/async.doctree new file mode 100644 index 0000000000000000000000000000000000000000..487a200e58d2a7bf94fae3e0609b274da200bc40 GIT binary patch literal 33023 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 YSHHloEU)1c=jxZZiPf+0+b$RW51{`D@c;k- literal 0 HcmV?d00001 diff --git a/html/.doctrees/changelog.doctree b/html/.doctrees/changelog.doctree new file mode 100644 index 0000000000000000000000000000000000000000..46caae341359a7a8bdd40c9e0ec5644638189cf6 GIT binary patch literal 92591 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 LpG9L^&vpGjDB!WC literal 0 HcmV?d00001 diff --git a/html/.doctrees/contact.doctree b/html/.doctrees/contact.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e7db5cd3ffdf3ee4c555fccf46fa0837f01e7095 GIT binary patch literal 11120 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 D9j_>* literal 0 HcmV?d00001 diff --git a/html/.doctrees/deployment.doctree b/html/.doctrees/deployment.doctree new file mode 100644 index 0000000000000000000000000000000000000000..31a8ef19f38f51265be89566107ad513e721bbe6 GIT binary patch literal 53333 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 literal 0 HcmV?d00001 diff --git a/html/.doctrees/development.doctree b/html/.doctrees/development.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6a6e5cf20d15ebd6927af2a6acf285e13a078b70 GIT binary patch literal 61385 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 literal 0 HcmV?d00001 diff --git a/html/.doctrees/environment.pickle b/html/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..8cb65ac5a64139b5f1ba354831cc9c5c4d638d13 GIT binary patch literal 1571655 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

y5@Wk8)XByGi8{L6cp}Dj=JMso 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

0}Yly#;L4Gkc+uqt&m~rHJ(G+8;m?)+)%v z379K_ee);0cRR9j$Hlpp_2hbHabxc4&j1}(f5ESaHZN{FTx|U-g0Px^UmWuO{{Zku B!Ug~U literal 0 HcmV?d00001 diff --git a/html/.doctrees/routing.doctree b/html/.doctrees/routing.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4e04a88484fd7fe5966996983c246f808f94ccb8 GIT binary patch literal 32459 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 T42*-$>M}gwK79ObOl1ELng&uv literal 0 HcmV?d00001 diff --git a/html/.doctrees/stpl.doctree b/html/.doctrees/stpl.doctree new file mode 100644 index 0000000000000000000000000000000000000000..4cc2c27b96ec2fc8b6c3fb95f8a157f40f553034 GIT binary patch literal 51728 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 literal 0 HcmV?d00001 diff --git a/html/.doctrees/tutorial.doctree b/html/.doctrees/tutorial.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c6d43f12381de840ede52b95626613c2be9b50ec GIT binary patch literal 255646 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�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 literal 0 HcmV?d00001 diff --git a/html/.doctrees/tutorial_app.doctree b/html/.doctrees/tutorial_app.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d3573f8f41980774785f847feb0762f550def4c9 GIT binary patch literal 134479 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 PvsUn<>M}eh2Gjo!%<*;= literal 0 HcmV?d00001 diff --git a/html/_images/myface_small.png b/html/_images/myface_small.png new file mode 100644 index 0000000000000000000000000000000000000000..24314f603a3bc44cf66ddf3e0246a0927b9d1179 GIT binary patch literal 22926 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 JPDHLkV1ifuA#eZy literal 0 HcmV?d00001 diff --git a/html/_modules/bottle.html b/html/_modules/bottle.html new file mode 100644 index 0000000..5e9ea5c --- /dev/null +++ b/html/_modules/bottle.html @@ -0,0 +1,3408 @@ + + + + + + + + + + bottle — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + +

+ +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +

Source code for bottle

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Bottle is a fast and simple micro-framework for small web applications. It
+offers request dispatching (Routes) with url parameter support, templates,
+a built-in HTTP Server and adapters for many third party WSGI/HTTP-server and
+template engines - all in a single file and with no dependencies other than the
+Python Standard Library.
+
+Homepage and documentation: http://bottlepy.org/
+
+Copyright (c) 2012, Marcel Hellkamp.
+License: MIT (see LICENSE for details)
+"""
+
+from __future__ import with_statement
+
+__author__ = 'Marcel Hellkamp'
+__version__ = '0.12-dev'
+__license__ = 'MIT'
+
+# The gevent server adapter needs to patch some modules before they are imported
+# This is why we parse the commandline parameters here but handle them later
+if __name__ == '__main__':
+    from optparse import OptionParser
+    _cmd_parser = OptionParser(usage="usage: %prog [options] package.module:app")
+    _opt = _cmd_parser.add_option
+    _opt("--version", action="store_true", help="show version number.")
+    _opt("-b", "--bind", metavar="ADDRESS", help="bind socket to ADDRESS.")
+    _opt("-s", "--server", default='wsgiref', help="use SERVER as backend.")
+    _opt("-p", "--plugin", action="append", help="install additional plugin/s.")
+    _opt("--debug", action="store_true", help="start server in debug mode.")
+    _opt("--reload", action="store_true", help="auto-reload on file changes.")
+    _cmd_options, _cmd_args = _cmd_parser.parse_args()
+    if _cmd_options.server and _cmd_options.server.startswith('gevent'):
+        import gevent.monkey; gevent.monkey.patch_all()
+
+import base64, cgi, email.utils, functools, hmac, imp, itertools, mimetypes,\
+        os, re, subprocess, sys, tempfile, threading, time, urllib, warnings
+
+from datetime import date as datedate, datetime, timedelta
+from tempfile import TemporaryFile
+from traceback import format_exc, print_exc
+
+try: from json import dumps as json_dumps, loads as json_lds
+except ImportError: # pragma: no cover
+    try: from simplejson import dumps as json_dumps, loads as json_lds
+    except ImportError:
+        try: from django.utils.simplejson import dumps as json_dumps, loads as json_lds
+        except ImportError:
+            def json_dumps(data):
+                raise ImportError("JSON support requires Python 2.6 or simplejson.")
+            json_lds = json_dumps
+
+
+
+# We now try to fix 2.5/2.6/3.1/3.2 incompatibilities.
+# It ain't pretty but it works... Sorry for the mess.
+
+py   = sys.version_info
+py3k = py >= (3,0,0)
+py25 = py <  (2,6,0)
+py31 = (3,1,0) <= py < (3,2,0)
+
+# Workaround for the missing "as" keyword in py3k.
+def _e(): return sys.exc_info()[1]
+
+# Workaround for the "print is a keyword/function" Python 2/3 dilemma
+# and a fallback for mod_wsgi (resticts stdout/err attribute access)
+try:
+    _stdout, _stderr = sys.stdout.write, sys.stderr.write
+except IOError:
+    _stdout = lambda x: sys.stdout.write(x)
+    _stderr = lambda x: sys.stderr.write(x)
+
+# Lots of stdlib and builtin differences.
+if py3k:
+    import http.client as httplib
+    import _thread as thread
+    from urllib.parse import urljoin, SplitResult as UrlSplitResult
+    from urllib.parse import urlencode, quote as urlquote, unquote as urlunquote
+    urlunquote = functools.partial(urlunquote, encoding='latin1')
+    from http.cookies import SimpleCookie
+    from collections import MutableMapping as DictMixin
+    import pickle
+    from io import BytesIO
+    basestring = str
+    unicode = str
+    json_loads = lambda s: json_lds(touni(s))
+    callable = lambda x: hasattr(x, '__call__')
+    imap = map
+else: # 2.x
+    import httplib
+    import thread
+    from urlparse import urljoin, SplitResult as UrlSplitResult
+    from urllib import urlencode, quote as urlquote, unquote as urlunquote
+    from Cookie import SimpleCookie
+    from itertools import imap
+    import cPickle as pickle
+    from StringIO import StringIO as BytesIO
+    if py25:
+        msg = "Python 2.5 support may be dropped in future versions of Bottle."
+        warnings.warn(msg, DeprecationWarning)
+        from UserDict import DictMixin
+        def next(it): return it.next()
+        bytes = str
+    else: # 2.6, 2.7
+        from collections import MutableMapping as DictMixin
+    json_loads = json_lds
+
+# Some helpers for string/byte handling
+def tob(s, enc='utf8'):
+    return s.encode(enc) if isinstance(s, unicode) else bytes(s)
+def touni(s, enc='utf8', err='strict'):
+    return s.decode(enc, err) if isinstance(s, bytes) else unicode(s)
+tonat = touni if py3k else tob
+
+# 3.2 fixes cgi.FieldStorage to accept bytes (which makes a lot of sense).
+# 3.1 needs a workaround.
+if py31:
+    from io import TextIOWrapper
+    class NCTextIOWrapper(TextIOWrapper):
+        def close(self): pass # Keep wrapped buffer open.
+
+# File uploads (which are implemented as empty FiledStorage instances...)
+# have a negative truth value. That makes no sense, here is a fix.
+class FieldStorage(cgi.FieldStorage):
+    def __nonzero__(self): return bool(self.list or self.file)
+    if py3k: __bool__ = __nonzero__
+
+# A bug in functools causes it to break if the wrapper is an instance method
+def update_wrapper(wrapper, wrapped, *a, **ka):
+    try: functools.update_wrapper(wrapper, wrapped, *a, **ka)
+    except AttributeError: pass
+
+
+
+# These helpers are used at module level and need to be defined first.
+# And yes, I know PEP-8, but sometimes a lower-case classname makes more sense.
+
+def depr(message):
+    warnings.warn(message, DeprecationWarning, stacklevel=3)
+
+def makelist(data): # This is just to handy
+    if isinstance(data, (tuple, list, set, dict)): return list(data)
+    elif data: return [data]
+    else: return []
+
+
+class DictProperty(object):
+    ''' Property that maps to a key in a local dict-like attribute. '''
+    def __init__(self, attr, key=None, read_only=False):
+        self.attr, self.key, self.read_only = attr, key, read_only
+
+    def __call__(self, func):
+        functools.update_wrapper(self, func, updated=[])
+        self.getter, self.key = func, self.key or func.__name__
+        return self
+
+    def __get__(self, obj, cls):
+        if obj is None: return self
+        key, storage = self.key, getattr(obj, self.attr)
+        if key not in storage: storage[key] = self.getter(obj)
+        return storage[key]
+
+    def __set__(self, obj, value):
+        if self.read_only: raise AttributeError("Read-Only property.")
+        getattr(obj, self.attr)[self.key] = value
+
+    def __delete__(self, obj):
+        if self.read_only: raise AttributeError("Read-Only property.")
+        del getattr(obj, self.attr)[self.key]
+
+
+class cached_property(object):
+    ''' A property that is only computed once per instance and then replaces
+        itself with an ordinary attribute. Deleting the attribute resets the
+        property. '''
+
+    def __init__(self, func):
+        self.func = func
+
+    def __get__(self, obj, cls):
+        if obj is None: return self
+        value = obj.__dict__[self.func.__name__] = self.func(obj)
+        return value
+
+
+class lazy_attribute(object):
+    ''' A property that caches itself to the class object. '''
+    def __init__(self, func):
+        functools.update_wrapper(self, func, updated=[])
+        self.getter = func
+
+    def __get__(self, obj, cls):
+        value = self.getter(cls)
+        setattr(cls, self.__name__, value)
+        return value
+
+
+
+
+
+
+###############################################################################
+# Exceptions and Events ########################################################
+###############################################################################
+
+
+
[docs]class BottleException(Exception): + """ A base class for exceptions used by bottle. """ + pass + + + + + + +############################################################################### +# Routing ###################################################################### +############################################################################### + +
+class RouteError(BottleException): + """ This is a base class for all routing related exceptions """ + + +class RouteReset(BottleException): + """ If raised by a plugin or request handler, the route is reset and all + plugins are re-applied. """ + +class RouterUnknownModeError(RouteError): pass + + +class RouteSyntaxError(RouteError): + """ The route parser found something not supported by this router """ + + +class RouteBuildError(RouteError): + """ The route could not been built """ + + +class Router(object): + ''' A Router is an ordered collection of route->target pairs. It is used to + efficiently match WSGI requests against a number of routes and return + the first target that satisfies the request. The target may be anything, + usually a string, ID or callable object. A route consists of a path-rule + and a HTTP method. + + The path-rule is either a static path (e.g. `/contact`) or a dynamic + path that contains wildcards (e.g. `/wiki/<page>`). The wildcard syntax + and details on the matching order are described in docs:`routing`. + ''' + + default_pattern = '[^/]+' + default_filter = 're' + #: Sorry for the mess. It works. Trust me. + rule_syntax = re.compile('(\\\\*)'\ + '(?:(?::([a-zA-Z_][a-zA-Z_0-9]*)?()(?:#(.*?)#)?)'\ + '|(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)'\ + '(?::((?:\\\\.|[^\\\\>]+)+)?)?)?>))') + + def __init__(self, strict=False): + self.rules = {} # A {rule: Rule} mapping + self.builder = {} # A rule/name->build_info mapping + self.static = {} # Cache for static routes: {path: {method: target}} + self.dynamic = [] # Cache for dynamic routes. See _compile() + #: If true, static routes are no longer checked first. + self.strict_order = strict + self.filters = {'re': self.re_filter, 'int': self.int_filter, + 'float': self.float_filter, 'path': self.path_filter} + + def re_filter(self, conf): + return conf or self.default_pattern, None, None + + def int_filter(self, conf): + return r'-?\d+', int, lambda x: str(int(x)) + + def float_filter(self, conf): + return r'-?[\d.]+', float, lambda x: str(float(x)) + + def path_filter(self, conf): + return r'.+?', None, None + + def add_filter(self, name, func): + ''' Add a filter. The provided function is called with the configuration + string as parameter and must return a (regexp, to_python, to_url) tuple. + The first element is a string, the last two are callables or None. ''' + self.filters[name] = func + + def parse_rule(self, rule): + ''' Parses a rule into a (name, filter, conf) token stream. If mode is + None, name contains a static rule part. ''' + offset, prefix = 0, '' + for match in self.rule_syntax.finditer(rule): + prefix += rule[offset:match.start()] + g = match.groups() + if len(g[0])%2: # Escaped wildcard + prefix += match.group(0)[len(g[0]):] + offset = match.end() + continue + if prefix: yield prefix, None, None + name, filtr, conf = g[1:4] if not g[2] is None else g[4:7] + if not filtr: filtr = self.default_filter + yield name, filtr, conf or None + offset, prefix = match.end(), '' + if offset <= len(rule) or prefix: + yield prefix+rule[offset:], None, None + + def add(self, rule, method, target, name=None): + ''' Add a new route or replace the target for an existing route. ''' + if rule in self.rules: + self.rules[rule][method] = target + if name: self.builder[name] = self.builder[rule] + return + + target = self.rules[rule] = {method: target} + + # Build pattern and other structures for dynamic routes + anons = 0 # Number of anonymous wildcards + pattern = '' # Regular expression pattern + filters = [] # Lists of wildcard input filters + builder = [] # Data structure for the URL builder + is_static = True + for key, mode, conf in self.parse_rule(rule): + if mode: + is_static = False + mask, in_filter, out_filter = self.filters[mode](conf) + if key: + pattern += '(?P<%s>%s)' % (key, mask) + else: + pattern += '(?:%s)' % mask + key = 'anon%d' % anons; anons += 1 + if in_filter: filters.append((key, in_filter)) + builder.append((key, out_filter or str)) + elif key: + pattern += re.escape(key) + builder.append((None, key)) + self.builder[rule] = builder + if name: self.builder[name] = builder + + if is_static and not self.strict_order: + self.static[self.build(rule)] = target + return + + def fpat_sub(m): + return m.group(0) if len(m.group(1)) % 2 else m.group(1) + '(?:' + flat_pattern = re.sub(r'(\\*)(\(\?P<[^>]*>|\((?!\?))', fpat_sub, pattern) + + try: + re_match = re.compile('^(%s)$' % pattern).match + except re.error: + raise RouteSyntaxError("Could not add Route: %s (%s)" % (rule, _e())) + + def match(path): + """ Return an url-argument dictionary. """ + url_args = re_match(path).groupdict() + for name, wildcard_filter in filters: + try: + url_args[name] = wildcard_filter(url_args[name]) + except ValueError: + raise HTTPError(400, 'Path has wrong format.') + return url_args + + try: + combined = '%s|(^%s$)' % (self.dynamic[-1][0].pattern, flat_pattern) + self.dynamic[-1] = (re.compile(combined), self.dynamic[-1][1]) + self.dynamic[-1][1].append((match, target)) + except (AssertionError, IndexError): # AssertionError: Too many groups + self.dynamic.append((re.compile('(^%s$)' % flat_pattern), + [(match, target)])) + return match + + def build(self, _name, *anons, **query): + ''' Build an URL by filling the wildcards in a rule. ''' + builder = self.builder.get(_name) + if not builder: raise RouteBuildError("No route with that name.", _name) + try: + for i, value in enumerate(anons): query['anon%d'%i] = value + url = ''.join([f(query.pop(n)) if n else f for (n,f) in builder]) + return url if not query else url+'?'+urlencode(query) + except KeyError: + raise RouteBuildError('Missing URL argument: %r' % _e().args[0]) + + def match(self, environ): + ''' Return a (target, url_agrs) tuple or raise HTTPError(400/404/405). ''' + path, targets, urlargs = environ['PATH_INFO'] or '/', None, {} + if path in self.static: + targets = self.static[path] + else: + for combined, rules in self.dynamic: + match = combined.match(path) + if not match: continue + getargs, targets = rules[match.lastindex - 1] + urlargs = getargs(path) if getargs else {} + break + + if not targets: + raise HTTPError(404, "Not found: " + repr(environ['PATH_INFO'])) + method = environ['REQUEST_METHOD'].upper() + if method in targets: + return targets[method], urlargs + if method == 'HEAD' and 'GET' in targets: + return targets['GET'], urlargs + if 'ANY' in targets: + return targets['ANY'], urlargs + allowed = [verb for verb in targets if verb != 'ANY'] + if 'GET' in allowed and 'HEAD' not in allowed: + allowed.append('HEAD') + raise HTTPError(405, "Method not allowed.", Allow=",".join(allowed)) + + +
[docs]class Route(object): + ''' This class wraps a route callback along with route specific metadata and + configuration and applies Plugins on demand. It is also responsible for + turing an URL path rule into a regular expression usable by the Router. + ''' + + def __init__(self, app, rule, method, callback, name=None, + plugins=None, skiplist=None, **config): + #: The application this route is installed to. + self.app = app + #: The path-rule string (e.g. ``/wiki/:page``). + self.rule = rule + #: The HTTP method as a string (e.g. ``GET``). + self.method = method + #: The original callback with no plugins applied. Useful for introspection. + self.callback = callback + #: The name of the route (if specified) or ``None``. + self.name = name or None + #: A list of route-specific plugins (see :meth:`Bottle.route`). + self.plugins = plugins or [] + #: A list of plugins to not apply to this route (see :meth:`Bottle.route`). + self.skiplist = skiplist or [] + #: Additional keyword arguments passed to the :meth:`Bottle.route` + #: decorator are stored in this dictionary. Used for route-specific + #: plugin configuration and meta-data. + self.config = ConfigDict(config) + + def __call__(self, *a, **ka): + depr("Some APIs changed to return Route() instances instead of"\ + " callables. Make sure to use the Route.call method and not to"\ + " call Route instances directly.") + return self.call(*a, **ka) + + @cached_property + def call(self): + ''' The route callback with all plugins applied. This property is + created on demand and then cached to speed up subsequent requests.''' + return self._make_callback() + +
[docs] def reset(self): + ''' Forget any cached values. The next time :attr:`call` is accessed, + all plugins are re-applied. ''' + self.__dict__.pop('call', None) +
+
[docs] def prepare(self): + ''' Do all on-demand work immediately (useful for debugging).''' + self.call +
+ @property + def _context(self): + depr('Switch to Plugin API v2 and access the Route object directly.') + return dict(rule=self.rule, method=self.method, callback=self.callback, + name=self.name, app=self.app, config=self.config, + apply=self.plugins, skip=self.skiplist) + +
[docs] def all_plugins(self): + ''' Yield all Plugins affecting this route. ''' + unique = set() + for p in reversed(self.app.plugins + self.plugins): + if True in self.skiplist: break + name = getattr(p, 'name', False) + if name and (name in self.skiplist or name in unique): continue + if p in self.skiplist or type(p) in self.skiplist: continue + if name: unique.add(name) + yield p +
+ def _make_callback(self): + callback = self.callback + for plugin in self.all_plugins(): + try: + if hasattr(plugin, 'apply'): + api = getattr(plugin, 'api', 1) + context = self if api > 1 else self._context + callback = plugin.apply(callback, context) + else: + callback = plugin(callback) + except RouteReset: # Try again with changed configuration. + return self._make_callback() + if not callback is self.callback: + update_wrapper(callback, self.callback) + return callback + + def __repr__(self): + return '<%s %r %r>' % (self.method, self.rule, self.callback) + + + + + + +############################################################################### +# Application Object ########################################################### +############################################################################### + +
+
[docs]class Bottle(object): + """ Each Bottle object represents a single, distinct web application and + consists of routes, callbacks, plugins, resources and configuration. + Instances are callable WSGI applications. + + :param catchall: If true (default), handle all exceptions. Turn off to + let debugging middleware handle exceptions. + """ + + def __init__(self, catchall=True, autojson=True): + #: If true, most exceptions are caught and returned as :exc:`HTTPError` + self.catchall = catchall + + #: A :class:`ResourceManager` for application files + self.resources = ResourceManager() + + #: A :class:`ConfigDict` for app specific configuration. + self.config = ConfigDict() + self.config.autojson = autojson + + self.routes = [] # List of installed :class:`Route` instances. + self.router = Router() # Maps requests to :class:`Route` instances. + self.error_handler = {} + + # Core plugins + self.plugins = [] # List of installed plugins. + self.hooks = HooksPlugin() + self.install(self.hooks) + if self.config.autojson: + self.install(JSONPlugin()) + self.install(TemplatePlugin()) + + +
[docs] def mount(self, prefix, app, **options): + ''' Mount an application (:class:`Bottle` or plain WSGI) to a specific + URL prefix. Example:: + + root_app.mount('/admin/', admin_app) + + :param prefix: path prefix or `mount-point`. If it ends in a slash, + that slash is mandatory. + :param app: an instance of :class:`Bottle` or a WSGI application. + + All other parameters are passed to the underlying :meth:`route` call. + ''' + if isinstance(app, basestring): + prefix, app = app, prefix + depr('Parameter order of Bottle.mount() changed.') # 0.10 + + segments = [p for p in prefix.split('/') if p] + if not segments: raise ValueError('Empty path prefix.') + path_depth = len(segments) + + def mountpoint_wrapper(): + try: + request.path_shift(path_depth) + rs = BaseResponse([], 200) + def start_response(status, header): + rs.status = status + for name, value in header: rs.add_header(name, value) + return rs.body.append + body = app(request.environ, start_response) + body = itertools.chain(rs.body, body) + return HTTPResponse(body, rs.status_code, rs.headers) + finally: + request.path_shift(-path_depth) + + options.setdefault('skip', True) + options.setdefault('method', 'ANY') + options.setdefault('mountpoint', {'prefix': prefix, 'target': app}) + options['callback'] = mountpoint_wrapper + + self.route('/%s/<:re:.*>' % '/'.join(segments), **options) + if not prefix.endswith('/'): + self.route('/' + '/'.join(segments), **options) +
+
[docs] def merge(self, routes): + ''' Merge the routes of another :class:`Bottle` application or a list of + :class:`Route` objects into this application. The routes keep their + 'owner', meaning that the :data:`Route.app` attribute is not + changed. ''' + if isinstance(routes, Bottle): + routes = routes.routes + for route in routes: + self.add_route(route) +
+
[docs] def install(self, plugin): + ''' Add a plugin to the list of plugins and prepare it for being + applied to all routes of this application. A plugin may be a simple + decorator or an object that implements the :class:`Plugin` API. + ''' + if hasattr(plugin, 'setup'): plugin.setup(self) + if not callable(plugin) and not hasattr(plugin, 'apply'): + raise TypeError("Plugins must be callable or implement .apply()") + self.plugins.append(plugin) + self.reset() + return plugin +
+
[docs] def uninstall(self, plugin): + ''' Uninstall plugins. Pass an instance to remove a specific plugin, a type + object to remove all plugins that match that type, a string to remove + all plugins with a matching ``name`` attribute or ``True`` to remove all + plugins. Return the list of removed plugins. ''' + removed, remove = [], plugin + for i, plugin in list(enumerate(self.plugins))[::-1]: + if remove is True or remove is plugin or remove is type(plugin) \ + or getattr(plugin, 'name', True) == remove: + removed.append(plugin) + del self.plugins[i] + if hasattr(plugin, 'close'): plugin.close() + if removed: self.reset() + return removed +
+
[docs] def run(self, **kwargs): + ''' Calls :func:`run` with the same parameters. ''' + run(self, **kwargs) +
+
[docs] def reset(self, route=None): + ''' Reset all routes (force plugins to be re-applied) and clear all + caches. If an ID or route object is given, only that specific route + is affected. ''' + if route is None: routes = self.routes + elif isinstance(route, Route): routes = [route] + else: routes = [self.routes[route]] + for route in routes: route.reset() + if DEBUG: + for route in routes: route.prepare() + self.hooks.trigger('app_reset') +
+
[docs] def close(self): + ''' Close the application and all installed plugins. ''' + for plugin in self.plugins: + if hasattr(plugin, 'close'): plugin.close() + self.stopped = True +
+
[docs] def match(self, environ): + """ Search for a matching route and return a (:class:`Route` , urlargs) + tuple. The second value is a dictionary with parameters extracted + from the URL. Raise :exc:`HTTPError` (404/405) on a non-match.""" + return self.router.match(environ) +
+
[docs] def get_url(self, routename, **kargs): + """ Return a string that matches a named route """ + scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/' + location = self.router.build(routename, **kargs).lstrip('/') + return urljoin(urljoin('/', scriptname), location) +
+
[docs] def add_route(self, route): + ''' Add a route object, but do not change the :data:`Route.app` + attribute.''' + self.routes.append(route) + self.router.add(route.rule, route.method, route, name=route.name) + if DEBUG: route.prepare() +
+
[docs] def route(self, path=None, method='GET', callback=None, name=None, + apply=None, skip=None, **config): + """ A decorator to bind a function to a request URL. Example:: + + @app.route('/hello/:name') + def hello(name): + return 'Hello %s' % name + + The ``:name`` part is a wildcard. See :class:`Router` for syntax + details. + + :param path: Request path or a list of paths to listen to. If no + path is specified, it is automatically generated from the + signature of the function. + :param method: HTTP method (`GET`, `POST`, `PUT`, ...) or a list of + methods to listen to. (default: `GET`) + :param callback: An optional shortcut to avoid the decorator + syntax. ``route(..., callback=func)`` equals ``route(...)(func)`` + :param name: The name for this route. (default: None) + :param apply: A decorator or plugin or a list of plugins. These are + applied to the route callback in addition to installed plugins. + :param skip: A list of plugins, plugin classes or names. Matching + plugins are not installed to this route. ``True`` skips all. + + Any additional keyword arguments are stored as route-specific + configuration and passed to plugins (see :meth:`Plugin.apply`). + """ + if callable(path): path, callback = None, path + plugins = makelist(apply) + skiplist = makelist(skip) + def decorator(callback): + # TODO: Documentation and tests + if isinstance(callback, basestring): callback = load(callback) + for rule in makelist(path) or yieldroutes(callback): + for verb in makelist(method): + verb = verb.upper() + route = Route(self, rule, verb, callback, name=name, + plugins=plugins, skiplist=skiplist, **config) + self.add_route(route) + return callback + return decorator(callback) if callback else decorator +
+
[docs] def get(self, path=None, method='GET', **options): + """ Equals :meth:`route`. """ + return self.route(path, method, **options) +
+
[docs] def post(self, path=None, method='POST', **options): + """ Equals :meth:`route` with a ``POST`` method parameter. """ + return self.route(path, method, **options) +
+
[docs] def put(self, path=None, method='PUT', **options): + """ Equals :meth:`route` with a ``PUT`` method parameter. """ + return self.route(path, method, **options) +
+
[docs] def delete(self, path=None, method='DELETE', **options): + """ Equals :meth:`route` with a ``DELETE`` method parameter. """ + return self.route(path, method, **options) +
+
[docs] def error(self, code=500): + """ Decorator: Register an output handler for a HTTP error code""" + def wrapper(handler): + self.error_handler[int(code)] = handler + return handler + return wrapper +
+
[docs] def hook(self, name): + """ Return a decorator that attaches a callback to a hook. Three hooks + are currently implemented: + + - before_request: Executed once before each request + - after_request: Executed once after each request + - app_reset: Called whenever :meth:`reset` is called. + """ + def wrapper(func): + self.hooks.add(name, func) + return func + return wrapper +
+
[docs] def handle(self, path, method='GET'): + """ (deprecated) Execute the first matching route callback and return + the result. :exc:`HTTPResponse` exceptions are caught and returned. + If :attr:`Bottle.catchall` is true, other exceptions are caught as + well and returned as :exc:`HTTPError` instances (500). + """ + depr("This method will change semantics in 0.10. Try to avoid it.") + if isinstance(path, dict): + return self._handle(path) + return self._handle({'PATH_INFO': path, 'REQUEST_METHOD': method.upper()}) +
+ def default_error_handler(self, res): + return tob(template(ERROR_PAGE_TEMPLATE, e=res)) + + def _handle(self, environ): + try: + environ['bottle.app'] = self + request.bind(environ) + response.bind() + route, args = self.router.match(environ) + environ['route.handle'] = route + environ['bottle.route'] = route + environ['route.url_args'] = args + return route.call(**args) + except HTTPResponse: + return _e() + except RouteReset: + route.reset() + return self._handle(environ) + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception: + if not self.catchall: raise + stacktrace = format_exc() + environ['wsgi.errors'].write(stacktrace) + return HTTPError(500, "Internal Server Error", _e(), stacktrace) + + def _cast(self, out, peek=None): + """ Try to convert the parameter into something WSGI compatible and set + correct HTTP headers when possible. + Support: False, str, unicode, dict, HTTPResponse, HTTPError, file-like, + iterable of strings and iterable of unicodes + """ + + # Empty output is done here + if not out: + if 'Content-Length' not in response: + response['Content-Length'] = 0 + return [] + # Join lists of byte or unicode strings. Mixed lists are NOT supported + if isinstance(out, (tuple, list))\ + and isinstance(out[0], (bytes, unicode)): + out = out[0][0:0].join(out) # b'abc'[0:0] -> b'' + # Encode unicode strings + if isinstance(out, unicode): + out = out.encode(response.charset) + # Byte Strings are just returned + if isinstance(out, bytes): + if 'Content-Length' not in response: + response['Content-Length'] = len(out) + return [out] + # HTTPError or HTTPException (recursive, because they may wrap anything) + # TODO: Handle these explicitly in handle() or make them iterable. + if isinstance(out, HTTPError): + out.apply(response) + out = self.error_handler.get(out.status_code, self.default_error_handler)(out) + return self._cast(out) + if isinstance(out, HTTPResponse): + out.apply(response) + return self._cast(out.body) + + # File-like objects. + if hasattr(out, 'read'): + if 'wsgi.file_wrapper' in request.environ: + return request.environ['wsgi.file_wrapper'](out) + elif hasattr(out, 'close') or not hasattr(out, '__iter__'): + return WSGIFileWrapper(out) + + # Handle Iterables. We peek into them to detect their inner type. + try: + out = iter(out) + first = next(out) + while not first: + first = next(out) + except StopIteration: + return self._cast('') + except HTTPResponse: + first = _e() + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception: + if not self.catchall: raise + first = HTTPError(500, 'Unhandled exception', _e(), format_exc()) + + # These are the inner types allowed in iterator or generator objects. + if isinstance(first, HTTPResponse): + return self._cast(first) + if isinstance(first, bytes): + return itertools.chain([first], out) + if isinstance(first, unicode): + return imap(lambda x: x.encode(response.charset), + itertools.chain([first], out)) + return self._cast(HTTPError(500, 'Unsupported response type: %s'\ + % type(first))) + +
[docs] def wsgi(self, environ, start_response): + """ The bottle WSGI-interface. """ + try: + out = self._cast(self._handle(environ)) + # rfc2616 section 4.3 + if response._status_code in (100, 101, 204, 304)\ + or environ['REQUEST_METHOD'] == 'HEAD': + if hasattr(out, 'close'): out.close() + out = [] + start_response(response._status_line, response.headerlist) + return out + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception: + if not self.catchall: raise + err = '<h1>Critical error while processing request: %s</h1>' \ + % html_escape(environ.get('PATH_INFO', '/')) + if DEBUG: + err += '<h2>Error:</h2>\n<pre>\n%s\n</pre>\n' \ + '<h2>Traceback:</h2>\n<pre>\n%s\n</pre>\n' \ + % (html_escape(repr(_e())), html_escape(format_exc())) + environ['wsgi.errors'].write(err) + headers = [('Content-Type', 'text/html; charset=UTF-8')] + start_response('500 INTERNAL SERVER ERROR', headers) + return [tob(err)] +
+ def __call__(self, environ, start_response): + ''' Each instance of :class:'Bottle' is a WSGI application. ''' + return self.wsgi(environ, start_response) + + + + + + +############################################################################### +# HTTP and WSGI Tools ########################################################## +############################################################################### + +
+
[docs]class BaseRequest(object): + """ A wrapper for WSGI environment dictionaries that adds a lot of + convenient access methods and properties. Most of them are read-only. + + Adding new attributes to a request actually adds them to the environ + dictionary (as 'bottle.request.ext.<name>'). This is the recommended + way to store and access request-specific data. + """ + + __slots__ = ('environ') + + #: Maximum size of memory buffer for :attr:`body` in bytes. + MEMFILE_MAX = 102400 + #: Maximum number pr GET or POST parameters per request + MAX_PARAMS = 100 + + def __init__(self, environ=None): + """ Wrap a WSGI environ dictionary. """ + #: The wrapped WSGI environ dictionary. This is the only real attribute. + #: All other attributes actually are read-only properties. + self.environ = {} if environ is None else environ + self.environ['bottle.request'] = self + + @DictProperty('environ', 'bottle.app', read_only=True) +
[docs] def app(self): + ''' Bottle application handling this request. ''' + raise RuntimeError('This request is not connected to an application.') +
+ @property +
[docs] def path(self): + ''' The value of ``PATH_INFO`` with exactly one prefixed slash (to fix + broken clients and avoid the "empty path" edge case). ''' + return '/' + self.environ.get('PATH_INFO','').lstrip('/') +
+ @property +
[docs] def method(self): + ''' The ``REQUEST_METHOD`` value as an uppercase string. ''' + return self.environ.get('REQUEST_METHOD', 'GET').upper() +
+ @DictProperty('environ', 'bottle.request.headers', read_only=True) +
[docs] def headers(self): + ''' A :class:`WSGIHeaderDict` that provides case-insensitive access to + HTTP request headers. ''' + return WSGIHeaderDict(self.environ) +
+
[docs] def get_header(self, name, default=None): + ''' Return the value of a request header, or a given default value. ''' + return self.headers.get(name, default) +
+ @DictProperty('environ', 'bottle.request.cookies', read_only=True) +
[docs] def cookies(self): + """ Cookies parsed into a :class:`FormsDict`. Signed cookies are NOT + decoded. Use :meth:`get_cookie` if you expect signed cookies. """ + cookies = SimpleCookie(self.environ.get('HTTP_COOKIE','')) + cookies = list(cookies.values())[:self.MAX_PARAMS] + return FormsDict((c.key, c.value) for c in cookies) +
+ + @DictProperty('environ', 'bottle.request.query', read_only=True) +
[docs] def query(self): + ''' The :attr:`query_string` parsed into a :class:`FormsDict`. These + values are sometimes called "URL arguments" or "GET parameters", but + not to be confused with "URL wildcards" as they are provided by the + :class:`Router`. ''' + get = self.environ['bottle.get'] = FormsDict() + pairs = _parse_qsl(self.environ.get('QUERY_STRING', '')) + for key, value in pairs[:self.MAX_PARAMS]: + get[key] = value + return get +
+ @DictProperty('environ', 'bottle.request.forms', read_only=True) +
[docs] def forms(self): + """ Form values parsed from an `url-encoded` or `multipart/form-data` + encoded POST or PUT request body. The result is retuned as a + :class:`FormsDict`. All keys and values are strings. File uploads + are stored separately in :attr:`files`. """ + forms = FormsDict() + for name, item in self.POST.allitems(): + if not hasattr(item, 'filename'): + forms[name] = item + return forms +
+ @DictProperty('environ', 'bottle.request.params', read_only=True) +
[docs] def params(self): + """ A :class:`FormsDict` with the combined values of :attr:`query` and + :attr:`forms`. File uploads are stored in :attr:`files`. """ + params = FormsDict() + for key, value in self.query.allitems(): + params[key] = value + for key, value in self.forms.allitems(): + params[key] = value + return params +
+ @DictProperty('environ', 'bottle.request.files', read_only=True) +
[docs] def files(self): + """ File uploads parsed from an `url-encoded` or `multipart/form-data` + encoded POST or PUT request body. The values are instances of + :class:`cgi.FieldStorage`. The most important attributes are: + + filename + The filename, if specified; otherwise None; this is the client + side filename, *not* the file name on which it is stored (that's + a temporary file you don't deal with) + file + The file(-like) object from which you can read the data. + value + The value as a *string*; for file uploads, this transparently + reads the file every time you request the value. Do not do this + on big files. + """ + files = FormsDict() + for name, item in self.POST.allitems(): + if hasattr(item, 'filename'): + files[name] = item + return files +
+ @DictProperty('environ', 'bottle.request.json', read_only=True) +
[docs] def json(self): + ''' If the ``Content-Type`` header is ``application/json``, this + property holds the parsed content of the request body. Only requests + smaller than :attr:`MEMFILE_MAX` are processed to avoid memory + exhaustion. ''' + if 'application/json' in self.environ.get('CONTENT_TYPE', '') \ + and 0 < self.content_length < self.MEMFILE_MAX: + return json_loads(self.body.read(self.MEMFILE_MAX)) + return None +
+ @DictProperty('environ', 'bottle.request.body', read_only=True) + def _body(self): + maxread = max(0, self.content_length) + stream = self.environ['wsgi.input'] + body = BytesIO() if maxread < self.MEMFILE_MAX else TemporaryFile(mode='w+b') + while maxread > 0: + part = stream.read(min(maxread, self.MEMFILE_MAX)) + if not part: break + body.write(part) + maxread -= len(part) + self.environ['wsgi.input'] = body + body.seek(0) + return body + + @property +
[docs] def body(self): + """ The HTTP request body as a seek-able file-like object. Depending on + :attr:`MEMFILE_MAX`, this is either a temporary file or a + :class:`io.BytesIO` instance. Accessing this property for the first + time reads and replaces the ``wsgi.input`` environ variable. + Subsequent accesses just do a `seek(0)` on the file object. """ + self._body.seek(0) + return self._body + + #: An alias for :attr:`query`.
+ GET = query + + @DictProperty('environ', 'bottle.request.post', read_only=True) +
[docs] def POST(self): + """ The values of :attr:`forms` and :attr:`files` combined into a single + :class:`FormsDict`. Values are either strings (form values) or + instances of :class:`cgi.FieldStorage` (file uploads). + """ + post = FormsDict() + # We default to application/x-www-form-urlencoded for everything that + # is not multipart and take the fast path (also: 3.1 workaround) + if not self.content_type.startswith('multipart/'): + maxlen = max(0, min(self.content_length, self.MEMFILE_MAX)) + pairs = _parse_qsl(tonat(self.body.read(maxlen), 'latin1')) + for key, value in pairs[:self.MAX_PARAMS]: + post[key] = value + return post + + safe_env = {'QUERY_STRING':''} # Build a safe environment for cgi + for key in ('REQUEST_METHOD', 'CONTENT_TYPE', 'CONTENT_LENGTH'): + if key in self.environ: safe_env[key] = self.environ[key] + args = dict(fp=self.body, environ=safe_env, keep_blank_values=True) + if py31: + args['fp'] = NCTextIOWrapper(args['fp'], encoding='ISO-8859-1', + newline='\n') + elif py3k: + args['encoding'] = 'ISO-8859-1' + data = FieldStorage(**args) + for item in (data.list or [])[:self.MAX_PARAMS]: + post[item.name] = item if item.filename else item.value + return post +
+ @property +
[docs] def COOKIES(self): + ''' Alias for :attr:`cookies` (deprecated). ''' + depr('BaseRequest.COOKIES was renamed to BaseRequest.cookies (lowercase).') + return self.cookies +
+ @property +
[docs] def url(self): + """ The full request URI including hostname and scheme. If your app + lives behind a reverse proxy or load balancer and you get confusing + results, make sure that the ``X-Forwarded-Host`` header is set + correctly. """ + return self.urlparts.geturl() +
+ @DictProperty('environ', 'bottle.request.urlparts', read_only=True) +
[docs] def urlparts(self): + ''' The :attr:`url` string as an :class:`urlparse.SplitResult` tuple. + The tuple contains (scheme, host, path, query_string and fragment), + but the fragment is always empty because it is not visible to the + server. ''' + env = self.environ + http = env.get('HTTP_X_FORWARDED_PROTO') or env.get('wsgi.url_scheme', 'http') + host = env.get('HTTP_X_FORWARDED_HOST') or env.get('HTTP_HOST') + if not host: + # HTTP 1.1 requires a Host-header. This is for HTTP/1.0 clients. + host = env.get('SERVER_NAME', '127.0.0.1') + port = env.get('SERVER_PORT') + if port and port != ('80' if http == 'http' else '443'): + host += ':' + port + path = urlquote(self.fullpath) + return UrlSplitResult(http, host, path, env.get('QUERY_STRING'), '') +
+ @property +
[docs] def fullpath(self): + """ Request path including :attr:`script_name` (if present). """ + return urljoin(self.script_name, self.path.lstrip('/')) +
+ @property +
[docs] def query_string(self): + """ The raw :attr:`query` part of the URL (everything in between ``?`` + and ``#``) as a string. """ + return self.environ.get('QUERY_STRING', '') +
+ @property +
[docs] def script_name(self): + ''' The initial portion of the URL's `path` that was removed by a higher + level (server or routing middleware) before the application was + called. This script path is returned with leading and tailing + slashes. ''' + script_name = self.environ.get('SCRIPT_NAME', '').strip('/') + return '/' + script_name + '/' if script_name else '/' +
+
[docs] def path_shift(self, shift=1): + ''' Shift path segments from :attr:`path` to :attr:`script_name` and + vice versa. + + :param shift: The number of path segments to shift. May be negative + to change the shift direction. (default: 1) + ''' + script = self.environ.get('SCRIPT_NAME','/') + self['SCRIPT_NAME'], self['PATH_INFO'] = path_shift(script, self.path, shift) +
+ @property +
[docs] def content_length(self): + ''' The request body length as an integer. The client is responsible to + set this header. Otherwise, the real length of the body is unknown + and -1 is returned. In this case, :attr:`body` will be empty. ''' + return int(self.environ.get('CONTENT_LENGTH') or -1) +
+ @property +
[docs] def content_type(self): + ''' The Content-Type header as a lowercase-string (default: empty). ''' + return self.environ.get('CONTENT_TYPE', '').lower() +
+ @property +
[docs] def is_xhr(self): + ''' True if the request was triggered by a XMLHttpRequest. This only + works with JavaScript libraries that support the `X-Requested-With` + header (most of the popular libraries do). ''' + requested_with = self.environ.get('HTTP_X_REQUESTED_WITH','') + return requested_with.lower() == 'xmlhttprequest' +
+ @property +
[docs] def is_ajax(self): + ''' Alias for :attr:`is_xhr`. "Ajax" is not the right term. ''' + return self.is_xhr +
+ @property +
[docs] def auth(self): + """ HTTP authentication data as a (user, password) tuple. This + implementation currently supports basic (not digest) authentication + only. If the authentication happened at a higher level (e.g. in the + front web-server or a middleware), the password field is None, but + the user field is looked up from the ``REMOTE_USER`` environ + variable. On any errors, None is returned. """ + basic = parse_auth(self.environ.get('HTTP_AUTHORIZATION','')) + if basic: return basic + ruser = self.environ.get('REMOTE_USER') + if ruser: return (ruser, None) + return None +
+ @property +
[docs] def remote_route(self): + """ A list of all IPs that were involved in this request, starting with + the client IP and followed by zero or more proxies. This does only + work if all proxies support the ```X-Forwarded-For`` header. Note + that this information can be forged by malicious clients. """ + proxy = self.environ.get('HTTP_X_FORWARDED_FOR') + if proxy: return [ip.strip() for ip in proxy.split(',')] + remote = self.environ.get('REMOTE_ADDR') + return [remote] if remote else [] +
+ @property +
[docs] def remote_addr(self): + """ The client IP as a string. Note that this information can be forged + by malicious clients. """ + route = self.remote_route + return route[0] if route else None +
+
[docs] def copy(self): + """ Return a new :class:`Request` with a shallow :attr:`environ` copy. """ + return Request(self.environ.copy()) +
+ def get(self, value, default=None): return self.environ.get(value, default) + def __getitem__(self, key): return self.environ[key] + def __delitem__(self, key): self[key] = ""; del(self.environ[key]) + def __iter__(self): return iter(self.environ) + def __len__(self): return len(self.environ) + def keys(self): return self.environ.keys() + def __setitem__(self, key, value): + """ Change an environ value and clear all caches that depend on it. """ + + if self.environ.get('bottle.request.readonly'): + raise KeyError('The environ dictionary is read-only.') + + self.environ[key] = value + todelete = () + + if key == 'wsgi.input': + todelete = ('body', 'forms', 'files', 'params', 'post', 'json') + elif key == 'QUERY_STRING': + todelete = ('query', 'params') + elif key.startswith('HTTP_'): + todelete = ('headers', 'cookies') + + for key in todelete: + self.environ.pop('bottle.request.'+key, None) + + def __repr__(self): + return '<%s: %s %s>' % (self.__class__.__name__, self.method, self.url) + + def __getattr__(self, name): + ''' Search in self.environ for additional user defined attributes. ''' + try: + var = self.environ['bottle.request.ext.%s'%name] + return var.__get__(self) if hasattr(var, '__get__') else var + except KeyError: + raise AttributeError('Attribute %r not defined.' % name) + + def __setattr__(self, name, value): + if name == 'environ': return object.__setattr__(self, name, value) + self.environ['bottle.request.ext.%s'%name] = value + + + +
+def _hkey(s): + return s.title().replace('_','-') + + +class HeaderProperty(object): + def __init__(self, name, reader=None, writer=str, default=''): + self.name, self.default = name, default + self.reader, self.writer = reader, writer + self.__doc__ = 'Current value of the %r header.' % name.title() + + def __get__(self, obj, cls): + if obj is None: return self + value = obj.headers.get(self.name, self.default) + return self.reader(value) if self.reader else value + + def __set__(self, obj, value): + obj.headers[self.name] = self.writer(value) + + def __delete__(self, obj): + del obj.headers[self.name] + + +
[docs]class BaseResponse(object): + """ Storage class for a response body as well as headers and cookies. + + This class does support dict-like case-insensitive item-access to + headers, but is NOT a dict. Most notably, iterating over a response + yields parts of the body and not the headers. + """ + + default_status = 200 + default_content_type = 'text/html; charset=UTF-8' + + # Header blacklist for specific response codes + # (rfc2616 section 10.2.3 and 10.3.5) + bad_headers = { + 204: set(('Content-Type',)), + 304: set(('Allow', 'Content-Encoding', 'Content-Language', + 'Content-Length', 'Content-Range', 'Content-Type', + 'Content-Md5', 'Last-Modified'))} + + def __init__(self, body='', status=None, **headers): + self._cookies = None + self._headers = {'Content-Type': [self.default_content_type]} + self.body = body + self.status = status or self.default_status + if headers: + for name, value in headers.items(): + self[name] = value + +
[docs] def copy(self): + ''' Returns a copy of self. ''' + copy = Response() + copy.status = self.status + copy._headers = dict((k, v[:]) for (k, v) in self._headers.items()) + return copy +
+ def __iter__(self): + return iter(self.body) + + def close(self): + if hasattr(self.body, 'close'): + self.body.close() + + @property +
[docs] def status_line(self): + ''' The HTTP status line as a string (e.g. ``404 Not Found``).''' + return self._status_line +
+ @property +
[docs] def status_code(self): + ''' The HTTP status code as an integer (e.g. 404).''' + return self._status_code +
+ def _set_status(self, status): + if isinstance(status, int): + code, status = status, _HTTP_STATUS_LINES.get(status) + elif ' ' in status: + status = status.strip() + code = int(status.split()[0]) + else: + raise ValueError('String status line without a reason phrase.') + if not 100 <= code <= 999: raise ValueError('Status code out of range.') + self._status_code = code + self._status_line = str(status or ('%d Unknown' % code)) + + def _get_status(self): + return self._status_line + + status = property(_get_status, _set_status, None, + ''' A writeable property to change the HTTP response status. It accepts + either a numeric code (100-999) or a string with a custom reason + phrase (e.g. "404 Brain not found"). Both :data:`status_line` and + :data:`status_code` are updated accordingly. The return value is + always a status string. ''') + del _get_status, _set_status + + @property +
[docs] def headers(self): + ''' An instance of :class:`HeaderDict`, a case-insensitive dict-like + view on the response headers. ''' + hdict = HeaderDict() + hdict.dict = self._headers + return hdict +
+ def __contains__(self, name): return _hkey(name) in self._headers + def __delitem__(self, name): del self._headers[_hkey(name)] + def __getitem__(self, name): return self._headers[_hkey(name)][-1] + def __setitem__(self, name, value): self._headers[_hkey(name)] = [str(value)] + +
[docs] def get_header(self, name, default=None): + ''' Return the value of a previously defined header. If there is no + header with that name, return a default value. ''' + return self._headers.get(_hkey(name), [default])[-1] +
+
[docs] def set_header(self, name, value): + ''' Create a new response header, replacing any previously defined + headers with the same name. ''' + self._headers[_hkey(name)] = [str(value)] +
+
[docs] def add_header(self, name, value): + ''' Add an additional response header, not removing duplicates. ''' + self._headers.setdefault(_hkey(name), []).append(str(value)) +
+
[docs] def iter_headers(self): + ''' Yield (header, value) tuples, skipping headers that are not + allowed with the current response status code. ''' + return self.headerlist +
+ def wsgiheader(self): + depr('The wsgiheader method is deprecated. See headerlist.') #0.10 + return self.headerlist + + @property +
[docs] def headerlist(self): + ''' WSGI conform list of (header, value) tuples. ''' + out = [] + headers = self._headers.items() + if self._status_code in self.bad_headers: + bad_headers = self.bad_headers[self._status_code] + headers = [h for h in headers if h[0] not in bad_headers] + out += [(name, val) for name, vals in headers for val in vals] + if self._cookies: + for c in self._cookies.values(): + out.append(('Set-Cookie', c.OutputString())) + return out +
+ content_type = HeaderProperty('Content-Type') + content_length = HeaderProperty('Content-Length', reader=int) + + @property +
[docs] def charset(self): + """ Return the charset specified in the content-type header (default: utf8). """ + if 'charset=' in self.content_type: + return self.content_type.split('charset=')[-1].split(';')[0].strip() + return 'UTF-8' +
+ @property +
[docs] def COOKIES(self): + """ A dict-like SimpleCookie instance. This should not be used directly. + See :meth:`set_cookie`. """ + depr('The COOKIES dict is deprecated. Use `set_cookie()` instead.') # 0.10 + if not self._cookies: + self._cookies = SimpleCookie() + return self._cookies +
+ + + def __repr__(self): + out = '' + for name, value in self.headerlist: + out += '%s: %s\n' % (name.title(), value.strip()) + return out + +#: Thread-local storage for :class:`LocalRequest` and :class:`LocalResponse` +#: attributes.
+_lctx = threading.local() + +def local_property(name): + def fget(self): + try: + return getattr(_lctx, name) + except AttributeError: + raise RuntimeError("Request context not initialized.") + def fset(self, value): setattr(_lctx, name, value) + def fdel(self): delattr(_lctx, name) + return property(fget, fset, fdel, + 'Thread-local property stored in :data:`_lctx.%s`' % name) + + +
[docs]class LocalRequest(BaseRequest): + ''' A thread-local subclass of :class:`BaseRequest` with a different + set of attribues for each thread. There is usually only one global + instance of this class (:data:`request`). If accessed during a + request/response cycle, this instance always refers to the *current* + request (even on a multithreaded server). ''' + bind = BaseRequest.__init__ + environ = local_property('request_environ') + +
+
[docs]class LocalResponse(BaseResponse): + ''' A thread-local subclass of :class:`BaseResponse` with a different + set of attribues for each thread. There is usually only one global + instance of this class (:data:`response`). Its attributes are used + to build the HTTP response at the end of the request/response cycle. + ''' + bind = BaseResponse.__init__ + _status_line = local_property('response_status_line') + _status_code = local_property('response_status_code') + _cookies = local_property('response_cookies') + _headers = local_property('response_headers') + body = local_property('response_body') +
+Request = BaseRequest +Response = BaseResponse + +
[docs]class HTTPResponse(Response, BottleException): + def __init__(self, body='', status=None, header=None, **headers): + if header or 'output' in headers: + depr('Call signature changed (for the better)') + if header: headers.update(header) + if 'output' in headers: body = headers.pop('output') + super(HTTPResponse, self).__init__(body, status, **headers) + + def apply(self, response): + response._status_code = self._status_code + response._status_line = self._status_line + response._headers = self._headers + response._cookies = self._cookies + response.body = self.body + + def _output(self, value=None): + depr('Use HTTPResponse.body instead of HTTPResponse.output') + if value is None: return self.body + self.body = value + + output = property(_output, _output, doc='Alias for .body') +
+
[docs]class HTTPError(HTTPResponse): + default_status = 500 + def __init__(self, status=None, body=None, exception=None, traceback=None, header=None, **headers): + self.exception = exception + self.traceback = traceback + super(HTTPError, self).__init__(body, status, header, **headers) + + + + + +############################################################################### +# Plugins ###################################################################### +############################################################################### +
+class PluginError(BottleException): pass + +class JSONPlugin(object): + name = 'json' + api = 2 + + def __init__(self, json_dumps=json_dumps): + self.json_dumps = json_dumps + + def apply(self, callback, route): + dumps = self.json_dumps + if not dumps: return callback + def wrapper(*a, **ka): + rv = callback(*a, **ka) + if isinstance(rv, dict): + #Attempt to serialize, raises exception on failure + json_response = dumps(rv) + #Set content type only if serialization succesful + response.content_type = 'application/json' + return json_response + return rv + return wrapper + + +class HooksPlugin(object): + name = 'hooks' + api = 2 + + _names = 'before_request', 'after_request', 'app_reset' + + def __init__(self): + self.hooks = dict((name, []) for name in self._names) + self.app = None + + def _empty(self): + return not (self.hooks['before_request'] or self.hooks['after_request']) + + def setup(self, app): + self.app = app + + def add(self, name, func): + ''' Attach a callback to a hook. ''' + was_empty = self._empty() + self.hooks.setdefault(name, []).append(func) + if self.app and was_empty and not self._empty(): self.app.reset() + + def remove(self, name, func): + ''' Remove a callback from a hook. ''' + was_empty = self._empty() + if name in self.hooks and func in self.hooks[name]: + self.hooks[name].remove(func) + if self.app and not was_empty and self._empty(): self.app.reset() + + def trigger(self, name, *a, **ka): + ''' Trigger a hook and return a list of results. ''' + hooks = self.hooks[name] + if ka.pop('reversed', False): hooks = hooks[::-1] + return [hook(*a, **ka) for hook in hooks] + + def apply(self, callback, route): + if self._empty(): return callback + def wrapper(*a, **ka): + self.trigger('before_request') + rv = callback(*a, **ka) + self.trigger('after_request', reversed=True) + return rv + return wrapper + + +class TemplatePlugin(object): + ''' This plugin applies the :func:`view` decorator to all routes with a + `template` config parameter. If the parameter is a tuple, the second + element must be a dict with additional options (e.g. `template_engine`) + or default variables for the template. ''' + name = 'template' + api = 2 + + def apply(self, callback, route): + conf = route.config.get('template') + if isinstance(conf, (tuple, list)) and len(conf) == 2: + return view(conf[0], **conf[1])(callback) + elif isinstance(conf, str) and 'template_opts' in route.config: + depr('The `template_opts` parameter is deprecated.') #0.9 + return view(conf, **route.config['template_opts'])(callback) + elif isinstance(conf, str): + return view(conf)(callback) + else: + return callback + + +#: Not a plugin, but part of the plugin API. TODO: Find a better place. +class _ImportRedirect(object): + def __init__(self, name, impmask): + ''' Create a virtual package that redirects imports (see PEP 302). ''' + self.name = name + self.impmask = impmask + self.module = sys.modules.setdefault(name, imp.new_module(name)) + self.module.__dict__.update({'__file__': __file__, '__path__': [], + '__all__': [], '__loader__': self}) + sys.meta_path.append(self) + + def find_module(self, fullname, path=None): + if '.' not in fullname: return + packname, modname = fullname.rsplit('.', 1) + if packname != self.name: return + return self + + def load_module(self, fullname): + if fullname in sys.modules: return sys.modules[fullname] + packname, modname = fullname.rsplit('.', 1) + realname = self.impmask % modname + __import__(realname) + module = sys.modules[fullname] = sys.modules[realname] + setattr(self.module, modname, module) + module.__loader__ = self + return module + + + + + + +############################################################################### +# Common Utilities ############################################################# +############################################################################### + + +
[docs]class MultiDict(DictMixin): + """ This dict stores multiple values per key, but behaves exactly like a + normal dict in that it returns only the newest value for any given key. + There are special methods available to access the full list of values. + """ + + def __init__(self, *a, **k): + self.dict = dict((k, [v]) for (k, v) in dict(*a, **k).items()) + + def __len__(self): return len(self.dict) + def __iter__(self): return iter(self.dict) + def __contains__(self, key): return key in self.dict + def __delitem__(self, key): del self.dict[key] + def __getitem__(self, key): return self.dict[key][-1] + def __setitem__(self, key, value): self.append(key, value) + def keys(self): return self.dict.keys() + + if py3k: + def values(self): return (v[-1] for v in self.dict.values()) + def items(self): return ((k, v[-1]) for k, v in self.dict.items()) + def allitems(self): + return ((k, v) for k, vl in self.dict.items() for v in vl) + iterkeys = keys + itervalues = values + iteritems = items + iterallitems = allitems + + else: + def values(self): return [v[-1] for v in self.dict.values()] + def items(self): return [(k, v[-1]) for k, v in self.dict.items()] + def iterkeys(self): return self.dict.iterkeys() + def itervalues(self): return (v[-1] for v in self.dict.itervalues()) + def iteritems(self): + return ((k, v[-1]) for k, v in self.dict.iteritems()) + def iterallitems(self): + return ((k, v) for k, vl in self.dict.iteritems() for v in vl) + def allitems(self): + return [(k, v) for k, vl in self.dict.iteritems() for v in vl] + +
[docs] def get(self, key, default=None, index=-1, type=None): + ''' Return the most recent value for a key. + + :param default: The default value to be returned if the key is not + present or the type conversion fails. + :param index: An index for the list of available values. + :param type: If defined, this callable is used to cast the value + into a specific type. Exception are suppressed and result in + the default value to be returned. + ''' + try: + val = self.dict[key][index] + return type(val) if type else val + except Exception: + pass + return default +
+
[docs] def append(self, key, value): + ''' Add a new value to the list of values for this key. ''' + self.dict.setdefault(key, []).append(value) +
+
[docs] def replace(self, key, value): + ''' Replace the list of values with a single value. ''' + self.dict[key] = [value] +
+
[docs] def getall(self, key): + ''' Return a (possibly empty) list of values for a key. ''' + return self.dict.get(key) or [] + + #: Aliases for WTForms to mimic other multi-dict APIs (Django)
+ getone = get + getlist = getall + + +
+
[docs]class FormsDict(MultiDict): + ''' This :class:`MultiDict` subclass is used to store request form data. + Additionally to the normal dict-like item access methods (which return + unmodified data as native strings), this container also supports + attribute-like access to its values. Attributes are automatically de- + or recoded to match :attr:`input_encoding` (default: 'utf8'). Missing + attributes default to an empty string. ''' + + #: Encoding used for attribute values. + input_encoding = 'utf8' + #: If true (default), unicode strings are first encoded with `latin1` + #: and then decoded to match :attr:`input_encoding`. + recode_unicode = True + + def _fix(self, s, encoding=None): + if isinstance(s, unicode) and self.recode_unicode: # Python 3 WSGI + s = s.encode('latin1') + if isinstance(s, bytes): # Python 2 WSGI + return s.decode(encoding or self.input_encoding) + return s + +
[docs] def decode(self, encoding=None): + ''' Returns a copy with all keys and values de- or recoded to match + :attr:`input_encoding`. Some libraries (e.g. WTForms) want a + unicode dictionary. ''' + copy = FormsDict() + enc = copy.input_encoding = encoding or self.input_encoding + copy.recode_unicode = False + for key, value in self.allitems(): + copy.append(self._fix(key, enc), self._fix(value, enc)) + return copy +
+ def getunicode(self, name, default=None, encoding=None): + try: + return self._fix(self[name], encoding) + except (UnicodeError, KeyError): + return default + + def __getattr__(self, name, default=unicode()): + # Without this guard, pickle generates a cryptic TypeError: + if name.startswith('__') and name.endswith('__'): + return super(FormsDict, self).__getattr__(name) + return self.getunicode(name, default=default) + +
+
[docs]class HeaderDict(MultiDict): + """ A case-insensitive version of :class:`MultiDict` that defaults to + replace the old value instead of appending it. """ + + def __init__(self, *a, **ka): + self.dict = {} + if a or ka: self.update(*a, **ka) + + def __contains__(self, key): return _hkey(key) in self.dict + def __delitem__(self, key): del self.dict[_hkey(key)] + def __getitem__(self, key): return self.dict[_hkey(key)][-1] + def __setitem__(self, key, value): self.dict[_hkey(key)] = [str(value)] + def append(self, key, value): + self.dict.setdefault(_hkey(key), []).append(str(value)) + def replace(self, key, value): self.dict[_hkey(key)] = [str(value)] + def getall(self, key): return self.dict.get(_hkey(key)) or [] + def get(self, key, default=None, index=-1): + return MultiDict.get(self, _hkey(key), default, index) + def filter(self, names): + for name in [_hkey(n) for n in names]: + if name in self.dict: + del self.dict[name] + +
+
[docs]class WSGIHeaderDict(DictMixin): + ''' This dict-like class wraps a WSGI environ dict and provides convenient + access to HTTP_* fields. Keys and values are native strings + (2.x bytes or 3.x unicode) and keys are case-insensitive. If the WSGI + environment contains non-native string values, these are de- or encoded + using a lossless 'latin1' character set. + + The API will remain stable even on changes to the relevant PEPs. + Currently PEP 333, 444 and 3333 are supported. (PEP 444 is the only one + that uses non-native strings.) + ''' + #: List of keys that do not have a ``HTTP_`` prefix. + cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH') + + def __init__(self, environ): + self.environ = environ + + def _ekey(self, key): + ''' Translate header field name to CGI/WSGI environ key. ''' + key = key.replace('-','_').upper() + if key in self.cgikeys: + return key + return 'HTTP_' + key + +
[docs] def raw(self, key, default=None): + ''' Return the header value as is (may be bytes or unicode). ''' + return self.environ.get(self._ekey(key), default) +
+ def __getitem__(self, key): + return tonat(self.environ[self._ekey(key)], 'latin1') + + def __setitem__(self, key, value): + raise TypeError("%s is read-only." % self.__class__) + + def __delitem__(self, key): + raise TypeError("%s is read-only." % self.__class__) + + def __iter__(self): + for key in self.environ: + if key[:5] == 'HTTP_': + yield key[5:].replace('_', '-').title() + elif key in self.cgikeys: + yield key.replace('_', '-').title() + + def keys(self): return [x for x in self] + def __len__(self): return len(self.keys()) + def __contains__(self, key): return self._ekey(key) in self.environ + +
+class ConfigDict(dict): + ''' A dict-subclass with some extras: You can access keys like attributes. + Uppercase attributes create new ConfigDicts and act as name-spaces. + Other missing attributes return None. Calling a ConfigDict updates its + values and returns itself. + + >>> cfg = ConfigDict() + >>> cfg.Namespace.value = 5 + >>> cfg.OtherNamespace(a=1, b=2) + >>> cfg + {'Namespace': {'value': 5}, 'OtherNamespace': {'a': 1, 'b': 2}} + ''' + + def __getattr__(self, key): + if key not in self and key[0].isupper(): + self[key] = ConfigDict() + return self.get(key) + + def __setattr__(self, key, value): + if hasattr(dict, key): + raise AttributeError('Read-only attribute.') + if key in self and self[key] and isinstance(self[key], ConfigDict): + raise AttributeError('Non-empty namespace attribute.') + self[key] = value + + def __delattr__(self, key): + if key in self: del self[key] + + def __call__(self, *a, **ka): + for key, value in dict(*a, **ka).items(): setattr(self, key, value) + return self + + +
[docs]class AppStack(list): + """ A stack-like list. Calling it returns the head of the stack. """ + + def __call__(self): + """ Return the current default application. """ + return self[-1] + +
[docs] def push(self, value=None): + """ Add a new :class:`Bottle` instance to the stack """ + if not isinstance(value, Bottle): + value = Bottle() + self.append(value) + return value + +
+class WSGIFileWrapper(object): + + def __init__(self, fp, buffer_size=1024*64): + self.fp, self.buffer_size = fp, buffer_size + for attr in ('fileno', 'close', 'read', 'readlines', 'tell', 'seek'): + if hasattr(fp, attr): setattr(self, attr, getattr(fp, attr)) + + def __iter__(self): + buff, read = self.buffer_size, self.read + while True: + part = read(buff) + if not part: return + yield part + + +
[docs]class ResourceManager(object): + ''' This class manages a list of search paths and helps to find and open + application-bound resources (files). + + :param base: default value for :meth:`add_path` calls. + :param opener: callable used to open resources. + :param cachemode: controls which lookups are cached. One of 'all', + 'found' or 'none'. + ''' + + def __init__(self, base='./', opener=open, cachemode='all'): + self.opener = open + self.base = base + self.cachemode = cachemode + + #: A list of search paths. See :meth:`add_path` for details. + self.path = [] + #: A cache for resolved paths. ``res.cache.clear()`` clears the cache. + self.cache = {} + +
[docs] def add_path(self, path, base=None, index=None, create=False): + ''' Add a new path to the list of search paths. Return False if the + path does not exist. + + :param path: The new search path. Relative paths are turned into + an absolute and normalized form. If the path looks like a file + (not ending in `/`), the filename is stripped off. + :param base: Path used to absolutize relative search paths. + Defaults to :attr:`base` which defaults to ``os.getcwd()``. + :param index: Position within the list of search paths. Defaults + to last index (appends to the list). + + The `base` parameter makes it easy to reference files installed + along with a python module or package:: + + res.add_path('./resources/', __file__) + ''' + base = os.path.abspath(os.path.dirname(base or self.base)) + path = os.path.abspath(os.path.join(base, os.path.dirname(path))) + path += os.sep + if path in self.path: + self.path.remove(path) + if create and not os.path.isdir(path): + os.makedirs(path) + if index is None: + self.path.append(path) + else: + self.path.insert(index, path) + self.cache.clear() + return os.path.exists(path) +
+ def __iter__(self): + ''' Iterate over all existing files in all registered paths. ''' + search = self.path[:] + while search: + path = search.pop() + if not os.path.isdir(path): continue + for name in os.listdir(path): + full = os.path.join(path, name) + if os.path.isdir(full): search.append(full) + else: yield full + +
[docs] def lookup(self, name): + ''' Search for a resource and return an absolute file path, or `None`. + + The :attr:`path` list is searched in order. The first match is + returend. Symlinks are followed. The result is cached to speed up + future lookups. ''' + if name not in self.cache or DEBUG: + for path in self.path: + fpath = os.path.join(path, name) + if os.path.isfile(fpath): + if self.cachemode in ('all', 'found'): + self.cache[name] = fpath + return fpath + if self.cachemode == 'all': + self.cache[name] = None + return self.cache[name] +
+
[docs] def open(self, name, mode='r', *args, **kwargs): + ''' Find a resource and return a file object, or raise IOError. ''' + fname = self.lookup(name) + if not fname: raise IOError("Resource %r not found." % name) + return self.opener(name, mode=mode, *args, **kwargs) + + + + + + +############################################################################### +# Application Helper ########################################################### +############################################################################### + +
+def abort(code=500, text='Unknown Error: Application stopped.'): + """ Aborts execution and causes a HTTP error. """ + raise HTTPError(code, text) + + +def redirect(url, code=None): + """ Aborts execution and causes a 303 or 302 redirect, depending on + the HTTP protocol version. """ + if code is None: + code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302 + location = urljoin(request.url, url) + raise HTTPResponse("", status=code, Location=location) + + +def _file_iter_range(fp, offset, bytes, maxread=1024*1024): + ''' Yield chunks from a range in a file. No chunk is bigger than maxread.''' + fp.seek(offset) + while bytes > 0: + part = fp.read(min(bytes, maxread)) + if not part: break + bytes -= len(part) + yield part + + +def static_file(filename, root, mimetype='auto', download=False): + """ Open a file in a safe way and return :exc:`HTTPResponse` with status + code 200, 305, 401 or 404. Set Content-Type, Content-Encoding, + Content-Length and Last-Modified header. Obey If-Modified-Since header + and HEAD requests. + """ + root = os.path.abspath(root) + os.sep + filename = os.path.abspath(os.path.join(root, filename.strip('/\\'))) + headers = dict() + + if not filename.startswith(root): + return HTTPError(403, "Access denied.") + if not os.path.exists(filename) or not os.path.isfile(filename): + return HTTPError(404, "File does not exist.") + if not os.access(filename, os.R_OK): + return HTTPError(403, "You do not have permission to access this file.") + + if mimetype == 'auto': + mimetype, encoding = mimetypes.guess_type(filename) + if mimetype: headers['Content-Type'] = mimetype + if encoding: headers['Content-Encoding'] = encoding + elif mimetype: + headers['Content-Type'] = mimetype + + if download: + download = os.path.basename(filename if download == True else download) + headers['Content-Disposition'] = 'attachment; filename="%s"' % download + + stats = os.stat(filename) + headers['Content-Length'] = clen = stats.st_size + lm = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(stats.st_mtime)) + headers['Last-Modified'] = lm + + ims = request.environ.get('HTTP_IF_MODIFIED_SINCE') + if ims: + ims = parse_date(ims.split(";")[0].strip()) + if ims is not None and ims >= int(stats.st_mtime): + headers['Date'] = time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()) + return HTTPResponse(status=304, **headers) + + body = '' if request.method == 'HEAD' else open(filename, 'rb') + + headers["Accept-Ranges"] = "bytes" + ranges = request.environ.get('HTTP_RANGE') + if 'HTTP_RANGE' in request.environ: + ranges = list(parse_range_header(request.environ['HTTP_RANGE'], clen)) + if not ranges: + return HTTPError(416, "Requested Range Not Satisfiable") + offset, end = ranges[0] + headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end-1, clen) + headers["Content-Length"] = str(end-offset) + if body: body = _file_iter_range(body, offset, end-offset) + return HTTPResponse(body, status=206, **headers) + return HTTPResponse(body, **headers) + + + + + + +############################################################################### +# HTTP Utilities and MISC (TODO) ############################################### +############################################################################### + + +
[docs]def debug(mode=True): + """ Change the debug level. + There is only one debug level supported at the moment.""" + global DEBUG + DEBUG = bool(mode) + +
+
[docs]def parse_date(ims): + """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ + try: + ts = email.utils.parsedate_tz(ims) + return time.mktime(ts[:8] + (0,)) - (ts[9] or 0) - time.timezone + except (TypeError, ValueError, IndexError, OverflowError): + return None + +
+
[docs]def parse_auth(header): + """ Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None""" + try: + method, data = header.split(None, 1) + if method.lower() == 'basic': + user, pwd = touni(base64.b64decode(tob(data))).split(':',1) + return user, pwd + except (KeyError, ValueError): + return None +
+def parse_range_header(header, maxlen=0): + ''' Yield (start, end) ranges parsed from a HTTP Range header. Skip + unsatisfiable ranges. The end index is non-inclusive.''' + if not header or header[:6] != 'bytes=': return + ranges = [r.split('-', 1) for r in header[6:].split(',') if '-' in r] + for start, end in ranges: + try: + if not start: # bytes=-100 -> last 100 bytes + start, end = max(0, maxlen-int(end)), maxlen + elif not end: # bytes=100- -> all but the first 99 bytes + start, end = int(start), maxlen + else: # bytes=100-200 -> bytes 100-200 (inclusive) + start, end = int(start), min(int(end)+1, maxlen) + if 0 <= start < end <= maxlen: + yield start, end + except ValueError: + pass + +def _parse_qsl(qs): + r = [] + for pair in qs.replace(';','&').split('&'): + if not pair: continue + nv = pair.split('=', 1) + if len(nv) != 2: nv.append('') + key = urlunquote(nv[0].replace('+', ' ')) + value = urlunquote(nv[1].replace('+', ' ')) + r.append((key, value)) + return r + +def _lscmp(a, b): + ''' Compares two strings in a cryptographically safe way: + Runtime is not affected by length of common prefix. ''' + return not sum(0 if x==y else 1 for x, y in zip(a, b)) and len(a) == len(b) + + + + + +def html_escape(string): + ''' Escape HTML special characters ``&<>`` and quotes ``'"``. ''' + return string.replace('&','&amp;').replace('<','&lt;').replace('>','&gt;')\ + .replace('"','&quot;').replace("'",'&#039;') + + +def html_quote(string): + ''' Escape and quote a string to be used as an HTTP attribute.''' + return '"%s"' % html_escape(string).replace('\n','%#10;')\ + .replace('\r','&#13;').replace('\t','&#9;') + + +
[docs]def yieldroutes(func): + """ Return a generator for routes that match the signature (name, args) + of the func parameter. This may yield more than one route if the function + takes optional keyword arguments. The output is best described by example:: + + a() -> '/a' + b(x, y) -> '/b/:x/:y' + c(x, y=5) -> '/c/:x' and '/c/:x/:y' + d(x=5, y=6) -> '/d' and '/d/:x' and '/d/:x/:y' + """ + import inspect # Expensive module. Only import if necessary. + path = '/' + func.__name__.replace('__','/').lstrip('/') + spec = inspect.getargspec(func) + argc = len(spec[0]) - len(spec[3] or []) + path += ('/:%s' * argc) % tuple(spec[0][:argc]) + yield path + for arg in spec[0][argc:]: + path += '/:%s' % arg + yield path + +
+
[docs]def path_shift(script_name, path_info, shift=1): + ''' Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa. + + :return: The modified paths. + :param script_name: The SCRIPT_NAME path. + :param script_name: The PATH_INFO path. + :param shift: The number of path fragments to shift. May be negative to + change the shift direction. (default: 1) + ''' + if shift == 0: return script_name, path_info + pathlist = path_info.strip('/').split('/') + scriptlist = script_name.strip('/').split('/') + if pathlist and pathlist[0] == '': pathlist = [] + if scriptlist and scriptlist[0] == '': scriptlist = [] + if shift > 0 and shift <= len(pathlist): + moved = pathlist[:shift] + scriptlist = scriptlist + moved + pathlist = pathlist[shift:] + elif shift < 0 and shift >= -len(scriptlist): + moved = scriptlist[shift:] + pathlist = moved + pathlist + scriptlist = scriptlist[:shift] + else: + empty = 'SCRIPT_NAME' if shift < 0 else 'PATH_INFO' + raise AssertionError("Cannot shift. Nothing left from %s" % empty) + new_script_name = '/' + '/'.join(scriptlist) + new_path_info = '/' + '/'.join(pathlist) + if path_info.endswith('/') and pathlist: new_path_info += '/' + return new_script_name, new_path_info + +
+def validate(**vkargs): + """ + Validates and manipulates keyword arguments by user defined callables. + Handles ValueError and missing arguments by raising HTTPError(403). + """ + depr('Use route wildcard filters instead.') + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kargs): + for key, value in vkargs.items(): + if key not in kargs: + abort(403, 'Missing parameter: %s' % key) + try: + kargs[key] = value(kargs[key]) + except ValueError: + abort(403, 'Wrong parameter format for: %s' % key) + return func(*args, **kargs) + return wrapper + return decorator + + +def auth_basic(check, realm="private", text="Access denied"): + ''' Callback decorator to require HTTP auth (basic). + TODO: Add route(check_auth=...) parameter. ''' + def decorator(func): + def wrapper(*a, **ka): + user, password = request.auth or (None, None) + if user is None or not check(user, password): + response.headers['WWW-Authenticate'] = 'Basic realm="%s"' % realm + return HTTPError(401, text) + return func(*a, **ka) + return wrapper + return decorator + + +# Shortcuts for common Bottle methods. +# They all refer to the current default application. + +def make_default_app_wrapper(name): + ''' Return a callable that relays calls to the current default app. ''' + @functools.wraps(getattr(Bottle, name)) + def wrapper(*a, **ka): + return getattr(app(), name)(*a, **ka) + return wrapper + +route = make_default_app_wrapper('route') +get = make_default_app_wrapper('get') +post = make_default_app_wrapper('post') +put = make_default_app_wrapper('put') +delete = make_default_app_wrapper('delete') +error = make_default_app_wrapper('error') +mount = make_default_app_wrapper('mount') +hook = make_default_app_wrapper('hook') +install = make_default_app_wrapper('install') +uninstall = make_default_app_wrapper('uninstall') +url = make_default_app_wrapper('get_url') + + + + + + + +############################################################################### +# Server Adapter ############################################################### +############################################################################### + + +class ServerAdapter(object): + quiet = False + def __init__(self, host='127.0.0.1', port=8080, **config): + self.options = config + self.host = host + self.port = int(port) + + def run(self, handler): # pragma: no cover + pass + + def __repr__(self): + args = ', '.join(['%s=%s'%(k,repr(v)) for k, v in self.options.items()]) + return "%s(%s)" % (self.__class__.__name__, args) + + +class CGIServer(ServerAdapter): + quiet = True + def run(self, handler): # pragma: no cover + from wsgiref.handlers import CGIHandler + def fixed_environ(environ, start_response): + environ.setdefault('PATH_INFO', '') + return handler(environ, start_response) + CGIHandler().run(fixed_environ) + + +class FlupFCGIServer(ServerAdapter): + def run(self, handler): # pragma: no cover + import flup.server.fcgi + self.options.setdefault('bindAddress', (self.host, self.port)) + flup.server.fcgi.WSGIServer(handler, **self.options).run() + + +class WSGIRefServer(ServerAdapter): + def run(self, handler): # pragma: no cover + from wsgiref.simple_server import make_server, WSGIRequestHandler + if self.quiet: + class QuietHandler(WSGIRequestHandler): + def log_request(*args, **kw): pass + self.options['handler_class'] = QuietHandler + srv = make_server(self.host, self.port, handler, **self.options) + srv.serve_forever() + + +class CherryPyServer(ServerAdapter): + def run(self, handler): # pragma: no cover + from cherrypy import wsgiserver + server = wsgiserver.CherryPyWSGIServer((self.host, self.port), handler) + try: + server.start() + finally: + server.stop() + + +class WaitressServer(ServerAdapter): + def run(self, handler): + from waitress import serve + serve(handler, host=self.host, port=self.port) + + +class PasteServer(ServerAdapter): + def run(self, handler): # pragma: no cover + from paste import httpserver + if not self.quiet: + from paste.translogger import TransLogger + handler = TransLogger(handler) + httpserver.serve(handler, host=self.host, port=str(self.port), + **self.options) + + +class MeinheldServer(ServerAdapter): + def run(self, handler): + from meinheld import server + server.listen((self.host, self.port)) + server.run(handler) + + +class FapwsServer(ServerAdapter): + """ Extremely fast webserver using libev. See http://www.fapws.org/ """ + def run(self, handler): # pragma: no cover + import fapws._evwsgi as evwsgi + from fapws import base, config + port = self.port + if float(config.SERVER_IDENT[-2:]) > 0.4: + # fapws3 silently changed its API in 0.5 + port = str(port) + evwsgi.start(self.host, port) + # fapws3 never releases the GIL. Complain upstream. I tried. No luck. + if 'BOTTLE_CHILD' in os.environ and not self.quiet: + _stderr("WARNING: Auto-reloading does not work with Fapws3.\n") + _stderr(" (Fapws3 breaks python thread support)\n") + evwsgi.set_base_module(base) + def app(environ, start_response): + environ['wsgi.multiprocess'] = False + return handler(environ, start_response) + evwsgi.wsgi_cb(('', app)) + evwsgi.run() + + +class TornadoServer(ServerAdapter): + """ The super hyped asynchronous server by facebook. Untested. """ + def run(self, handler): # pragma: no cover + import tornado.wsgi, tornado.httpserver, tornado.ioloop + container = tornado.wsgi.WSGIContainer(handler) + server = tornado.httpserver.HTTPServer(container) + server.listen(port=self.port) + tornado.ioloop.IOLoop.instance().start() + + +class AppEngineServer(ServerAdapter): + """ Adapter for Google App Engine. """ + quiet = True + def run(self, handler): + from google.appengine.ext.webapp import util + # A main() function in the handler script enables 'App Caching'. + # Lets makes sure it is there. This _really_ improves performance. + module = sys.modules.get('__main__') + if module and not hasattr(module, 'main'): + module.main = lambda: util.run_wsgi_app(handler) + util.run_wsgi_app(handler) + + +class TwistedServer(ServerAdapter): + """ Untested. """ + def run(self, handler): + from twisted.web import server, wsgi + from twisted.python.threadpool import ThreadPool + from twisted.internet import reactor + thread_pool = ThreadPool() + thread_pool.start() + reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) + factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, handler)) + reactor.listenTCP(self.port, factory, interface=self.host) + reactor.run() + + +class DieselServer(ServerAdapter): + """ Untested. """ + def run(self, handler): + from diesel.protocols.wsgi import WSGIApplication + app = WSGIApplication(handler, port=self.port) + app.run() + + +class GeventServer(ServerAdapter): + """ Untested. Options: + + * `fast` (default: False) uses libevent's http server, but has some + issues: No streaming, no pipelining, no SSL. + """ + def run(self, handler): + from gevent import wsgi, pywsgi, local + if not isinstance(_lctx, local.local): + msg = "Bottle requires gevent.monkey.patch_all() (before import)" + raise RuntimeError(msg) + if not self.options.get('fast'): wsgi = pywsgi + log = None if self.quiet else 'default' + wsgi.WSGIServer((self.host, self.port), handler, log=log).serve_forever() + + +class GunicornServer(ServerAdapter): + """ Untested. See http://gunicorn.org/configure.html for options. """ + def run(self, handler): + from gunicorn.app.base import Application + + config = {'bind': "%s:%d" % (self.host, int(self.port))} + config.update(self.options) + + class GunicornApplication(Application): + def init(self, parser, opts, args): + return config + + def load(self): + return handler + + GunicornApplication().run() + + +class EventletServer(ServerAdapter): + """ Untested """ + def run(self, handler): + from eventlet import wsgi, listen + try: + wsgi.server(listen((self.host, self.port)), handler, + log_output=(not self.quiet)) + except TypeError: + # Fallback, if we have old version of eventlet + wsgi.server(listen((self.host, self.port)), handler) + + +class RocketServer(ServerAdapter): + """ Untested. """ + def run(self, handler): + from rocket import Rocket + server = Rocket((self.host, self.port), 'wsgi', { 'wsgi_app' : handler }) + server.start() + + +class BjoernServer(ServerAdapter): + """ Fast server written in C: https://github.com/jonashaag/bjoern """ + def run(self, handler): + from bjoern import run + run(handler, self.host, self.port) + + +class AutoServer(ServerAdapter): + """ Untested. """ + adapters = [WaitressServer, PasteServer, TwistedServer, CherryPyServer, WSGIRefServer] + def run(self, handler): + for sa in self.adapters: + try: + return sa(self.host, self.port, **self.options).run(handler) + except ImportError: + pass + +server_names = { + 'cgi': CGIServer, + 'flup': FlupFCGIServer, + 'wsgiref': WSGIRefServer, + 'waitress': WaitressServer, + 'cherrypy': CherryPyServer, + 'paste': PasteServer, + 'fapws3': FapwsServer, + 'tornado': TornadoServer, + 'gae': AppEngineServer, + 'twisted': TwistedServer, + 'diesel': DieselServer, + 'meinheld': MeinheldServer, + 'gunicorn': GunicornServer, + 'eventlet': EventletServer, + 'gevent': GeventServer, + 'rocket': RocketServer, + 'bjoern' : BjoernServer, + 'auto': AutoServer, +} + + + + + + +############################################################################### +# Application Control ########################################################## +############################################################################### + + +
[docs]def load(target, **namespace): + """ Import a module or fetch an object from a module. + + * ``package.module`` returns `module` as a module object. + * ``pack.mod:name`` returns the module variable `name` from `pack.mod`. + * ``pack.mod:func()`` calls `pack.mod.func()` and returns the result. + + The last form accepts not only function calls, but any type of + expression. Keyword arguments passed to this function are available as + local variables. Example: ``import_string('re:compile(x)', x='[a-z]')`` + """ + module, target = target.split(":", 1) if ':' in target else (target, None) + if module not in sys.modules: __import__(module) + if not target: return sys.modules[module] + if target.isalnum(): return getattr(sys.modules[module], target) + package_name = module.split('.')[0] + namespace[package_name] = sys.modules[package_name] + return eval('%s.%s' % (module, target), namespace) + +
+
[docs]def load_app(target): + """ Load a bottle application from a module and make sure that the import + does not affect the current default application, but returns a separate + application object. See :func:`load` for the target parameter. """ + global NORUN; NORUN, nr_old = True, NORUN + try: + tmp = default_app.push() # Create a new "default application" + rv = load(target) # Import the target module + return rv if callable(rv) else tmp + finally: + default_app.remove(tmp) # Remove the temporary added default application + NORUN = nr_old +
+_debug = debug +
[docs]def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, + interval=1, reloader=False, quiet=False, plugins=None, + debug=False, **kargs): + """ Start a server instance. This method blocks until the server terminates. + + :param app: WSGI application or target string supported by + :func:`load_app`. (default: :func:`default_app`) + :param server: Server adapter to use. See :data:`server_names` keys + for valid names or pass a :class:`ServerAdapter` subclass. + (default: `wsgiref`) + :param host: Server address to bind to. Pass ``0.0.0.0`` to listens on + all interfaces including the external one. (default: 127.0.0.1) + :param port: Server port to bind to. Values below 1024 require root + privileges. (default: 8080) + :param reloader: Start auto-reloading server? (default: False) + :param interval: Auto-reloader interval in seconds (default: 1) + :param quiet: Suppress output to stdout and stderr? (default: False) + :param options: Options passed to the server adapter. + """ + if NORUN: return + if reloader and not os.environ.get('BOTTLE_CHILD'): + try: + lockfile = None + fd, lockfile = tempfile.mkstemp(prefix='bottle.', suffix='.lock') + os.close(fd) # We only need this file to exist. We never write to it + while os.path.exists(lockfile): + args = [sys.executable] + sys.argv + environ = os.environ.copy() + environ['BOTTLE_CHILD'] = 'true' + environ['BOTTLE_LOCKFILE'] = lockfile + p = subprocess.Popen(args, env=environ) + while p.poll() is None: # Busy wait... + os.utime(lockfile, None) # I am alive! + time.sleep(interval) + if p.poll() != 3: + if os.path.exists(lockfile): os.unlink(lockfile) + sys.exit(p.poll()) + except KeyboardInterrupt: + pass + finally: + if os.path.exists(lockfile): + os.unlink(lockfile) + return + + try: + _debug(debug) + app = app or default_app() + if isinstance(app, basestring): + app = load_app(app) + if not callable(app): + raise ValueError("Application is not callable: %r" % app) + + for plugin in plugins or []: + app.install(plugin) + + if server in server_names: + server = server_names.get(server) + if isinstance(server, basestring): + server = load(server) + if isinstance(server, type): + server = server(host=host, port=port, **kargs) + if not isinstance(server, ServerAdapter): + raise ValueError("Unknown or unsupported server: %r" % server) + + server.quiet = server.quiet or quiet + if not server.quiet: + _stderr("Bottle v%s server starting up (using %s)...\n" % (__version__, repr(server))) + _stderr("Listening on http://%s:%d/\n" % (server.host, server.port)) + _stderr("Hit Ctrl-C to quit.\n\n") + + if reloader: + lockfile = os.environ.get('BOTTLE_LOCKFILE') + bgcheck = FileCheckerThread(lockfile, interval) + with bgcheck: + server.run(app) + if bgcheck.status == 'reload': + sys.exit(3) + else: + server.run(app) + except KeyboardInterrupt: + pass + except (SystemExit, MemoryError): + raise + except: + if not reloader: raise + if not getattr(server, 'quiet', quiet): + print_exc() + time.sleep(interval) + sys.exit(3) + + +
+class FileCheckerThread(threading.Thread): + ''' Interrupt main-thread as soon as a changed module file is detected, + the lockfile gets deleted or gets to old. ''' + + def __init__(self, lockfile, interval): + threading.Thread.__init__(self) + self.lockfile, self.interval = lockfile, interval + #: Is one of 'reload', 'error' or 'exit' + self.status = None + + def run(self): + exists = os.path.exists + mtime = lambda path: os.stat(path).st_mtime + files = dict() + + for module in list(sys.modules.values()): + path = getattr(module, '__file__', '') + if path[-4:] in ('.pyo', '.pyc'): path = path[:-1] + if path and exists(path): files[path] = mtime(path) + + while not self.status: + if not exists(self.lockfile)\ + or mtime(self.lockfile) < time.time() - self.interval - 5: + self.status = 'error' + thread.interrupt_main() + for path, lmtime in list(files.items()): + if not exists(path) or mtime(path) > lmtime: + self.status = 'reload' + thread.interrupt_main() + break + time.sleep(self.interval) + + def __enter__(self): + self.start() + + def __exit__(self, exc_type, exc_val, exc_tb): + if not self.status: self.status = 'exit' # silent exit + self.join() + return exc_type is not None and issubclass(exc_type, KeyboardInterrupt) + + + + + +############################################################################### +# Template Adapters ############################################################ +############################################################################### + + +class TemplateError(HTTPError): + def __init__(self, message): + HTTPError.__init__(self, 500, message) + + +
[docs]class BaseTemplate(object): + """ Base class and minimal API for template adapters """ + extensions = ['tpl','html','thtml','stpl'] + settings = {} #used in prepare() + defaults = {} #used in render() + +
[docs] def __init__(self, source=None, name=None, lookup=[], encoding='utf8', **settings): + """ Create a new template. + If the source parameter (str or buffer) is missing, the name argument + is used to guess a template filename. Subclasses can assume that + self.source and/or self.filename are set. Both are strings. + The lookup, encoding and settings parameters are stored as instance + variables. + The lookup parameter stores a list containing directory paths. + The encoding parameter should be used to decode byte strings or files. + The settings parameter contains a dict for engine-specific settings. + """ + self.name = name + self.source = source.read() if hasattr(source, 'read') else source + self.filename = source.filename if hasattr(source, 'filename') else None + self.lookup = [os.path.abspath(x) for x in lookup] + self.encoding = encoding + self.settings = self.settings.copy() # Copy from class variable + self.settings.update(settings) # Apply + if not self.source and self.name: + self.filename = self.search(self.name, self.lookup) + if not self.filename: + raise TemplateError('Template %s not found.' % repr(name)) + if not self.source and not self.filename: + raise TemplateError('No template specified.') + self.prepare(**self.settings) +
+ @classmethod +
[docs] def search(cls, name, lookup=[]): + """ Search name in all directories specified in lookup. + First without, then with common extensions. Return first hit. """ + if not lookup: + depr('The template lookup path list should not be empty.') + lookup = ['.'] + + if os.path.isabs(name) and os.path.isfile(name): + depr('Absolute template path names are deprecated.') + return os.path.abspath(name) + + for spath in lookup: + spath = os.path.abspath(spath) + os.sep + fname = os.path.abspath(os.path.join(spath, name)) + if not fname.startswith(spath): continue + if os.path.isfile(fname): return fname + for ext in cls.extensions: + if os.path.isfile('%s.%s' % (fname, ext)): + return '%s.%s' % (fname, ext) +
+ @classmethod +
[docs] def global_config(cls, key, *args): + ''' This reads or sets the global settings stored in class.settings. ''' + if args: + cls.settings = cls.settings.copy() # Make settings local to class + cls.settings[key] = args[0] + else: + return cls.settings[key] +
+
[docs] def prepare(self, **options): + """ Run preparations (parsing, caching, ...). + It should be possible to call this again to refresh a template or to + update settings. + """ + raise NotImplementedError +
+
[docs] def render(self, *args, **kwargs): + """ Render the template with the specified local variables and return + a single byte or unicode string. If it is a byte string, the encoding + must match self.encoding. This method must be thread-safe! + Local variables may be provided in dictionaries (*args) + or directly, as keywords (**kwargs). + """ + raise NotImplementedError + +
+class MakoTemplate(BaseTemplate): + def prepare(self, **options): + from mako.template import Template + from mako.lookup import TemplateLookup + options.update({'input_encoding':self.encoding}) + options.setdefault('format_exceptions', bool(DEBUG)) + lookup = TemplateLookup(directories=self.lookup, **options) + if self.source: + self.tpl = Template(self.source, lookup=lookup, **options) + else: + self.tpl = Template(uri=self.name, filename=self.filename, lookup=lookup, **options) + + def render(self, *args, **kwargs): + for dictarg in args: kwargs.update(dictarg) + _defaults = self.defaults.copy() + _defaults.update(kwargs) + return self.tpl.render(**_defaults) + + +class CheetahTemplate(BaseTemplate): + def prepare(self, **options): + from Cheetah.Template import Template + self.context = threading.local() + self.context.vars = {} + options['searchList'] = [self.context.vars] + if self.source: + self.tpl = Template(source=self.source, **options) + else: + self.tpl = Template(file=self.filename, **options) + + def render(self, *args, **kwargs): + for dictarg in args: kwargs.update(dictarg) + self.context.vars.update(self.defaults) + self.context.vars.update(kwargs) + out = str(self.tpl) + self.context.vars.clear() + return out + + +class Jinja2Template(BaseTemplate): + def prepare(self, filters=None, tests=None, **kwargs): + from jinja2 import Environment, FunctionLoader + if 'prefix' in kwargs: # TODO: to be removed after a while + raise RuntimeError('The keyword argument `prefix` has been removed. ' + 'Use the full jinja2 environment name line_statement_prefix instead.') + self.env = Environment(loader=FunctionLoader(self.loader), **kwargs) + if filters: self.env.filters.update(filters) + if tests: self.env.tests.update(tests) + if self.source: + self.tpl = self.env.from_string(self.source) + else: + self.tpl = self.env.get_template(self.filename) + + def render(self, *args, **kwargs): + for dictarg in args: kwargs.update(dictarg) + _defaults = self.defaults.copy() + _defaults.update(kwargs) + return self.tpl.render(**_defaults) + + def loader(self, name): + fname = self.search(name, self.lookup) + if not fname: return + with open(fname, "rb") as f: + return f.read().decode(self.encoding) + + +class SimpleTALTemplate(BaseTemplate): + ''' Deprecated, do not use. ''' + def prepare(self, **options): + depr('The SimpleTAL template handler is deprecated'\ + ' and will be removed in 0.12') + from simpletal import simpleTAL + if self.source: + self.tpl = simpleTAL.compileHTMLTemplate(self.source) + else: + with open(self.filename, 'rb') as fp: + self.tpl = simpleTAL.compileHTMLTemplate(tonat(fp.read())) + + def render(self, *args, **kwargs): + from simpletal import simpleTALES + for dictarg in args: kwargs.update(dictarg) + context = simpleTALES.Context() + for k,v in self.defaults.items(): + context.addGlobal(k, v) + for k,v in kwargs.items(): + context.addGlobal(k, v) + output = StringIO() + self.tpl.expand(context, output) + return output.getvalue() + + +
[docs]class SimpleTemplate(BaseTemplate): + blocks = ('if', 'elif', 'else', 'try', 'except', 'finally', 'for', 'while', + 'with', 'def', 'class') + dedent_blocks = ('elif', 'else', 'except', 'finally') + + @lazy_attribute + def re_pytokens(cls): + ''' This matches comments and all kinds of quoted strings but does + NOT match comments (#...) within quoted strings. (trust me) ''' + return re.compile(r''' + (''(?!')|""(?!")|'{6}|"{6} # Empty strings (all 4 types) + |'(?:[^\\']|\\.)+?' # Single quotes (') + |"(?:[^\\"]|\\.)+?" # Double quotes (") + |'{3}(?:[^\\]|\\.|\n)+?'{3} # Triple-quoted strings (') + |"{3}(?:[^\\]|\\.|\n)+?"{3} # Triple-quoted strings (") + |\#.* # Comments + )''', re.VERBOSE) + + def prepare(self, escape_func=html_escape, noescape=False, **kwargs): + self.cache = {} + enc = self.encoding + self._str = lambda x: touni(x, enc) + self._escape = lambda x: escape_func(touni(x, enc)) + if noescape: + self._str, self._escape = self._escape, self._str + + @classmethod +
[docs] def split_comment(cls, code): + """ Removes comments (#...) from python code. """ + if '#' not in code: return code + #: Remove comments only (leave quoted strings as they are) + subf = lambda m: '' if m.group(0)[0]=='#' else m.group(0) + return re.sub(cls.re_pytokens, subf, code) +
+ @cached_property + def co(self): + return compile(self.code, self.filename or '<string>', 'exec') + + @cached_property + def code(self): + stack = [] # Current Code indentation + lineno = 0 # Current line of code + ptrbuffer = [] # Buffer for printable strings and token tuple instances + codebuffer = [] # Buffer for generated python code + multiline = dedent = oneline = False + template = self.source or open(self.filename, 'rb').read() + + def yield_tokens(line): + for i, part in enumerate(re.split(r'\{\{(.*?)\}\}', line)): + if i % 2: + if part.startswith('!'): yield 'RAW', part[1:] + else: yield 'CMD', part + else: yield 'TXT', part + + def flush(): # Flush the ptrbuffer + if not ptrbuffer: return + cline = '' + for line in ptrbuffer: + for token, value in line: + if token == 'TXT': cline += repr(value) + elif token == 'RAW': cline += '_str(%s)' % value + elif token == 'CMD': cline += '_escape(%s)' % value + cline += ', ' + cline = cline[:-2] + '\\\n' + cline = cline[:-2] + if cline[:-1].endswith('\\\\\\\\\\n'): + cline = cline[:-7] + cline[-1] # 'nobr\\\\\n' --> 'nobr' + cline = '_printlist([' + cline + '])' + del ptrbuffer[:] # Do this before calling code() again + code(cline) + + def code(stmt): + for line in stmt.splitlines(): + codebuffer.append(' ' * len(stack) + line.strip()) + + for line in template.splitlines(True): + lineno += 1 + line = touni(line, self.encoding) + sline = line.lstrip() + if lineno <= 2: + m = re.match(r"%\s*#.*coding[:=]\s*([-\w.]+)", sline) + if m: self.encoding = m.group(1) + if m: line = line.replace('coding','coding (removed)') + if sline and sline[0] == '%' and sline[:2] != '%%': + line = line.split('%',1)[1].lstrip() # Full line following the % + cline = self.split_comment(line).strip() + cmd = re.split(r'[^a-zA-Z0-9_]', cline)[0] + flush() # You are actually reading this? Good luck, it's a mess :) + if cmd in self.blocks or multiline: + cmd = multiline or cmd + dedent = cmd in self.dedent_blocks # "else:" + if dedent and not oneline and not multiline: + cmd = stack.pop() + code(line) + oneline = not cline.endswith(':') # "if 1: pass" + multiline = cmd if cline.endswith('\\') else False + if not oneline and not multiline: + stack.append(cmd) + elif cmd == 'end' and stack: + code('#end(%s) %s' % (stack.pop(), line.strip()[3:])) + elif cmd == 'include': + p = cline.split(None, 2)[1:] + if len(p) == 2: + code("_=_include(%s, _stdout, %s)" % (repr(p[0]), p[1])) + elif p: + code("_=_include(%s, _stdout)" % repr(p[0])) + else: # Empty %include -> reverse of %rebase + code("_printlist(_base)") + elif cmd == 'rebase': + p = cline.split(None, 2)[1:] + if len(p) == 2: + code("globals()['_rebase']=(%s, dict(%s))" % (repr(p[0]), p[1])) + elif p: + code("globals()['_rebase']=(%s, {})" % repr(p[0])) + else: + code(line) + else: # Line starting with text (not '%') or '%%' (escaped) + if line.strip().startswith('%%'): + line = line.replace('%%', '%', 1) + ptrbuffer.append(yield_tokens(line)) + flush() + return '\n'.join(codebuffer) + '\n' + + def subtemplate(self, _name, _stdout, *args, **kwargs): + for dictarg in args: kwargs.update(dictarg) + if _name not in self.cache: + self.cache[_name] = self.__class__(name=_name, lookup=self.lookup) + return self.cache[_name].execute(_stdout, kwargs) + + def execute(self, _stdout, *args, **kwargs): + for dictarg in args: kwargs.update(dictarg) + env = self.defaults.copy() + env.update({'_stdout': _stdout, '_printlist': _stdout.extend, + '_include': self.subtemplate, '_str': self._str, + '_escape': self._escape, 'get': env.get, + 'setdefault': env.setdefault, 'defined': env.__contains__}) + env.update(kwargs) + eval(self.co, env) + if '_rebase' in env: + subtpl, rargs = env['_rebase'] + rargs['_base'] = _stdout[:] #copy stdout + del _stdout[:] # clear stdout + return self.subtemplate(subtpl,_stdout,rargs) + return env + +
[docs] def render(self, *args, **kwargs): + """ Render the template using keyword arguments as local variables. """ + for dictarg in args: kwargs.update(dictarg) + stdout = [] + self.execute(stdout, kwargs) + return ''.join(stdout) + +
+
[docs]def template(*args, **kwargs): + ''' + Get a rendered template as a string iterator. + You can use a name, a filename or a template string as first parameter. + Template rendering arguments can be passed as dictionaries + or directly (as keyword arguments). + ''' + tpl = args[0] if args else None + adapter = kwargs.pop('template_adapter', SimpleTemplate) + lookup = kwargs.pop('template_lookup', TEMPLATE_PATH) + tplid = (id(lookup), tpl) + if tpl not in TEMPLATES or DEBUG: + settings = kwargs.pop('template_settings', {}) + if isinstance(tpl, adapter): + TEMPLATES[tplid] = tpl + if settings: TEMPLATES[tplid].prepare(**settings) + elif "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl: + TEMPLATES[tplid] = adapter(source=tpl, lookup=lookup, **settings) + else: + TEMPLATES[tplid] = adapter(name=tpl, lookup=lookup, **settings) + if not TEMPLATES[tplid]: + abort(500, 'Template (%s) not found' % tpl) + for dictarg in args[1:]: kwargs.update(dictarg) + return TEMPLATES[tplid].render(kwargs) +
+mako_template = functools.partial(template, template_adapter=MakoTemplate) +cheetah_template = functools.partial(template, template_adapter=CheetahTemplate) +jinja2_template = functools.partial(template, template_adapter=Jinja2Template) +simpletal_template = functools.partial(template, template_adapter=SimpleTALTemplate) + + +
[docs]def view(tpl_name, **defaults): + ''' Decorator: renders a template for a handler. + The handler can control its behavior like that: + + - return a dict of template vars to fill out the template + - return something other than a dict and the view decorator will not + process the template, but return the handler result as is. + This includes returning a HTTPResponse(dict) to get, + for instance, JSON with autojson or other castfilters. + ''' + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + if isinstance(result, (dict, DictMixin)): + tplvars = defaults.copy() + tplvars.update(result) + return template(tpl_name, **tplvars) + return result + return wrapper + return decorator +
+mako_view = functools.partial(view, template_adapter=MakoTemplate) +cheetah_view = functools.partial(view, template_adapter=CheetahTemplate) +jinja2_view = functools.partial(view, template_adapter=Jinja2Template) +simpletal_view = functools.partial(view, template_adapter=SimpleTALTemplate) + + + + + + +############################################################################### +# Constants and Globals ######################################################## +############################################################################### + + +TEMPLATE_PATH = ['./', './views/'] +TEMPLATES = {} +DEBUG = False +NORUN = False # If set, run() does nothing. Used by load_app() + +#: A dict to map HTTP status codes (e.g. 404) to phrases (e.g. 'Not Found') +HTTP_CODES = httplib.responses +HTTP_CODES[418] = "I'm a teapot" # RFC 2324 +HTTP_CODES[428] = "Precondition Required" +HTTP_CODES[429] = "Too Many Requests" +HTTP_CODES[431] = "Request Header Fields Too Large" +HTTP_CODES[511] = "Network Authentication Required" +_HTTP_STATUS_LINES = dict((k, '%d %s'%(k,v)) for (k,v) in HTTP_CODES.items()) + +#: The default template used for error pages. Override with @error() +ERROR_PAGE_TEMPLATE = """ +%%try: + %%from %s import DEBUG, HTTP_CODES, request, touni + <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> + <html> + <head> + <title>Error: {{e.status}}</title> + <style type="text/css"> + html {background-color: #eee; font-family: sans;} + body {background-color: #fff; border: 1px solid #ddd; + padding: 15px; margin: 15px;} + pre {background-color: #eee; border: 1px solid #ddd; padding: 5px;} + </style> + </head> + <body> + <h1>Error: {{e.status}}</h1> + <p>Sorry, the requested URL <tt>{{repr(request.url)}}</tt> + caused an error:</p> + <pre>{{e.body}}</pre> + %%if DEBUG and e.exception: + <h2>Exception:</h2> + <pre>{{repr(e.exception)}}</pre> + %%end + %%if DEBUG and e.traceback: + <h2>Traceback:</h2> + <pre>{{e.traceback}}</pre> + %%end + </body> + </html> +%%except ImportError: + <b>ImportError:</b> Could not generate the error page. Please add bottle to + the import path. +%%end +""" % __name__ + +#: A thread-safe instance of :class:`LocalRequest`. If accessed from within a +#: request callback, this instance always refers to the *current* request +#: (even on a multithreaded server). +request = LocalRequest() + +#: A thread-safe instance of :class:`LocalResponse`. It is used to change the +#: HTTP response for the *current* request. +response = LocalResponse() + +#: A thread-safe namespace. Not used by Bottle. +local = threading.local() + +# Initialize app stack (create first empty Bottle app) +# BC: 0.6.4 and needed for run() +app = default_app = AppStack() +app.push() + +#: A virtual package that redirects import statements. +#: Example: ``import bottle.ext.sqlite`` actually imports `bottle_sqlite`. +ext = _ImportRedirect('bottle.ext' if __name__ == '__main__' else __name__+".ext", 'bottle_%s').module + +if __name__ == '__main__': + opt, args, parser = _cmd_options, _cmd_args, _cmd_parser + if opt.version: + _stdout('Bottle %s\n'%__version__) + sys.exit(0) + if not args: + parser.print_help() + _stderr('\nError: No application specified.\n') + sys.exit(1) + + sys.path.insert(0, '.') + sys.modules.setdefault('bottle', sys.modules['__main__']) + + host, port = (opt.bind or 'localhost'), 8080 + if ':' in host: + host, port = host.rsplit(':', 1) + + run(args[0], host=host, port=port, server=opt.server, + reloader=opt.reload, plugins=opt.plugin, debug=opt.debug) + + + + +# THE END +
+ + +
+
+
+
+
+ + + + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/_modules/index.html b/html/_modules/index.html new file mode 100644 index 0000000..d4fd43b --- /dev/null +++ b/html/_modules/index.html @@ -0,0 +1,157 @@ + + + + + + + + + + Overview: module code — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +

All modules for which code is available

+ + + +
+
+
+
+
+ + + + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/_sources/api.txt b/html/_sources/api.txt new file mode 100644 index 0000000..aeb4ff0 --- /dev/null +++ b/html/_sources/api.txt @@ -0,0 +1,193 @@ +============================== +API Reference +============================== + +.. module:: bottle + :platform: Unix, Windows + :synopsis: WSGI micro framework +.. moduleauthor:: Marcel Hellkamp + +This is a mostly auto-generated API. If you are new to bottle, you might find the +narrative :doc:`tutorial` more helpful. + + + + +Module Contents +===================================== + +The module defines several functions, constants, and an exception. + +.. autofunction:: debug + +.. autofunction:: run + +.. autofunction:: load + +.. autofunction:: load_app + +.. autodata:: request + +.. autodata:: response + +.. autodata:: HTTP_CODES + +.. function:: app() + default_app() + + Return the current :ref:`default-app`. Actually, these are callable instances of :class:`AppStack` and implement a stack-like API. + + +Routing +------------------- + +Bottle maintains a stack of :class:`Bottle` instances (see :func:`app` and :class:`AppStack`) and uses the top of the stack as a *default application* for some of the module-level functions and decorators. + + +.. function:: route(path, method='GET', callback=None, **options) + get(...) + post(...) + put(...) + delete(...) + + Decorator to install a route to the current default application. See :meth:`Bottle.route` for details. + + +.. function:: error(...) + + Decorator to install an error handler to the current default application. See :meth:`Bottle.error` for details. + + +WSGI and HTTP Utilities +---------------------------- + +.. autofunction:: parse_date + +.. autofunction:: parse_auth + +.. autofunction:: cookie_encode + +.. autofunction:: cookie_decode + +.. autofunction:: cookie_is_encoded + +.. autofunction:: yieldroutes + +.. autofunction:: path_shift + + +Data Structures +---------------------- + +.. autoclass:: MultiDict + :members: + +.. autoclass:: HeaderDict + :members: + +.. autoclass:: FormsDict + :members: + +.. autoclass:: WSGIHeaderDict + :members: + +.. autoclass:: AppStack + :members: + + .. method:: pop() + + Return the current default application and remove it from the stack. + +.. autoclass:: ResourceManager + :members: + +Exceptions +--------------- + +.. autoexception:: BottleException + :members: + + + +The :class:`Bottle` Class +========================= + +.. autoclass:: Bottle + :members: + +.. autoclass:: Route + :members: + + +The :class:`Request` Object +=================================================== + +The :class:`Request` class wraps a WSGI environment and provides helpful methods to parse and access form data, cookies, file uploads and other metadata. Most of the attributes are read-only. + +.. autoclass:: Request + :members: + +.. autoclass:: BaseRequest + :members: + +The module-level :data:`bottle.request` is a proxy object (implemented in :class:`LocalRequest`) and always refers to the `current` request, or in other words, the request that is currently processed by the request handler in the current thread. This `thread locality` ensures that you can safely use a global instance in a multi-threaded environment. + +.. autoclass:: LocalRequest + :members: + + +The :class:`Response` Object +=================================================== + +The :class:`Response` class stores the HTTP status code as well as headers and cookies that are to be sent to the client. Similar to :data:`bottle.request` there is a thread-local :data:`bottle.response` instance that can be used to adjust the `current` response. Moreover, you can instantiate :class:`Response` and return it from your request handler. In this case, the custom instance overrules the headers and cookies defined in the global one. + +.. autoclass:: Response + :members: + +.. autoclass:: BaseResponse + :members: + +.. autoclass:: LocalResponse + :members: + + +The following two classes can be raised as an exception. The most noticeable difference is that bottle invokes error handlers for :class:`HTTPError`, but not for :class:`HTTPResponse` or other response types. + +.. autoexception:: HTTPResponse + :members: + +.. autoexception:: HTTPError + :members: + + + + +Templates +========= + +All template engines supported by :mod:`bottle` implement the :class:`BaseTemplate` API. This way it is possible to switch and mix template engines without changing the application code at all. + +.. autoclass:: BaseTemplate + :members: + + .. automethod:: __init__ + +.. autofunction:: view + +.. autofunction:: template + +You can write your own adapter for your favourite template engine or use one of the predefined adapters. Currently there are four fully supported template engines: + +======================== =============================== ==================== ======================== +Class URL Decorator Render function +======================== =============================== ==================== ======================== +:class:`SimpleTemplate` :doc:`stpl` :func:`view` :func:`template` +:class:`MakoTemplate` http://www.makotemplates.org :func:`mako_view` :func:`mako_template` +:class:`CheetahTemplate` http://www.cheetahtemplate.org/ :func:`cheetah_view` :func:`cheetah_template` +:class:`Jinja2Template` http://jinja.pocoo.org/ :func:`jinja2_view` :func:`jinja2_template` +======================== =============================== ==================== ======================== + +To use :class:`MakoTemplate` as your default template engine, just import its specialised decorator and render function:: + + from bottle import mako_view as view, mako_template as template + diff --git a/html/_sources/async.txt b/html/_sources/async.txt new file mode 100644 index 0000000..c6c39e9 --- /dev/null +++ b/html/_sources/async.txt @@ -0,0 +1,127 @@ +Primer to Asynchronous Applications +=================================== + +Asynchronous design patterns don't mix well with the synchronous nature of `WSGI `_. This is why most asynchronous frameworks (tornado, twisted, ...) implement a specialized API to expose their asynchronous features. Bottle is a WSGI framework and shares the synchronous nature of WSGI, but thanks to the awesome `gevent project `_, it is still possible to write asynchronous applications with bottle. This article documents the usage of Bottle with Asynchronous WSGI. + +The Limits of Synchronous WSGI +------------------------------- + +Briefly worded, the `WSGI specification (pep 3333) `_ defines a request/response circle as follows: The application callable is invoked once for each request and must return a body iterator. The server then iterates over the body and writes each chunk to the socket. As soon as the body iterator is exhausted, the client connection is closed. + +Simple enough, but there is a snag: All this happens synchronously. If your application needs to wait for data (IO, sockets, databases, ...), it must either yield empty strings (busy wait) or block the current thread. Both solutions occupy the handling thread and prevent it from answering new requests. There is consequently only one ongoing request per thread. + +Most servers limit the number of threads to avoid their relatively high overhead. Pools of 20 or less threads are common. As soon as all threads are occupied, any new connection is stalled. The server is effectively dead for everyone else. If you want to implement a chat that uses long-polling ajax requests to get real-time updates, you'd reach the limited at 20 concurrent connections. That's a pretty small chat. + +Greenlets to the rescue +------------------------ + +Most servers limit the size of their worker pools to a relatively low number of concurrent threads, due to the high overhead involved in switching between and creating new threads. While threads are cheap compared to processes (forks), they are still expensive to create for each new connection. + +The `gevent `_ module adds *greenlets* to the mix. Greenlets behave similar to traditional threads, but are very cheap to create. A gevent-based server can spawn thousands of greenlets (one for each connection) with almost no overhead. Blocking individual greenlets has no impact on the servers ability to accept new requests. The number of concurrent connections is virtually unlimited. + +This makes creating asynchronous applications incredibly easy, because they look and feel like synchronous applications. A gevent-based server is actually not asynchronous, but massively multi-threaded. Here is an example:: + + from gevent import monkey; monkey.patch_all() + + from time import sleep + from bottle import route, run + + @route('/stream') + def stream(): + yield 'START' + sleep(3) + yield 'MIDDLE' + sleep(5) + yield 'END' + + run(host='0.0.0.0', port=8080, server='gevent') + +The first line is important. It causes gevent to monkey-patch most of Python's blocking APIs to not block the current thread, but pass the CPU to the next greenlet instead. It actually replaces Python's threading with gevent-based pseudo-threads. This is why you can still use ``time.sleep()`` which would normally block the whole thread. If you don't feel comfortable with monkey-patching python built-ins, you can use the corresponding gevent functions (``gevent.sleep()`` in this case). + +If you run this script and point your browser to ``http://localhost:8080/stream``, you should see `START`, `MIDDLE`, and `END` show up one by one (rather than waiting 8 seconds to see them all at once). It works exactly as with normal threads, but now your server can handle thousands of concurrent requests without any problems. + +.. note:: + + Some browsers buffer a certain amount of data before they start rendering a + page. You might need to yield more than a few bytes to see an effect in + these browsers. Additionally, many browsers have a limit of one concurrent + connection per URL. If this is the case, you can use a second browser or a + benchmark tool (e.g. `ab` or `httperf`) to measure performance. + +Event Callbacks +--------------- + +A very common design pattern in asynchronous frameworks (including tornado, twisted, node.js and friends) is to use non-blocking APIs and bind callbacks to asynchronous events. The socket object is kept open until it is closed explicitly to allow callbacks to write to the socket at a later point. Here is an example based on the `tornado library `_:: + + class MainHandler(tornado.web.RequestHandler): + @tornado.web.asynchronous + def get(self): + worker = SomeAsyncWorker() + worker.on_data(lambda chunk: self.write(chunk)) + worker.on_finish(lambda: self.finish()) + +The main benefit is that the request handler terminates early. The handling thread can move on and accept new requests while the callbacks continue to write to sockets of previous requests. This is how these frameworks manage to process a lot of concurrent requests with only a small number of OS threads. + +With Gevent+WSGI, things are different: First, terminating early has no benefit because we have an unlimited pool of (pseudo)threads to accept new connections. Second, we cannot terminate early because that would close the socket (as required by WSGI). Third, we must return an iterable to conform to WSGI. + +In order to conform to the WSGI standard, all we have to do is to return a body iterable that we can write to asynchronously. With the help of `gevent.queue `_, we can *simulate* a detached socket and rewrite the previous example as follows:: + + @route('/fetch') + def fetch(): + body = gevent.queue.Queue() + worker = SomeAsyncWorker() + worker.on_data(lambda chunk: body.put(chunk)) + worker.on_finish(lambda: body.put(StopIteration)) + return body + +From the server perspective, the queue object is iterable. It blocks if empty and stops as soon as it reaches ``StopIteration``. This conforms to WSGI. On the application side, the queue object behaves like a non-blocking socket. You can write to it at any time, pass it around and even start a new (pseudo)thread that writes to it asynchronously. This is how long-polling is implemented most of the time. + + +Finally: WebSockets +------------------- + +Lets forget about the low-level details for a while and speak about WebSockets. Since you are reading this article, you probably know what WebSockets are: A bidirectional communication channel between a browser (client) and a web application (server). + +Thankfully the `gevent-websocket `_ package does all the hard work for us. Here is a simple WebSocket endpoint that receives messages and just sends them back to the client:: + + from bottle import request, Bottle, abort + app = Bottle() + + @app.route('/websocket') + def handle_websocket(): + wsock = request.environ.get('wsgi.websocket') + if not wsock: + abort(400, 'Expected WebSocket request.') + + while True: + try: + message = wsock.receive() + wsock.send("Your message was: %r" % message) + except WebSocketError: + break + + from gevent.pywsgi import WSGIServer + from geventwebsocket import WebSocketHandler, WebSocketError + server = WSGIServer(("0.0.0.0", 8080), app, + handler_class=WebSocketHandler) + server.serve_forever() + +The while-loop runs until the client closes the connection. You get the idea :) + +The client-site JavaScript API is really straight forward, too:: + + + + + + + + diff --git a/html/_sources/changelog.txt b/html/_sources/changelog.txt new file mode 100644 index 0000000..44a37f4 --- /dev/null +++ b/html/_sources/changelog.txt @@ -0,0 +1,141 @@ +.. highlight:: python +.. currentmodule:: bottle + +=========================== +Release Notes and Changelog +=========================== + +Release 0.11 +============== + +.. warning: Not released yet. + +* Native support for Python 2.x and 3.x syntax. No need to run 2to3 anymore. +* Support for partial downloads (``Range`` header) in :func:`static_file`. +* The new :class:`ResourceManager` interface helps locating files bundled with an application. +* Added a server adapter for `waitress `_. +* New :meth:`Bottle.merge` method to install all routes from one application into another. +* New :attr:`BaseRequest.app` property to get the application object that handles a request. +* Added :meth:`FormsDict.decode()` to get an all-unicode version (needed by WTForms). +* :class:`MultiDict` and subclasses are now pickle-able. + +.. rubric:: API Changes + +* :attr:`Response.status` is a read-write property that can be assigned either a numeric status code or a status string with a reason phrase (``200 OK``). The return value is now a string to better match existing APIs (WebOb, werkzeug). To be absolutely clear, you can use the read-only properties :attr:`BaseResponse.status_code` and :attr:`BaseResponse.status_line`. + +.. rubric:: API Deprecations + +* :class:`SimpleTALTemplate` is now deprecating. There seems to be no demand. + +Release 0.10 +============== + +* Plugin API v2 + + * To use the new API, set :attr:`Plugin.api` to ``2``. + * :meth:`Plugin.apply` receives a :class:`Route` object instead of a context dictionary as second parameter. The new object offers some additional information and may be extended in the future. + * Plugin names are considered unique now. The topmost plugin with a given name on a given route is installed, all other plugins with the same name are silently ignored. + +* The Request/Response Objects + + * Added :attr:`BaseRequest.json`, :attr:`BaseRequest.remote_route`, :attr:`BaseRequest.remote_addr`, :attr:`BaseRequest.query` and :attr:`BaseRequest.script_name`. + * Added :attr:`BaseResponse.status_line` and :attr:`BaseResponse.status_code` attributes. In future releases, :attr:`BaseResponse.status` will return a string (e.g. ``200 OK``) instead of an integer to match the API of other common frameworks. To make the transition as smooth as possible, you should use the verbose attributes from now on. + * Replaced :class:`MultiDict` with a specialized :class:`FormsDict` in many places. The new dict implementation allows attribute access and handles unicode form values transparently. + +* Templates + + * Added three new functions to the SimpleTemplate default namespace that handle undefined variables: :func:`stpl.defined`, :func:`stpl.get` and :func:`stpl.setdefault`. + * The default escape function for SimpleTemplate now additionally escapes single and double quotes. + +* Routing + + * A new route syntax (e.g. ``/object/``) and support for route wildcard filters. + * Four new wildcard filters: `int`, `float`, `path` and `re`. + +* Oher changes + + * Added command line interface to load applications and start servers. + * Introduced a :class:`ConfigDict` that makes accessing configuration a lot easier (attribute access and auto-expanding namespaces). + * Added support for raw WSGI applications to :meth:`Bottle.mount`. + * :meth:`Bottle.mount` parameter order changed. + * :meth:`Bottle.route` now accpets an import string for the ``callback`` parameter. + * Dropped Gunicorn 0.8 support. Current supported version is 0.13. + * Added custom options to Gunicorn server. + * Finally dropped support for type filters. Replace with a custom plugin of needed. + + +Release 0.9 +============ + +.. rubric:: Whats new? + +* A brand new plugin-API. See :ref:`plugins` and :doc:`plugindev` for details. +* The :func:`route` decorator got a lot of new features. See :meth:`Bottle.route` for details. +* New server adapters for `gevent `_, `meinheld `_ and `bjoern `_. +* Support for SimpleTAL templates. +* Better runtime exception handling for mako templates in debug mode. +* Lots of documentation, fixes and small improvements. +* A new :data:`Request.urlparts` property. + +.. rubric:: Performance improvements + +* The :class:`Router` now special-cases ``wsgi.run_once`` environments to speed up CGI. +* Reduced module load time by ~30% and optimized template parser. See `8ccb2d `_, `f72a7c `_ and `b14b9a `_ for details. +* Support for "App Caching" on Google App Engine. See `af93ec `_. +* Some of the rarely used or deprecated features are now plugins that avoid overhead if the feature is not used. + +.. rubric:: API changes + +This release is mostly backward compatible, but some APIs are marked deprecated now and will be removed for the next release. Most noteworthy: + +* The ``static`` route parameter is deprecated. You can escape wild-cards with a backslash. +* Type-based output filters are deprecated. They can easily be replaced with plugins. + + +Release 0.8 +============ + +.. rubric:: API changes + +These changes may break compatibility with previous versions. + +* The built-in Key/Value database is not available anymore. It is marked deprecated since 0.6.4 +* The Route syntax and behaviour changed. + + * Regular expressions must be encapsulated with ``#``. In 0.6 all non-alphanumeric characters not present in the regular expression were allowed. + * Regular expressions not part of a route wildcard are escaped automatically. You don't have to escape dots or other regular control characters anymore. In 0.6 the whole URL was interpreted as a regular expression. You can use anonymous wildcards (``/index:#(\.html)?#``) to achieve a similar behaviour. + +* The ``BreakTheBottle`` exception is gone. Use :class:`HTTPResponse` instead. +* The :class:`SimpleTemplate` engine escapes HTML special characters in ``{{bad_html}}`` expressions automatically. Use the new ``{{!good_html}}`` syntax to get old behaviour (no escaping). +* The :class:`SimpleTemplate` engine returns unicode strings instead of lists of byte strings. +* ``bottle.optimize()`` and the automatic route optimization is obsolete. +* Some functions and attributes were renamed: + + * :attr:`Request._environ` is now :attr:`Request.environ` + * :attr:`Response.header` is now :attr:`Response.headers` + * :func:`default_app` is obsolete. Use :func:`app` instead. + +* The default :func:`redirect` code changed from 307 to 303. +* Removed support for ``@default``. Use ``@error(404)`` instead. + +.. rubric:: New features + + +This is an incomplete list of new features and improved functionality. + +* The :class:`Request` object got new properties: :attr:`Request.body`, :attr:`Request.auth`, :attr:`Request.url`, :attr:`Request.header`, :attr:`Request.forms`, :attr:`Request.files`. +* The :meth:`Response.set_cookie` and :meth:`Request.get_cookie` methods are now able to encode and decode python objects. This is called a *secure cookie* because the encoded values are signed and protected from changes on client side. All pickle-able data structures are allowed. +* The new :class:`Router` class drastically improves performance for setups with lots of dynamic routes and supports named routes (named route + dict = URL string). +* It is now possible (and recommended) to return :exc:`HTTPError` and :exc:`HTTPResponse` instances or other exception objects instead of raising them. +* The new function :func:`static_file` equals :func:`send_file` but returns a :exc:`HTTPResponse` or :exc:`HTTPError` instead of raising it. :func:`send_file` is deprecated. +* New :func:`get`, :func:`post`, :func:`put` and :func:`delete` decorators. +* The :class:`SimpleTemplate` engine got full unicode support. +* Lots of non-critical bugfixes. + + + +============ +Contributors +============ + +.. include:: ../AUTHORS diff --git a/html/_sources/contact.txt b/html/_sources/contact.txt new file mode 100644 index 0000000..7412484 --- /dev/null +++ b/html/_sources/contact.txt @@ -0,0 +1,30 @@ +============= +Contact +============= + +.. rubric:: About the Autor + +.. image:: _static/myface_small.png + :alt: Photo + :class: floatright + +Hi, I'm *Marcel Hellkamp* (aka *defnull*), author of Bottle and the guy behind this website. I'm 27 years old and studying computer science at the Georg-August-University in Göttingen, Germany. Python is my favorite language, but I also code in ruby and JavaScript a lot. Watch me on `twitter `_ or visit my profile at `GitHub `_ to get in contact. A `mailinglist `_ is open for Bottle related questions, too. + +.. rubric:: About Bottle + +This is my first open source project so far. It started and a small experiment but soon got so much positive feedback I decided to make something real out of it. Here it is. + +.. rubric:: Impressum und Kontaktdaten + +(This is required by `German law `_) + +Die Nutzung der folgenden Kontaktdaten ist ausschließlich für die +Kontaktaufnahme mit dem Betreiber dieser Webseite bei rechtlichen +Problemen vorgesehen. Insbesondere die Nutzung zu Werbe- oder ähnlichen +Zwecken ist ausdrücklich untersagt. + + * **Betreiber**: Marcel Hellkamp + * **Ort**: D - 37075 Göttingen + * **Strasse**: Theodor-Heuss Strasse 13 + * **Telefon**: +49 (0) 551 20005915 + * **E-Mail**: marc at gsites dot de diff --git a/html/_sources/deployment.txt b/html/_sources/deployment.txt new file mode 100644 index 0000000..7371ac2 --- /dev/null +++ b/html/_sources/deployment.txt @@ -0,0 +1,205 @@ +.. _flup: http://trac.saddi.com/flup +.. _gae: http://code.google.com/appengine/docs/python/overview.html +.. _wsgiref: http://docs.python.org/library/wsgiref.html +.. _cherrypy: http://www.cherrypy.org/ +.. _paste: http://pythonpaste.org/ +.. _rocket: http://pypi.python.org/pypi/rocket +.. _gunicorn: http://pypi.python.org/pypi/gunicorn +.. _fapws3: http://www.fapws.org/ +.. _tornado: http://www.tornadoweb.org/ +.. _twisted: http://twistedmatrix.com/ +.. _diesel: http://dieselweb.org/ +.. _meinheld: http://pypi.python.org/pypi/meinheld +.. _bjoern: http://pypi.python.org/pypi/bjoern +.. _gevent: http://www.gevent.org/ +.. _eventlet: http://eventlet.net/ +.. _waitress: http://readthedocs.org/docs/waitress/en/latest/ +.. _apache: http://httpd.apache.org/ +.. _mod_wsgi: http://code.google.com/p/modwsgi/ +.. _pound: http://www.apsis.ch/pound + + + +.. _tutorial-deployment: + +================================================================================ +Deployment +================================================================================ + +The bottle :func:`run` function, when called without any parameters, starts a local development server on port 8080. You can access and test your application via http://localhost:8080/ if you are on the same host. + +To get your application available to the outside world, specify the IP of the interface the server should listen to (e.g. ``run(host='192.168.0.1')``) or let the server listen to all interfaces at once (e.g. ``run(host='0.0.0.0')``). The listening port can be changed in a similar way, but you need root or admin rights to choose a port below 1024. Port 80 is the standard for HTTP servers:: + + run(host='0.0.0.0', port=80) # Listen to HTTP requests on all interfaces + +Server Options +================================================================================ + +The built-in default server is based on `wsgiref WSGIServer `_. This non-threading HTTP server is perfectly fine for development and early production, but may become a performance bottleneck when server load increases. There are three ways to eliminate this bottleneck: + +* Use a different server that is either multi-threaded or asynchronous. +* Start multiple server processes and spread the load with a load-balancer. +* Do both. + +**Multi-threaded** servers are the 'classic' way to do it. They are very robust, reasonably fast and easy to manage. As a drawback, they can only handle a limited number of connections at the same time and utilize only one CPU core due to the "Global Interpreter Lock" (GIL). This does not hurt most applications, they are waiting for network IO most of the time anyway, but may slow down CPU intensive tasks (e.g. image processing). + +**Asynchronous** servers are very fast, can handle a virtually unlimited number of concurrent connections and are easy to manage, but can get a bit tricky. To take full advantage of their potential, you need to design your application accordingly and understand the concepts of the specific server. + +**Multi-processing** (forking) servers are not limited by the GIL and utilize more than one CPU core, but make communication between server instances more expensive. You need a database or external message query to share state between processes, or design your application so that it does not need any shared state. The setup is also a bit more complicated, but there are good tutorials available. + +Switching the Server Backend +================================================================================ + +The easiest way to increase performance is to install a multi-threaded server library like paste_ or cherrypy_ and tell Bottle to use that instead of the single-threaded server:: + + bottle.run(server='paste') + +Bottle ships with a lot of ready-to-use adapters for the most common WSGI servers and automates the setup process. Here is an incomplete list: + +======== ============ ====================================================== +Name Homepage Description +======== ============ ====================================================== +cgi Run as CGI script +flup flup_ Run as FastCGI process +gae gae_ Helper for Google App Engine deployments +wsgiref wsgiref_ Single-threaded default server +cherrypy cherrypy_ Multi-threaded and very stable +paste paste_ Multi-threaded, stable, tried and tested +rocket rocket_ Multi-threaded +waitress waitress_ Multi-threaded, poweres Pyramid +gunicorn gunicorn_ Pre-forked, partly written in C +eventlet eventlet_ Asynchronous framework with WSGI support. +gevent gevent_ Asynchronous (greenlets) +diesel diesel_ Asynchronous (greenlets) +fapws3 fapws3_ Asynchronous (network side only), written in C +tornado tornado_ Asynchronous, powers some parts of Facebook +twisted twisted_ Asynchronous, well tested but... twisted +meinheld meinheld_ Asynchronous, partly written in C +bjoern bjoern_ Asynchronous, very fast and written in C +auto Automatically selects an available server adapter +======== ============ ====================================================== + +The full list is available through :data:`server_names`. + +If there is no adapter for your favorite server or if you need more control over the server setup, you may want to start the server manually. Refer to the server documentation on how to run WSGI applications. Here is an example for paste_:: + + application = bottle.default_app() + from paste import httpserver + httpserver.serve(application, host='0.0.0.0', port=80) + + + +Apache mod_wsgi +-------------------------------------------------------------------------------- + +Instead of running your own HTTP server from within Bottle, you can attach Bottle applications to an `Apache server `_ using mod_wsgi_. + +All you need is an ``app.wsgi`` file that provides an ``application`` object. This object is used by mod_wsgi to start your application and should be a WSGI-compatible Python callable. + +File ``/var/www/yourapp/app.wsgi``:: + + # Change working directory so relative paths (and template lookup) work again + os.chdir(os.path.dirname(__file__)) + + import bottle + # ... build or import your bottle application here ... + # Do NOT use bottle.run() with mod_wsgi + application = bottle.default_app() + +The Apache configuration may look like this:: + + + ServerName example.com + + WSGIDaemonProcess yourapp user=www-data group=www-data processes=1 threads=5 + WSGIScriptAlias / /var/www/yourapp/app.wsgi + + + WSGIProcessGroup yourapp + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + + + + +Google AppEngine +-------------------------------------------------------------------------------- + +.. versionadded:: 0.9 + +The ``gae`` server adapter is used to run applications on Google App Engine. It works similar to the ``cgi`` adapter in that it does not start a new HTTP server, but prepares and optimizes your application for Google App Engine and makes sure it conforms to their API:: + + bottle.run(server='gae') # No need for a host or port setting. + +It is always a good idea to let GAE serve static files directly. Here is example for a working ``app.yaml``:: + + application: myapp + version: 1 + runtime: python + api_version: 1 + + handlers: + - url: /static + static_dir: static + + - url: /.* + script: myapp.py + + +Load Balancer (Manual Setup) +-------------------------------------------------------------------------------- + +A single Python process can utilize only one CPU at a time, even if there are more CPU cores available. The trick is to balance the load between multiple independent Python processes to utilize all of your CPU cores. + +Instead of a single Bottle application server, you start one instance for each CPU core available using different local port (localhost:8080, 8081, 8082, ...). You can choose any server adapter you want, even asynchronous ones. Then a high performance load balancer acts as a reverse proxy and forwards each new requests to a random port, spreading the load between all available back-ends. This way you can use all of your CPU cores and even spread out the load between different physical servers. + +One of the fastest load balancers available is Pound_ but most common web servers have a proxy-module that can do the work just fine. + +Pound example:: + + ListenHTTP + Address 0.0.0.0 + Port 80 + + Service + BackEnd + Address 127.0.0.1 + Port 8080 + End + BackEnd + Address 127.0.0.1 + Port 8081 + End + End + End + +Apache example:: + + + BalancerMember http://192.168.1.50:80 + BalancerMember http://192.168.1.51:80 + + ProxyPass / balancer://mycluster + +Lighttpd example:: + + server.modules += ( "mod_proxy" ) + proxy.server = ( + "" => ( + "wsgi1" => ( "host" => "127.0.0.1", "port" => 8080 ), + "wsgi2" => ( "host" => "127.0.0.1", "port" => 8081 ) + ) + ) + + +Good old CGI +================================================================================ + +A CGI server starts a new process for each request. This adds a lot of overhead but is sometimes the only option, especially on cheap hosting packages. The `cgi` server adapter does not actually start a CGI server, but transforms your bottle application into a valid CGI application:: + + bottle.run(server='cgi') + + + diff --git a/html/_sources/development.txt b/html/_sources/development.txt new file mode 100644 index 0000000..91a72fa --- /dev/null +++ b/html/_sources/development.txt @@ -0,0 +1,181 @@ +Developer Notes +================= + +This document is intended for developers and package maintainers interested in the bottle development and release workflow. If you want to contribute, you are just right! + + +Get involved +------------ + +There are several ways to join the community and stay up to date. Here are some of them: + +* **Mailing list**: Join our mailing list by sending an email to `bottlepy+subscribe@googlegroups.com `_ (no google account required). +* **Twitter**: `Follow us on Twitter `_ or search for the `#bottlepy `_ tag. +* **IRC**: Join `#bottlepy on irc.freenode.net `_ or use the `web chat interface `_. +* **Google plus**: We sometimes `blog about Bottle, releases and technical stuff `_ on our Google+ page. + + +Get the Sources +--------------- + +The bottle `development repository `_ and the `issue tracker `_ are both hosted at `github `_. If you plan to contribute, it is a good idea to create an account there and fork the main repository. This way your changes and ideas are visible to other developers and can be discussed openly. Even without an account, you can clone the repository or just download the latest development version as a source archive. + +* **git:** ``git clone git://github.com/defnull/bottle.git`` +* **git/https:** ``git clone https://github.com/defnull/bottle.git`` +* **Download:** Development branch as `tar archive `_ or `zip file `_. + + +Releases and Updates +-------------------- + +Bottle is released at irregular intervals and distributed through `PyPi `_. Release candidates and bugfix-revisions of outdated releases are only available from the git repository mentioned above. Some Linux distributions may offer packages for outdated releases, though. + +The Bottle version number splits into three parts (**major.minor.revision**). These are *not* used to promote new features but to indicate important bug-fixes and/or API changes. Critical bugs are fixed in at least the two latest minor releases and announced in all available channels (mailinglist, twitter, github). Non-critical bugs or features are not guaranteed to be backported. This may change in the future, through. + +Major Release (x.0) + The major release number is increased on important milestones or updates that completely break backward compatibility. You probably have to work over your entire application to use a new release. These releases are very rare, through. + +Minor Release (x.y) + The minor release number is increased on updates that change the API or behaviour in some way. You might get some depreciation warnings any may have to tweak some configuration settings to restore the old behaviour, but in most cases these changes are designed to be backward compatible for at least one minor release. You should update to stay up do date, but don't have to. An exception is 0.8, which *will* break backward compatibility hard. (This is why 0.7 was skipped). Sorry about that. + +Revision (x.y.z) + The revision number is increased on bug-fixes and other patches that do not change the API or behaviour. You can safely update without editing your application code. In fact, you really should as soon as possible, because important security fixes are released this way. + +Pre-Release Versions + Release candidates are marked by an ``rc`` in their revision number. These are API stable most of the time and open for testing, but not officially released yet. You should not use these for production. + + +Repository Structure +-------------------- + +The source repository is structured as follows: + +``master`` branch + This is the integration, testing and development branch. All changes that are planned to be part of the next release are merged and tested here. + +``release-x.y`` branches + As soon as the master branch is (almost) ready for a new release, it is branched into a new release branch. This "release candidate" is feature-frozen but may receive bug-fixes and last-minute changes until it is considered production ready and officially released. From that point on it is called a "support branch" and still receives bug-fixes, but only important ones. The revision number is increased on each push to these branches, so you can keep up with important changes. + +``bugfix_name-x.y`` branches + These branches are only temporary and used to develop and share non-trivial bug-fixes for existing releases. They are merged into the corresponding release branch and deleted soon after that. + +Feature branches + All other branches are feature branches. These are based on the master branch and only live as long as they are still active and not merged back into ``master``. + + +.. rubric:: What does this mean for a developer? + +If you want to add a feature, create a new branch from ``master``. If you want to fix a bug, branch ``release-x.y`` for each affected release. Please use a separate branch for each feature or bug to make integration as easy as possible. Thats all. There are git workflow examples at the bottom of this page. + +Oh, and never ever change the release number. We'll do that on integration. You never know in which order we pull pending requests anyway :) + + +.. rubric:: What does this mean for a maintainer ? + +Watch the tags (and the mailing list) for bug-fixes and new releases. If you want to fetch a specific release from the git repository, trust the tags, not the branches. A branch may contain changes that are not released yet, but a tag marks the exact commit which changed the version number. + + +Submitting Patches +------------------ + +The best way to get your changes integrated into the main development branch is to fork the main repository at github, create a new feature-branch, apply your changes and send a pull-request. Further down this page is a small collection of git workflow examples that may guide you. Submitting git-compatible patches to the mailing list is fine too. In any case, please follow some basic rules: + +* **Documentation:** Tell us what your patch does. Comment your code. If you introduced a new feature, add to the documentation so others can learn about it. +* **Test:** Write tests to prove that your code works as expected and does not break anything. If you fixed a bug, write at least one test-case that triggers the bug. Make sure that all tests pass before you submit a patch. +* **One patch at a time:** Only fix one bug or add one feature at a time. Design your patches so that they can be applyed as a whole. Keep your patches clean, small and focused. +* **Sync with upstream:** If the ``upstream/master`` branch changed while you were working on your patch, rebase or pull to make sure that your patch still applies without conflicts. + + +Building the Documentation +-------------------------- + +You need a recent version of Sphinx to build the documentation. The recommended way is to install :command:`virtualenv` using your distribution package repository and install sphinx manually to get an up-to-date version. + +.. code-block:: bash + + # Install prerequisites + which virtualenv || sudo apt-get install python-virtualenv + virtualenv --no-site-dependencies venv + ./venv/pip install -U sphinx + + # Clone or download bottle from github + git clone https://github.com/defnull/bottle.git + + # Activate build environment + source ./venv/bin/activate + + # Build HTML docs + cd bottle/docs + make html + + # Optional: Install prerequisites for PDF generation + sudo apt-get install texlive-latex-extra \ + texlive-latex-recommended \ + texlive-fonts-recommended + + # Optional: Build the documentation as PDF + make latex + cd ../build/docs/latex + make pdf + + +GIT Workflow Examples +--------------------- + +The following examples assume that you have an (free) `github account `_. This is not mandatory, but makes things a lot easier. + +First of all you need to create a fork (a personal clone) of the official repository. To do this, you simply click the "fork" button on the `bottle project page `_. When the fork is done, you will be presented with a short introduction to your new repository. + +The fork you just created is hosted at github and read-able by everyone, but write-able only by you. Now you need to clone the fork locally to actually make changes to it. Make sure you use the private (read-write) URL and *not* the public (read-only) one:: + + git clone git@github.com:your_github_account/bottle.git + +Once the clone is complete your repository will have a remote named "origin" that points to your fork on github. Don’t let the name confuse you, this does not point to the original bottle repository, but to your own fork. To keep track of the official repository, add another remote named "upstream":: + + cd bottle + git remote add upstream git://github.com/defnull/bottle.git + git fetch upstream + +Note that "upstream" is a public clone URL, which is read-only. You cannot push changes directly to it. Instead, we will pull from your public repository. This is described later. + +.. rubric:: Submit a Feature + +New features are developed in separate feature-branches to make integration easy. Because they are going to be integrated into the ``master`` branch, they must be based on ``upstream/master``. To create a new feature-branch, type the following:: + + git checkout -b cool_feature upstream/master + +Now implement your feature, write tests, update the documentation, make sure that all tests pass and commit your changes:: + + git commit -a -m "Cool Feature" + +If the ``upstream/master`` branch changed in the meantime, there may be conflicts with your changes. To solve these, 'rebase' your feature-branch onto the top of the updated ``upstream/master`` branch:: + + git fetch upstream + git rebase upstream + +This is equivalent to undoing all your changes, updating your branch to the latest version and reapplying all your patches again. If you released your branch already (see next step), this is not an option because it rewrites your history. You can do a normal pull instead. Resolve any conflicts, run the tests again and commit. + +Now you are almost ready to send a pull request. But first you need to make your feature-branch public by pushing it to your github fork:: + + git push origin cool_feature + +After you’ve pushed your commit(s) you need to inform us about the new feature. One way is to send a pull-request using github. Another way would be to start a thread in the mailing-list, which is recommended. It allows other developers to see and discuss your patches and you get some feedback for free :) + +If we accept your patch, we will integrate it into the official development branch and make it part of the next release. + +.. rubric:: Fix a Bug + +The workflow for bug-fixes is very similar to the one for features, but there are some differences: + +1) Branch off of the affected release branches instead of just the development branch. +2) Write at least one test-case that triggers the bug. +3) Do this for each affected branch including ``upstream/master`` if it is affected. ``git cherry-pick`` may help you reducing repetitive work. +4) Name your branch after the release it is based on to avoid confusion. Examples: ``my_bugfix-x.y`` or ``my_bugfix-dev``. + + + + + + + + diff --git a/html/_sources/faq.txt b/html/_sources/faq.txt new file mode 100644 index 0000000..4a025d9 --- /dev/null +++ b/html/_sources/faq.txt @@ -0,0 +1,62 @@ +.. module:: bottle + +.. _paste: http://pythonpaste.org/modules/evalexception.html +.. _pylons: http://pylonshq.com/ +.. _mod_python: http://www.modpython.org/ +.. _mod_wsgi: http://code.google.com/p/modwsgi/ + +========================== +Frequently Asked Questions +========================== + +About Bottle +============ + +Is bottle suitable for complex applications? +--------------------------------------------- + +Bottle is a *micro* framework designed for prototyping and building small web applications and services. It stays out of your way and allows you to get things done fast, but misses some advanced features and ready-to-use solutions found in other frameworks (MVC, ORM, form validation, scaffolding, XML-RPC). Although it *is* possible to add these features and build complex applications with Bottle, you should consider using a full-stack Web framework like pylons_ or paste_ instead. + + +Common Problems and Pitfalls +============================ + + + + + +"Template Not Found" in mod_wsgi/mod_python +-------------------------------------------------------------------------------- + +Bottle searches in ``./`` and ``./views/`` for templates. In a mod_python_ or mod_wsgi_ environment, the working directory (``./``) depends on your Apache settings. You should add an absolute path to the template search path:: + + bottle.TEMPLATE_PATH.insert(0,'/absolut/path/to/templates/') + +so bottle searches the right paths. + +Dynamic Routes and Slashes +-------------------------------------------------------------------------------- + +In :ref:`dynamic route syntax `, a placeholder token (``:name``) matches everything up to the next slash. This equals to ``[^/]+`` in regular expression syntax. To accept slashes too, you have to add a custom regular pattern to the placeholder. An example: ``/images/:filepath#.*#`` would match ``/images/icons/error.png`` but ``/images/:filename`` won't. + +Problems with reverse proxies +-------------------------------------------------------------------------------- + +Redirects and url-building only works if bottle knows the public address and location of your application. If you run bottle locally behind a reverse proxy or load balancer, some information might get lost along the way. For example, the ``wsgi.url_scheme`` value or the ``Host`` header might reflect the local request by your proxy, not the real request by the client. Here is a small WSGI middleware snippet that helps to fix these values:: + + def fix_environ_middleware(app): + def fixed_app(environ, start_response): + environ['wsgi.url_scheme'] = 'https' + environ['HTTP_X_FORWARDED_HOST'] = 'example.com' + return app(environ, start_response) + return https_app + + app = bottle.default_app() + app.wsgi = fix_environ_middleware(app.wsgi) + + + + + + + diff --git a/html/_sources/index.txt b/html/_sources/index.txt new file mode 100644 index 0000000..1bb081b --- /dev/null +++ b/html/_sources/index.txt @@ -0,0 +1,112 @@ +.. highlight:: python +.. currentmodule:: bottle + +.. _mako: http://www.makotemplates.org/ +.. _cheetah: http://www.cheetahtemplate.org/ +.. _jinja2: http://jinja.pocoo.org/2/ +.. _paste: http://pythonpaste.org/ +.. _fapws3: https://github.com/william-os4y/fapws3 +.. _bjoern: https://github.com/jonashaag/bjoern +.. _flup: http://trac.saddi.com/flup +.. _cherrypy: http://www.cherrypy.org/ +.. _WSGI: http://www.wsgi.org/wsgi/ +.. _Python: http://python.org/ +.. _testing: https://github.com/defnull/bottle/raw/master/bottle.py +.. _issue_tracker: https://github.com/defnull/bottle/issues +.. _PyPi: http://pypi.python.org/pypi/bottle + +============================ +Bottle: Python Web Framework +============================ + +Bottle is a fast, simple and lightweight WSGI_ micro web-framework for Python_. It is distributed as a single file module and has no dependencies other than the `Python Standard Library `_. + + +* **Routing:** Requests to function-call mapping with support for clean and dynamic URLs. +* **Templates:** Fast and pythonic :ref:`built-in template engine ` and support for mako_, jinja2_ and cheetah_ templates. +* **Utilities:** Convenient access to form data, file uploads, cookies, headers and other HTTP-related metadata. +* **Server:** Built-in HTTP development server and support for paste_, fapws3_, bjoern_, `Google App Engine `_, cherrypy_ or any other WSGI_ capable HTTP server. + +.. rubric:: Example: "Hello World" in a bottle + +:: + + from bottle import route, run, template + + @route('/hello/:name') + def index(name='World'): + return template('Hello {{name}}!', name=name) + + run(host='localhost', port=8080) + +Run this script or paste it into a Python console, then point your browser to ``_. That's it. + +.. rubric:: Download and Install + +.. _download: + +.. __: https://github.com/defnull/bottle/raw/master/bottle.py + +Install the latest stable release via PyPi_ (``easy_install -U bottle``) or download `bottle.py`__ (unstable) into your project directory. There are no hard [1]_ dependencies other than the Python standard library. Bottle runs with **Python 2.5+ and 3.x**. + +User's Guide +=============== +Start here if you want to learn how to use the bottle framework for web development. If you have any questions not answered here, feel free to ask the `mailing list `_. + +.. toctree:: + :maxdepth: 2 + + tutorial + routing + stpl + api + plugins/index + + +Knowledge Base +============== +A collection of articles, guides and HOWTOs. + +.. toctree:: + :maxdepth: 2 + + tutorial_app + async + recipes + faq + + +Development and Contribution +============================ + +These chapters are intended for developers interested in the bottle development and release workflow. + +.. toctree:: + :maxdepth: 2 + + changelog + development + plugindev + + +.. toctree:: + :hidden: + + plugins/index + +License +================== + +Code and documentation are available according to the MIT License: + +.. include:: ../LICENSE + :literal: + +The Bottle logo however is *NOT* covered by that license. It is allowed to +use the logo as a link to the bottle homepage or in direct context with +the unmodified library. In all other cases please ask first. + +.. rubric:: Footnotes + +.. [1] Usage of the template or server adapter classes of course requires the corresponding template or server modules. + diff --git a/html/_sources/plugindev.txt b/html/_sources/plugindev.txt new file mode 100644 index 0000000..40da98c --- /dev/null +++ b/html/_sources/plugindev.txt @@ -0,0 +1,240 @@ +.. module:: bottle + + +======================== +Plugin Development Guide +======================== + +This guide explains the plugin API and how to write custom plugins. I suggest reading :ref:`plugins` first if you have not done that already. You might also want to have a look at the :doc:`/plugins/index` for some practical examples. + +.. note:: + + This is a draft. If you see any errors or find that a specific part is not explained clear enough, please tell the `mailing-list `_ or file a `bug report `_. + + +How Plugins Work: The Basics +============================ + +The plugin API builds on the concept of `decorators `_. To put it briefly, a plugin is a decorator applied to every single route callback of an application. + +Of course, this is just a simplification. Plugins can do a lot more than just decorating route callbacks, but it is a good starting point. Lets have a look at some code:: + + from bottle import response, install + import time + + def stopwatch(callback): + def wrapper(*args, **kwargs): + start = time.time() + body = callback(*args, **kwargs) + end = time.time() + response.headers['X-Exec-Time'] = str(end - start) + return body + return wrapper + + install(stopwatch) + +This plugin measures the execution time for each request and adds an appropriate ``X-Exec-Time`` header to the response. As you can see, the plugin returns a wrapper and the wrapper calls the original callback recursively. This is how decorators usually work. + +The last line tells Bottle to install the plugin to the default application. This causes the plugin to be automatically applied to all routes of that application. In other words, ``stopwatch()`` is called once for each route callback and the return value is used as a replacement for the original callback. + +Plugins are applied on demand, that is, as soon as a route is requested for the first time. For this to work properly in multi-threaded environments, the plugin should be thread-safe. This is not a problem most of the time, but keep it in mind. + +Once all plugins are applied to a route, the wrapped callback is cached and subsequent requests are handled by the cached version directly. This means that a plugin is usually applied only once to a specific route. That cache, however, is cleared every time the list of installed plugins changes. Your plugin should be able to decorate the same route more than once. + +The decorator API is quite limited, though. You don't know anything about the route being decorated or the associated application object and have no way to efficiently store data that is shared among all routes. But fear not! Plugins are not limited to just decorator functions. Bottle accepts anything as a plugin as long as it is callable or implements an extended API. This API is described below and gives you a lot of control over the whole process. + + +Plugin API +========== + +:class:`Plugin` is not a real class (you cannot import it from :mod:`bottle`) but an interface that plugins are expected to implement. Bottle accepts any object of any type as a plugin, as long as it conforms to the following API. + +.. class:: Plugin(object) + + Plugins must be callable or implement :meth:`apply`. If :meth:`apply` is defined, it is always preferred over calling the plugin directly. All other methods and attributes are optional. + + .. attribute:: name + + Both :meth:`Bottle.uninstall` and the `skip` parameter of :meth:`Bottle.route()` accept a name string to refer to a plugin or plugin type. This works only for plugins that have a name attribute. + + .. attribute:: api + + The Plugin API is still evolving. This integer attribute tells bottle which version to use. If it is missing, bottle defaults to the first version. The current version is ``2``. See :ref:`plugin-changelog` for details. + + .. method:: setup(self, app) + + Called as soon as the plugin is installed to an application (see :meth:`Bottle.install`). The only parameter is the associated application object. + + .. method:: __call__(self, callback) + + As long as :meth:`apply` is not defined, the plugin itself is used as a decorator and applied directly to each route callback. The only parameter is the callback to decorate. Whatever is returned by this method replaces the original callback. If there is no need to wrap or replace a given callback, just return the unmodified callback parameter. + + .. method:: apply(self, callback, route) + + If defined, this method is used in favor of :meth:`__call__` to decorate route callbacks. The additional `route` parameter is an instance of :class:`Route` and provides a lot of meta-information and context for that route. See :ref:`route-context` for details. + + .. method:: close(self) + + Called immediately before the plugin is uninstalled or the application is closed (see :meth:`Bottle.uninstall` or :meth:`Bottle.close`). + + +Both :meth:`Plugin.setup` and :meth:`Plugin.close` are *not* called for plugins that are applied directly to a route via the :meth:`Bottle.route()` decorator, but only for plugins installed to an application. + + +.. _plugin-changelog: + +Plugin API changes +------------------ + +The Plugin API is still evolving and changed with Bottle 0.10 to address certain issues with the route context dictionary. To ensure backwards compatibility with 0.9 Plugins, we added an optional :attr:`Plugin.api` attribute to tell bottle which API to use. The API differences are summarized here. + +* **Bottle 0.9 API 1** (:attr:`Plugin.api` not present) + + * Original Plugin API as described in the 0.9 docs. + +* **Bottle 0.10 API 2** (:attr:`Plugin.api` equals 2) + + * The `context` parameter of the :meth:`Plugin.apply` method is now an instance of :class:`Route` instead of a context dictionary. + +.. _route-context: + + +The Route Context +================= + +The :class:`Route` instance passed to :meth:`Plugin.apply` provides detailed informations about the associated route. The most important attributes are summarized here: + +=========== ================================================================= +Attribute Description +=========== ================================================================= +app The application object this route is installed to. +rule The rule string (e.g. ``/wiki/:page``). +method The HTTP method as a string (e.g. ``GET``). +callback The original callback with no plugins applied. Useful for + introspection. +name The name of the route (if specified) or ``None``. +plugins A list of route-specific plugins. These are applied in addition to + application-wide plugins. (see :meth:`Bottle.route`). +skiplist A list of plugins to not apply to this route (again, see + :meth:`Bottle.route`). +config Additional keyword arguments passed to the :meth:`Bottle.route` + decorator are stored in this dictionary. Used for route-specific + configuration and meta-data. +=========== ================================================================= + +For your plugin, :attr:`Route.config` is probably the most important attribute. Keep in mind that this dictionary is local to the route, but shared between all plugins. It is always a good idea to add a unique prefix or, if your plugin needs a lot of configuration, store it in a separate namespace within the `config` dictionary. This helps to avoid naming collisions between plugins. + + +Changing the :class:`Route` object +---------------------------------- + +While some :class:`Route` attributes are mutable, changes may have unwanted effects on other plugins. It is most likely a bad idea to monkey-patch a broken route instead of providing a helpful error message and let the user fix the problem. + +In some rare cases, however, it might be justifiable to break this rule. After you made your changes to the :class:`Route` instance, raise :exc:`RouteReset` as an exception. This removes the current route from the cache and causes all plugins to be re-applied. The router is not updated, however. Changes to `rule` or `method` values have no effect on the router, but only on plugins. This may change in the future, though. + + +Runtime optimizations +===================== + +Once all plugins are applied to a route, the wrapped route callback is cached to speed up subsequent requests. If the behavior of your plugin depends on configuration, and you want to be able to change that configuration at runtime, you need to read the configuration on each request. Easy enough. + +For performance reasons, however, it might be worthwhile to choose a different wrapper based on current needs, work with closures, or enable or disable a plugin at runtime. Let's take the built-in HooksPlugin as an example: If no hooks are installed, the plugin removes itself from all affected routes and has virtaully no overhead. As soon as you install the first hook, the plugin activates itself and takes effect again. + +To achieve this, you need control over the callback cache: :meth:`Route.reset` clears the cache for a single route and :meth:`Bottle.reset` clears all caches for all routes of an application at once. On the next request, all plugins are re-applied to the route as if it were requested for the first time. + +Both methods won't affect the current request if called from within a route callback, of cause. To force a restart of the current request, raise :exc:`RouteReset` as an exception. + + +Plugin Example: SQLitePlugin +============================ + +This plugin provides an sqlite3 database connection handle as an additional keyword argument to wrapped callbacks, but only if the callback expects it. If not, the route is ignored and no overhead is added. The wrapper does not affect the return value, but handles plugin-related exceptions properly. :meth:`Plugin.setup` is used to inspect the application and search for conflicting plugins. + +:: + + import sqlite3 + import inspect + + class SQLitePlugin(object): + ''' This plugin passes an sqlite3 database handle to route callbacks + that accept a `db` keyword argument. If a callback does not expect + such a parameter, no connection is made. You can override the database + settings on a per-route basis. ''' + + name = 'sqlite' + api = 2 + + def __init__(self, dbfile=':memory:', autocommit=True, dictrows=True, + keyword='db'): + self.dbfile = dbfile + self.autocommit = autocommit + self.dictrows = dictrows + self.keyword = keyword + + def setup(self, app): + ''' Make sure that other installed plugins don't affect the same + keyword argument.''' + for other in app.plugins: + if not isinstance(other, SQLitePlugin): continue + if other.keyword == self.keyword: + raise PluginError("Found another sqlite plugin with "\ + "conflicting settings (non-unique keyword).") + + def apply(self, callback, context): + # Override global configuration with route-specific values. + conf = context.config.get('sqlite') or {} + dbfile = conf.get('dbfile', self.dbfile) + autocommit = conf.get('autocommit', self.autocommit) + dictrows = conf.get('dictrows', self.dictrows) + keyword = conf.get('keyword', self.keyword) + + # Test if the original callback accepts a 'db' keyword. + # Ignore it if it does not need a database handle. + args = inspect.getargspec(context.callback)[0] + if keyword not in args: + return callback + + def wrapper(*args, **kwargs): + # Connect to the database + db = sqlite3.connect(dbfile) + # This enables column access by name: row['column_name'] + if dictrows: db.row_factory = sqlite3.Row + # Add the connection handle as a keyword argument. + kwargs[keyword] = db + + try: + rv = callback(*args, **kwargs) + if autocommit: db.commit() + except sqlite3.IntegrityError, e: + db.rollback() + raise HTTPError(500, "Database Error", e) + finally: + db.close() + return rv + + # Replace the route callback with the wrapped one. + return wrapper + +This plugin is actually useful and very similar to the version bundled with Bottle. Not bad for less than 60 lines of code, don't you think? Here is a usage example:: + + sqlite = SQLitePlugin(dbfile='/tmp/test.db') + bottle.install(sqlite) + + @route('/show/:page') + def show(page, db): + row = db.execute('SELECT * from pages where name=?', page).fetchone() + if row: + return template('showpage', page=row) + return HTTPError(404, "Page not found") + + @route('/static/:fname#.*#') + def static(fname): + return static_file(fname, root='/some/path') + + @route('/admin/set/:db#[a-zA-Z]+#', skip=[sqlite]) + def change_dbfile(db): + sqlite.dbfile = '/tmp/%s.db' % db + return "Switched DB to %s.db" % db + +The first route needs a database connection and tells the plugin to create a handle by requesting a ``db`` keyword argument. The second route does not need a database and is therefore ignored by the plugin. The third route does expect a 'db' keyword argument, but explicitly skips the sqlite plugin. This way the argument is not overruled by the plugin and still contains the value of the same-named url argument. + diff --git a/html/_sources/plugins/index.txt b/html/_sources/plugins/index.txt new file mode 100644 index 0000000..8130f2f --- /dev/null +++ b/html/_sources/plugins/index.txt @@ -0,0 +1,59 @@ +.. module:: bottle + +========================= +List of available Plugins +========================= + +This is a list of third-party plugins that add extend Bottles core functionality or integrate other libraries with the Bottle framework. + +Have a look at :ref:`plugins` for general questions about plugins (installation, usage). If you plan to develop a new plugin, the :doc:`/plugindev` may help you. + +`Bottle-Cork `_ + Cork provides a simple set of methods to implement Authentication and Authorization in web applications based on Bottle. + +`Bottle-Extras `_ + Meta package to install the bottle plugin collection. + +`Bottle-Flash `_ + flash plugin for bottle + +`Bottle-Hotqueue `_ + FIFO Queue for Bottle built upon redis + +`Macaron `_ + Macaron is an object-relational mapper (ORM) for SQLite. + +`Bottle-Memcache `_ + Memcache integration for Bottle. + +`Bottle-MongoDB `_ + MongoDB integration for Bottle + +`Bottle-Redis `_ + Redis integration for Bottle. + +`Bottle-Renderer `_ + Renderer plugin for bottle + +`Bottle-Servefiles `_ + A reusable app that serves static files for bottle apps + +`Bottle-Sqlalchemy `_ + SQLAlchemy integration for Bottle. + +`Bottle-Sqlite `_ + SQLite3 database integration for Bottle. + +`Bottle-Web2pydal `_ + Web2py Dal integration for Bottle. + +`Bottle-Werkzeug `_ + Integrates the `werkzeug` library (alternative request and response objects, advanced debugging middleware and more). + +Plugins listed here are not part of Bottle or the Bottle project, but developed and maintained by third parties. + +.. toctree:: + :glob: + :hidden: + + /plugins/* diff --git a/html/_sources/plugins/sqlite.txt b/html/_sources/plugins/sqlite.txt new file mode 100644 index 0000000..d4f2891 --- /dev/null +++ b/html/_sources/plugins/sqlite.txt @@ -0,0 +1 @@ +.. include:: ../../plugins/sqlite/README diff --git a/html/_sources/plugins/werkzeug.txt b/html/_sources/plugins/werkzeug.txt new file mode 100644 index 0000000..f611fca --- /dev/null +++ b/html/_sources/plugins/werkzeug.txt @@ -0,0 +1 @@ +.. include:: ../../plugins/werkzeug/README diff --git a/html/_sources/recipes.txt b/html/_sources/recipes.txt new file mode 100644 index 0000000..0ea2d38 --- /dev/null +++ b/html/_sources/recipes.txt @@ -0,0 +1,257 @@ +.. module:: bottle + +.. _beaker: http://beaker.groovie.org/ +.. _mod_python: http://www.modpython.org/ +.. _mod_wsgi: http://code.google.com/p/modwsgi/ +.. _werkzeug: http://werkzeug.pocoo.org/documentation/dev/debug.html +.. _paste: http://pythonpaste.org/modules/evalexception.html +.. _pylons: http://pylonshq.com/ +.. _gevent: http://www.gevent.org/ +.. _compression: https://github.com/defnull/bottle/issues/92 +.. _GzipFilter: http://www.cherrypy.org/wiki/GzipFilter +.. _cherrypy: http://www.cherrypy.org +.. _heroku: http://heroku.com + +Recipes +============= + +This is a collection of code snippets and examples for common use cases. + +Keeping track of Sessions +---------------------------- + +There is no built-in support for sessions because there is no *right* way to do it (in a micro framework). Depending on requirements and environment you could use beaker_ middleware with a fitting backend or implement it yourself. Here is an example for beaker sessions with a file-based backend:: + + import bottle + from beaker.middleware import SessionMiddleware + + session_opts = { + 'session.type': 'file', + 'session.cookie_expires': 300, + 'session.data_dir': './data', + 'session.auto': True + } + app = SessionMiddleware(bottle.app(), session_opts) + + @bottle.route('/test') + def test(): + s = bottle.request.environ.get('beaker.session') + s['test'] = s.get('test',0) + 1 + s.save() + return 'Test counter: %d' % s['test'] + + bottle.run(app=app) + +Debugging with Style: Debugging Middleware +-------------------------------------------------------------------------------- + +Bottle catches all Exceptions raised in your app code to prevent your WSGI server from crashing. If the built-in :func:`debug` mode is not enough and you need exceptions to propagate to a debugging middleware, you can turn off this behaviour:: + + import bottle + app = bottle.app() + app.catchall = False #Now most exceptions are re-raised within bottle. + myapp = DebuggingMiddleware(app) #Replace this with a middleware of your choice (see below) + bottle.run(app=myapp) + +Now, bottle only catches its own exceptions (:exc:`HTTPError`, :exc:`HTTPResponse` and :exc:`BottleException`) and your middleware can handle the rest. + +The werkzeug_ and paste_ libraries both ship with very powerful debugging WSGI middleware. Look at :class:`werkzeug.debug.DebuggedApplication` for werkzeug_ and :class:`paste.evalexception.middleware.EvalException` for paste_. They both allow you do inspect the stack and even execute python code within the stack context, so **do not use them in production**. + + +Unit-Testing Bottle Applications +-------------------------------------------------------------------------------- + +Unit-testing is usually performed against methods defined in your web application without running a WSGI environment. + +A simple example using `Nose `_:: + + import bottle + + @bottle.route('/') + def index(): + return 'Hi!' + + if __name__ == '__main__': + bottle.run() + +Test script:: + + import mywebapp + + def test_webapp_index(): + assert mywebapp.index() == 'Hi!' + +In the example the Bottle route() method is never executed - only index() is tested. + + +Functional Testing Bottle Applications +-------------------------------------------------------------------------------- + +Any HTTP-based testing system can be used with a running WSGI server, but some testing frameworks work more intimately with WSGI, and provide the ability the call WSGI applications in a controlled environment, with tracebacks and full use of debugging tools. `Testing tools for WSGI `_ is a good starting point. + +Example using `WebTest `_ and `Nose `_:: + + from webtest import TestApp + import mywebapp + + def test_functional_login_logout(): + app = TestApp(mywebapp.app) + + app.post('/login', {'user': 'foo', 'pass': 'bar'}) # log in and get a cookie + + assert app.get('/admin').status == '200 OK' # fetch a page successfully + + app.get('/logout') # log out + app.reset() # drop the cookie + + # fetch the same page, unsuccessfully + assert app.get('/admin').status == '401 Unauthorized' + + +Embedding other WSGI Apps +-------------------------------------------------------------------------------- + +This is not the recommend way (you should use a middleware in front of bottle to do this) but you can call other WSGI applications from within your bottle app and let bottle act as a pseudo-middleware. Here is an example:: + + from bottle import request, response, route + subproject = SomeWSGIApplication() + + @route('/subproject/:subpath#.*#', method='ALL') + def call_wsgi(subpath): + new_environ = request.environ.copy() + new_environ['SCRIPT_NAME'] = new_environ.get('SCRIPT_NAME','') + '/subproject' + new_environ['PATH_INFO'] = '/' + subpath + def start_response(status, headerlist): + response.status = int(status.split()[0]) + for key, value in headerlist: + response.add_header(key, value) + return app(new_environ, start_response) + +Again, this is not the recommend way to implement subprojects. It is only here because many people asked for this and to show how bottle maps to WSGI. + + +Ignore trailing slashes +-------------------------------------------------------------------------------- + +For Bottle, ``/example`` and ``/example/`` are two different routes [1]_. To treat both URLs the same you can add two ``@route`` decorators:: + + @route('/test') + @route('/test/') + def test(): return 'Slash? no?' + +or add a WSGI middleware that strips trailing slashes from all URLs:: + + class StripPathMiddleware(object): + def __init__(self, app): + self.app = app + def __call__(self, e, h): + e['PATH_INFO'] = e['PATH_INFO'].rstrip('/') + return self.app(e,h) + + app = bottle.app() + myapp = StripPathMiddleware(app) + bottle.run(app=myapp) + +.. rubric:: Footnotes + +.. [1] Because they are. See + + +Keep-alive requests +------------------- + +.. note:: + + For a more detailed explanation, see :doc:`async`. + +Several "push" mechanisms like XHR multipart need the ability to write response data without closing the connection in conjunction with the response header "Connection: keep-alive". WSGI does not easily lend itself to this behavior, but it is still possible to do so in Bottle by using the gevent_ async framework. Here is a sample that works with either the gevent_ HTTP server or the paste_ HTTP server (it may work with others, but I have not tried). Just change ``server='gevent'`` to ``server='paste'`` to use the paste_ server:: + + from gevent import monkey; monkey.patch_all() + + import time + from bottle import route, run + + @route('/stream') + def stream(): + yield 'START' + time.sleep(3) + yield 'MIDDLE' + time.sleep(5) + yield 'END' + + run(host='0.0.0.0', port=8080, server='gevent') + +If you browse to ``http://localhost:8080/stream``, you should see 'START', 'MIDDLE', and 'END' show up one at a time (rather than waiting 8 seconds to see them all at once). + +Gzip Compression in Bottle +-------------------------- + +.. note:: + For a detailed discussion, see compression_ + +A common feature request is for Bottle to support Gzip compression, which speeds up sites by compressing static resources (like CSS and JS files) during a request. + +Supporting Gzip compression is not a straightforward proposition, due to a number of corner cases that crop up frequently. A proper Gzip implementation must: + +* Compress on the fly and be fast doing so. +* Do not compress for browsers that don't support it. +* Do not compress files that are compressed already (images, videos). +* Do not compress dynamic files. +* Support two differed compression algorithms (gzip and deflate). +* Cache compressed files that don't change often. +* De-validate the cache if one of the files changed anyway. +* Make sure the cache does not get to big. +* Do not cache small files because a disk seek would take longer than on-the-fly compression. + +Because of these requirements, it is the recommendation of the Bottle project that Gzip compression is best handled by the WSGI server Bottle runs on top of. WSGI servers such as cherrypy_ provide a GzipFilter_ middleware that can be used to accomplish this. + + +Using the hooks plugin +---------------------- + +For example, if you want to allow Cross-Origin Resource Sharing for +the content returned by all of your URL, you can use the hook +decorator and setup a callback function:: + + from bottle import hook, response, route + + @hook('after_request') + def enable_cors(): + response.headers['Access-Control-Allow-Origin'] = '*' + + @route('/foo') + def say_foo(): + return 'foo!' + + @route('/bar') + def say_bar(): + return {'type': 'friendly', 'content': 'Hi!'} + +You can also use the ``before_callback`` to take an action before +every function gets called. + + +Using Bottle with Heroku +------------------------ + +Heroku_, a popular cloud application platform now provides support +for running Python applications on their infastructure. + +This recipe is based upon the `Heroku Quickstart +`_, +with Bottle specific code replacing the +`Write Your App `_ +section of the `Getting Started with Python on Heroku/Cedar +`_ guide:: + + import os + from bottle import route, run + + @route("/") + def hello_world(): + return "Hello World!" + + run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000))) + +Heroku's app stack passes the port that the application needs to +listen on for requests, using the `os.environ` dictionary. diff --git a/html/_sources/routing.txt b/html/_sources/routing.txt new file mode 100644 index 0000000..fe89621 --- /dev/null +++ b/html/_sources/routing.txt @@ -0,0 +1,129 @@ +================================================================================ +Request Routing +================================================================================ + +Bottle uses a powerful routing engine to find the right callback for each request. The :ref:`tutorial ` shows you the basics. This document covers advanced techniques and rule mechanics in detail. + +Rule Syntax +-------------------------------------------------------------------------------- + +The :class:`Router` distinguishes between two basic types of routes: **static routes** (e.g. ``/contact``) and **dynamic routes** (e.g. ``/hello/``). A route that contains one or more *wildcards* it is considered dynamic. All other routes are static. + +.. versionchanged:: 0.10 + +The simplest form of a wildcard consists of a name enclosed in angle brackets (e.g. ````). The name should be unique for a given route and form a valid python identifier (alphanumeric, starting with a letter). This is because wildcards are used as keyword arguments for the request callback later. + +Each wildcard matches one or more characters, but stops at the first slash (``/``). This equals a regular expression of ``[^/]+`` and ensures that only one path segment is matched and routes with more than one wildcard stay unambiguous. + +The rule ``//`` matches as follows: + +============ ========================================= +Path Result +============ ========================================= +/save/123 ``{'action': 'save', 'item': '123'}`` +/save/123/ `No Match` +/save/ `No Match` +//123 `No Match` +============ ========================================= + +You can change the exact behaviour in many ways using filters. This is described in the next section. + +Wildcard Filters +-------------------------------------------------------------------------------- + +.. versionadded:: 0.10 + +Filters are used to define more specific wildcards, and/or transform the matched part of the URL before it is passed to the callback. A filtered wildcard is declared as ```` or ````. The syntax for the optional config part depends on the filter used. + +The following standard filters are implemented: + +* **:int** matches (signed) digits and converts the value to integer. +* **:float** similar to :int but for decimal numbers. +* **:path** matches all characters including the slash character in a non-greedy way and may be used to match more than one path segment. +* **:re[:exp]** allows you to specify a custom regular expression in the config field. The matched value is not modified. + +You can add your own filters to the router. All you need is a function that returns three elements: A regular expression string, a callable to convert the URL fragment to a python value, and a callable that does the opposite. The filter function is called with the configuration string as the only parameter and may parse it as needed:: + + app = Bottle() + + def list_filter(config): + ''' Matches a comma separated list of numbers. ''' + delimiter = config or ',' + regexp = r'\d+(%s\d)*' % re.escape(delimiter) + + def to_python(match): + return map(int, match.split(delimiter)) + + def to_url(numbers): + return delimiter.join(map(str, numbers)) + + return regexp, to_python, to_url + + app.router.add_filter('list', list_filter) + + @app.route('/follow/') + def follow_users(ids): + for id in ids: + ... + + +Legacy Syntax +-------------------------------------------------------------------------------- + +.. versionchanged:: 0.10 + +The new rule syntax was introduce in **Bottle 0.10** to simplify some common use cases, but the old syntax still works and you can find lot code examples still using it. The differences are best described by example: + +=================== ==================== +Old Syntax New Syntax +=================== ==================== +``:name`` ```` +``:name#regexp#`` ```` +``:#regexp#`` ``<:re:regexp>`` +``:##`` ``<:re>`` +=================== ==================== + +Try to avoid the old syntax in future projects if you can. It is not currently deprecated, but will be eventually. + + +Routing Order +-------------------------------------------------------------------------------- + +With the power of wildcards and regular expressions it is possible to define overlapping routes. If multiple routes match the same URL, things get a bit tricky. To fully understand what happens in this case, you need to know in which order routes are checked by the router. + +First you should know that routes are grouped by their path rule. Two routes with the same path rule but different methods are grouped together and the first route determines the position of both routes. Fully identical routes (same path rule and method) replace previously defined routes, but keep the position of their predecessor. + +Static routes are checked first. This is mostly for performance reasons and can be switched off, but is currently the default. If no static route matches the request, the dynamic routes are checked in the order they were defined. The first hit ends the search. If no rule matched, a "404 Page not found" error is returned. + +In a second step, the request method is checked. If no exact match is found, and the request method is HEAD, the router checks for a GET route. Otherwise, it checks for an ANY route. If that fails too, a "405 Method not allowed" error is returned. + +Here is an example where this might bite you:: + + @route('//', method='GET') + @route('/save/', method='POST') + +The second route will never hit. Even POST requests don't arrive at the second route because the request method is checked in a separate step. The router stops at the first route which matches the request path, then checks for a valid request method, can't find one and raises a 405 error. + +Sounds complicated, and it is. That is the price for performance. It is best to avoid ambiguous routes at all and choose unique prefixes for each route. This implementation detail may change in the future, though. We are working on it. + + +Explicit routing configuration +-------------------------------------------------------------------------------- + +Route decorator can also be directly called as method. This way provides flexibility in complex setups, allowing you to directly control, when and how routing configuration done. + +Here is a basic example of explicit routing configuration for default bottle application:: + + def setup_routing(): + bottle.route('/', method='GET', index) + bottle.route('/edit', method=['GET', 'POST'], edit) + +In fact, any :class:`Bottle` instance routing can be configured same way:: + + def setup_routing(app): + app.route('/new', method=['GET', 'POST'], form_new) + app.route('/edit', method=['GET', 'POST'], form_edit) + + app = Bottle() + setup_routing(app) + diff --git a/html/_sources/stpl.txt b/html/_sources/stpl.txt new file mode 100644 index 0000000..10c7699 --- /dev/null +++ b/html/_sources/stpl.txt @@ -0,0 +1,231 @@ +====================== +SimpleTemplate Engine +====================== + +.. currentmodule:: bottle + +Bottle comes with a fast, powerful and easy to learn built-in template engine called *SimpleTemplate* or *stpl* for short. It is the default engine used by the :func:`view` and :func:`template` helpers but can be used as a stand-alone general purpose template engine too. This document explains the template syntax and shows examples for common use cases. + +.. rubric:: Basic API Usage: + +:class:`SimpleTemplate` implements the :class:`BaseTemplate` API:: + + >>> from bottle import SimpleTemplate + >>> tpl = SimpleTemplate('Hello {{name}}!') + >>> tpl.render(name='World') + u'Hello World!' + +In this document we use the :func:`template` helper in examples for the sake of simplicity:: + + >>> from bottle import template + >>> template('Hello {{name}}!', name='World') + u'Hello World!' + +Just keep in mind that compiling and rendering templates are two different actions, even if the :func:`template` helper hides this fact. Templates are usually compiled only once and cached internally, but rendered many times with different keyword arguments. + +:class:`SimpleTemplate` Syntax +============================== + +Python is a very powerful language but its whitespace-aware syntax makes it difficult to use as a template language. SimpleTemplate removes some of these restrictions and allows you to write clean, readable and maintainable templates while preserving full access to the features, libraries and speed of the Python language. + +.. warning:: + + The :class:`SimpleTemplate` syntax compiles directly to python bytecode and is executed on each :meth:`SimpleTemplate.render` call. Do not render untrusted templates! They may contain and execute harmful python code. + +Inline Expressions +----------------- + +You already learned the use of the ``{{...}}`` syntax from the "Hello World!" example above, but there is more: any python expression is allowed within the curly brackets as long as it returns a string or something that has a string representation:: + + >>> template('Hello {{name}}!', name='World') + u'Hello World!' + >>> template('Hello {{name.title() if name else "stranger"}}!', name=None) + u'Hello stranger!' + >>> template('Hello {{name.title() if name else "stranger"}}!', name='mArC') + u'Hello Marc!' + +The contained python expression is executed at render-time and has access to all keyword arguments passed to the :meth:`SimpleTemplate.render` method. HTML special characters are escaped automatically to prevent `XSS `_ attacks. You can start the expression with an exclamation mark to disable escaping for that expression:: + + >>> template('Hello {{name}}!', name='World') + u'Hello <b>World</b>!' + >>> template('Hello {{!name}}!', name='World') + u'Hello World!' + +.. highlight:: html+django + +Embedded python code +-------------------- + +The ``%`` character marks a line of python code. The only difference between this and real python code is that you have to explicitly close blocks with an ``%end`` statement. In return you can align the code with the surrounding template and don't have to worry about correct indentation of blocks. The *SimpleTemplate* parser handles that for you. Lines *not* starting with a ``%`` are rendered as text as usual:: + + %if name: + Hi {{name}} + %else: + Hello stranger + %end + +The ``%`` character is only recognised if it is the first non-whitespace character in a line. To escape a leading ``%`` you can add a second one. ``%%`` is replaced by a single ``%`` in the resulting template:: + + This line contains a % but no python code. + %% This text-line starts with '%' + %%% This text-line starts with '%%' + +Suppressing line breaks +----------------------- + +You can suppress the line break in front of a code-line by adding a double backslash at the end of the line:: + + \\ + %if True: + nobreak\\ + %end + + +This template produces the following output:: + + nobreak + +The ``%include`` Statement +-------------------------- + +You can include other templates using the ``%include sub_template [kwargs]`` statement. The ``sub_template`` parameter specifies the name or path of the template to be included. The rest of the line is interpreted as a comma-separated list of ``key=statement`` pairs similar to keyword arguments in function calls. They are passed to the sub-template analogous to a :meth:`SimpleTemplate.render` call. The ``**kwargs`` syntax for passing a dict is allowed too:: + + %include header_template title='Hello World' +

Hello World

+ %include footer_template + +The ``%rebase`` Statement +------------------------- + +The ``%rebase base_template [kwargs]`` statement causes ``base_template`` to be rendered instead of the original template. The base-template then includes the original template using an empty ``%include`` statement and has access to all variables specified by ``kwargs``. This way it is possible to wrap a template with another template or to simulate the inheritance feature found in some other template engines. + +Let's say you have a content template and want to wrap it with a common HTML layout frame. Instead of including several header and footer templates, you can use a single base-template to render the layout frame. + +Base-template named ``layout.tpl``:: + + + + {{title or 'No title'}} + + + %include + + + +Main-template named ``content.tpl``:: + + This is the page content: {{content}} + %rebase layout title='Content Title' + +Now you can render ``content.tpl``: + +.. code-block:: python + + >>> print template('content', content='Hello World!') + +.. code-block:: html + + + + Content Title + + + This is the page content: Hello World! + + + +A more complex scenario involves chained rebases and multiple content blocks. The ``block_content.tpl`` template defines two functions and passes them to a ``columns.tpl`` base template:: + + %def leftblock(): + Left block content. + %end + %def rightblock(): + Right block content. + %end + %rebase columns leftblock=leftblock, rightblock=rightblock, title=title + +The ``columns.tpl`` base-template uses the two callables to render the content of the left and right column. It then wraps itself with the ``layout.tpl`` template defined earlier:: + + %rebase layout title=title +
+ %leftblock() +
+
+ %rightblock() +
+ +Lets see how ``block_content.tpl`` renders: + +.. code-block:: python + + >>> print template('block_content', title='Hello World!') + +.. code-block:: html + + + + Hello World + + +
+ Left block content. +
+
+ Right block content. +
+ + + +Namespace Functions +------------------- + +Accessing undefined variables in a template raises :exc:`NameError` and +stops rendering immediately. This is standard python behavior and nothing new, +but vanilla python lacks an easy way to check the availability of a variable. +This quickly gets annoying if you want to support flexible inputs or use the +same template in different situations. SimpleTemplate helps you out here: The +following three functions are defined in the default namespace and accessible +from anywhere within a template: + +.. currentmodule:: stpl + +.. function:: defined(name) + + Return True if the variable is defined in the current template namespace, + False otherwise. + +.. function:: get(name, default=None) + + Return the variable, or a default value. + +.. function:: setdefault(name, default) + + If the variable is not defined, create it with the given default value. + Return the variable. + +Here is an example that uses all three functions to implement optional template +variables in different ways:: + + % setdefault('text', 'No Text') +

{{get('title', 'No Title')}}

+

{{ text }}

+ % if defined('author'): +

By {{ author }}

+ % end + +.. currentmodule:: bottle + + +:class:`SimpleTemplate` API +============================== + +.. autoclass:: SimpleTemplate + :members: + +Known bugs +============================== + +Some syntax constructions allowed in python are problematic within a template. The following syntaxes won't work with SimpleTemplate: + + * Multi-line statements must end with a backslash (``\``) and a comment, if present, must not contain any additional ``#`` characters. + * Multi-line strings are not supported yet. diff --git a/html/_sources/tutorial.txt b/html/_sources/tutorial.txt new file mode 100644 index 0000000..9ef531d --- /dev/null +++ b/html/_sources/tutorial.txt @@ -0,0 +1,968 @@ +.. module:: bottle + +.. _Apache Server: +.. _Apache: http://www.apache.org/ +.. _cherrypy: http://www.cherrypy.org/ +.. _decorator: http://docs.python.org/glossary.html#term-decorator +.. _flup: http://trac.saddi.com/flup +.. _http_code: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html +.. _http_method: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html +.. _json: http://de.wikipedia.org/wiki/JavaScript_Object_Notation +.. _lighttpd: http://www.lighttpd.net/ +.. _mako: http://www.makotemplates.org/ +.. _mod_wsgi: http://code.google.com/p/modwsgi/ +.. _Paste: http://pythonpaste.org/ +.. _Pound: http://www.apsis.ch/pound/ +.. _`WSGI Specification`: http://www.wsgi.org/wsgi/ +.. _issue: http://github.com/defnull/bottle/issues +.. _Python: http://python.org/ +.. _SimpleCookie: http://docs.python.org/library/cookie.html#morsel-objects +.. _testing: http://github.com/defnull/bottle/raw/master/bottle.py + +======== +Tutorial +======== + +This tutorial introduces you to the concepts and features of the Bottle web framework and covers basic and advanced topics alike. You can read it from start to end, or use it as a reference later on. The automatically generated :doc:`api` may be interesting for you, too. It covers more details, but explains less than this tutorial. Solutions for the most common questions can be found in our :doc:`recipes` collection or on the :doc:`faq` page. If you need any help, join our `mailing list `_ or visit us in our `IRC channel `_. + +.. _installation: + +Installation +============================================================================== + +Bottle does not depend on any external libraries. You can just download `bottle.py `_ into your project directory and start coding: + +.. code-block:: bash + + $ wget http://bottlepy.org/bottle.py + +This will get you the latest development snapshot that includes all the new features. If you prefer a more stable environment, you should stick with the stable releases. These are available on `PyPi `_ and can be installed via :command:`pip` (recommended), :command:`easy_install` or your package manager: + +.. code-block:: bash + + $ sudo pip install bottle # recommended + $ sudo easy_install bottle # alternative without pip + $ sudo apt-get install python-bottle # works for debian, ubuntu, ... + +Either way, you'll need Python 2.5 or newer (including 3.x) to run bottle applications. If you do not have permissions to install packages system-wide or simply don't want to, create a `virtualenv `_ first: + +.. code-block:: bash + + $ virtualenv develop # Create virtual environment + $ source develop/bin/activate # Change default python to virtual one + (develop)$ pip install -U bottle # Install bottle to virtual environment + +Or, if virtualenv is not installed on your system: + +.. code-block:: bash + + $ wget https://raw.github.com/pypa/virtualenv/master/virtualenv.py + $ python virtualenv.py develop # Create virtual environment + $ source develop/bin/activate # Change default python to virtual one + (develop)$ pip install -U bottle # Install bottle to virtual environment + + + +Quickstart: "Hello World" +============================================================================== + +This tutorial assumes you have Bottle either :ref:`installed ` or copied into your project directory. Let's start with a very basic "Hello World" example:: + + from bottle import route, run + + @route('/hello') + def hello(): + return "Hello World!" + + run(host='localhost', port=8080, debug=True) + +This is it. Run this script, visit http://localhost:8080/hello and you will see "Hello World!" in your browser. Here is how it works: + +The :func:`route` decorator binds a piece of code to an URL path. In this case, we link the ``/hello`` URL to the ``hello()`` function. This is called a `route` (hence the decorator name) and is the most important concept of this framework. You can define as many routes as you want. Whenever a browser requests an URL, the associated function is called and the return value is sent back to the browser. Its as simple as that. + +The :func:`run` call in the last line starts a built-in development server. It runs on `localhost` port 8080 and serves requests until you hit :kbd:`Control-c`. You can switch the server backend later, but for now a development server is all we need. It requires no setup at all and is an incredibly painless way to get your application up and running for local tests. + +The :ref:`tutorial-debugging` is very helpful during early development, but should be switched off for public applications. Keep that in mind. + +Of course this is a very simple example, but it shows the basic concept of how applications are built with Bottle. Continue reading and you'll see what else is possible. + +.. _tutorial-default: + +The `Default Application` +------------------------------------------------------------------------------ + +For the sake of simplicity, most examples in this tutorial use a module-level :func:`route` decorator to define routes. This adds routes to a global "default application", an instance of :class:`Bottle` that is automatically created the first time you call :func:`route`. Several other module-level decorators and functions relate to this default application, but if you prefer a more object oriented approach and don't mind the extra typing, you can create a separate application object and use that instead of the global one:: + + from bottle import Bottle, run, template + + app = Bottle() + + @app.route('/hello') + def hello(): + return "Hello World!" + + run(app, host='localhost', port=8080) + +The object-oriented approach is further described in the :ref:`default-app` section. Just keep in mind that you have a choice. + + + + +.. _tutorial-routing: + +Request Routing +============================================================================== + +In the last chapter we built a very simple web application with only a single route. Here is the routing part of the "Hello World" example again:: + + @route('/hello') + def hello(): + return "Hello World!" + +The :func:`route` decorator links an URL path to a callback function, and adds a new route to the :ref:`default application `. An application with just one route is kind of boring, though. Let's add some more:: + + @route('/') + @route('/hello/') + def greet(name='Stranger'): + return template('Hello {{name}}, how are you?', name=name) + +This example demonstrates two things: You can bind more than one route to a single callback, and you can add wildcards to URLs and access them via keyword arguments. + + + +.. _tutorial-dynamic-routes: + +Dynamic Routes +------------------------------------------------------------------------------- + +Routes that contain wildcards are called `dynamic routes` (as opposed to `static routes`) and match more than one URL at the same time. A simple wildcard consists of a name enclosed in angle brackets (e.g. ````) and accepts one or more characters up to the next slash (``/``). For example, the route ``/hello/`` accepts requests for ``/hello/alice`` as well as ``/hello/bob``, but not for ``/hello``, ``/hello/`` or ``/hello/mr/smith``. + +Each wildcard passes the covered part of the URL as a keyword argument to the request callback. You can use them right away and implement RESTful, nice-looking and meaningful URLs with ease. Here are some other examples along with the URLs they'd match:: + + @route('/wiki/') # matches /wiki/Learning_Python + def show_wiki_page(pagename): + ... + + @route('//') # matches /follow/defnull + def user_api(action, user): + ... + +.. versionadded:: 0.10 + +Filters are used to define more specific wildcards, and/or transform the covered part of the URL before it is passed to the callback. A filtered wildcard is declared as ```` or ````. The syntax for the optional config part depends on the filter used. + +The following filters are implemented by default and more may be added: + +* **:int** matches (signed) digits only and converts the value to integer. +* **:float** similar to :int but for decimal numbers. +* **:path** matches all characters including the slash character in a non-greedy way and can be used to match more than one path segment. +* **:re** allows you to specify a custom regular expression in the config field. The matched value is not modified. + +Let's have a look at some practical examples:: + + @route('/object/') + def callback(id): + assert isinstance(id, int) + + @route('/show/') + def callback(name): + assert name.isalpha() + + @route('/static/') + def callback(path): + return static_file(path, ...) + +You can add your own filters as well. See :doc:`Routing` for details. + +.. versionchanged:: 0.10 + +The new rule syntax was introduced in **Bottle 0.10** to simplify some common use cases, but the old syntax still works and you can find a lot of code examples still using it. The differences are best described by example: + +=================== ==================== +Old Syntax New Syntax +=================== ==================== +``:name`` ```` +``:name#regexp#`` ```` +``:#regexp#`` ``<:re:regexp>`` +``:##`` ``<:re>`` +=================== ==================== + +Try to avoid the old syntax in future projects if you can. It is not currently deprecated, but will be eventually. + + +HTTP Request Methods +------------------------------------------------------------------------------ + +.. __: http_method_ + +The HTTP protocol defines several `request methods`__ (sometimes referred to as "verbs") for different tasks. GET is the default for all routes with no other method specified. These routes will match GET requests only. To handle other methods such as POST, PUT or DELETE, add a ``method`` keyword argument to the :func:`route` decorator or use one of the four alternative decorators: :func:`get`, :func:`post`, :func:`put` or :func:`delete`. + +The POST method is commonly used for HTML form submission. This example shows how to handle a login form using POST:: + + from bottle import get, post, request + + @get('/login') # or @route('/login') + def login_form(): + return '''
+ + + +
''' + + @post('/login') # or @route('/login', method='POST') + def login_submit(): + name = request.forms.get('name') + password = request.forms.get('password') + if check_login(name, password): + return "

Your login was correct

" + else: + return "

Login failed

" + +In this example the ``/login`` URL is linked to two distinct callbacks, one for GET requests and another for POST requests. The first one displays a HTML form to the user. The second callback is invoked on a form submission and checks the login credentials the user entered into the form. The use of :attr:`Request.forms` is further described in the :ref:`tutorial-request` section. + +.. rubric:: Special Methods: HEAD and ANY + +The HEAD method is used to ask for the response identical to the one that would correspond to a GET request, but without the response body. This is useful for retrieving meta-information about a resource without having to download the entire document. Bottle handles these requests automatically by falling back to the corresponding GET route and cutting off the request body, if present. You don't have to specify any HEAD routes yourself. + +Additionally, the non-standard ANY method works as a low priority fallback: Routes that listen to ANY will match requests regardless of their HTTP method but only if no other more specific route is defined. This is helpful for *proxy-routes* that redirect requests to more specific sub-applications. + +To sum it up: HEAD requests fall back to GET routes and all requests fall back to ANY routes, but only if there is no matching route for the original request method. It's as simple as that. + + + +Routing Static Files +------------------------------------------------------------------------------ + +Static files such as images or CSS files are not served automatically. You have to add a route and a callback to control which files get served and where to find them:: + + from bottle import static_file + @route('/static/') + def server_static(filename): + return static_file(filename, root='/path/to/your/static/files') + +The :func:`static_file` function is a helper to serve files in a safe and convenient way (see :ref:`tutorial-static-files`). This example is limited to files directly within the ``/path/to/your/static/files`` directory because the ```` wildcard won't match a path with a slash in it. To serve files in subdirectories, change the wildcard to use the `path` filter:: + + @route('/static/') + def server_static(filepath): + return static_file(filepath, root='/path/to/your/static/files') + +Be careful when specifying a relative root-path such as ``root='./static/files'``. The working directory (``./``) and the project directory are not always the same. + + + + +.. _tutorial-errorhandling: + +Error Pages +------------------------------------------------------------------------------ + +If anything goes wrong, Bottle displays an informative but fairly plain error page. You can override the default for a specific HTTP status code with the :func:`error` decorator:: + + from bottle import error + @error(404) + def error404(error): + return 'Nothing here, sorry' + +From now on, `404 File not Found` errors will display a custom error page to the user. The only parameter passed to the error-handler is an instance of :exc:`HTTPError`. Apart from that, an error-handler is quite similar to a regular request callback. You can read from :data:`request`, write to :data:`response` and return any supported data-type except for :exc:`HTTPError` instances. + +Error handlers are used only if your application returns or raises an :exc:`HTTPError` exception (:func:`abort` does just that). Changing :attr:`Request.status` or returning :exc:`HTTPResponse` won't trigger the error handler. + + + + + + +.. _tutorial-output: + +Generating content +============================================================================== + +In pure WSGI, the range of types you may return from your application is very limited. Applications must return an iterable yielding byte strings. You may return a string (because strings are iterable) but this causes most servers to transmit your content char by char. Unicode strings are not allowed at all. This is not very practical. + +Bottle is much more flexible and supports a wide range of types. It even adds a ``Content-Length`` header if possible and encodes unicode automatically, so you don't have to. What follows is a list of data types you may return from your application callbacks and a short description of how these are handled by the framework: + +Dictionaries + As mentioned above, Python dictionaries (or subclasses thereof) are automatically transformed into JSON strings and returned to the browser with the ``Content-Type`` header set to ``application/json``. This makes it easy to implement json-based APIs. Data formats other than json are supported too. See the :ref:`tutorial-output-filter` to learn more. + +Empty Strings, ``False``, ``None`` or other non-true values: + These produce an empty output with the ``Content-Length`` header set to 0. + +Unicode strings + Unicode strings (or iterables yielding unicode strings) are automatically encoded with the codec specified in the ``Content-Type`` header (utf8 by default) and then treated as normal byte strings (see below). + +Byte strings + Bottle returns strings as a whole (instead of iterating over each char) and adds a ``Content-Length`` header based on the string length. Lists of byte strings are joined first. Other iterables yielding byte strings are not joined because they may grow too big to fit into memory. The ``Content-Length`` header is not set in this case. + +Instances of :exc:`HTTPError` or :exc:`HTTPResponse` + Returning these has the same effect as when raising them as an exception. In case of an :exc:`HTTPError`, the error handler is applied. See :ref:`tutorial-errorhandling` for details. + +File objects + Everything that has a ``.read()`` method is treated as a file or file-like object and passed to the ``wsgi.file_wrapper`` callable defined by the WSGI server framework. Some WSGI server implementations can make use of optimized system calls (sendfile) to transmit files more efficiently. In other cases this just iterates over chunks that fit into memory. Optional headers such as ``Content-Length`` or ``Content-Type`` are *not* set automatically. Use :func:`send_file` if possible. See :ref:`tutorial-static-files` for details. + +Iterables and generators + You are allowed to use ``yield`` within your callbacks or return an iterable, as long as the iterable yields byte strings, unicode strings, :exc:`HTTPError` or :exc:`HTTPResponse` instances. Nested iterables are not supported, sorry. Please note that the HTTP status code and the headers are sent to the browser as soon as the iterable yields its first non-empty value. Changing these later has no effect. + +The ordering of this list is significant. You may for example return a subclass of :class:`str` with a ``read()`` method. It is still treated as a string instead of a file, because strings are handled first. + +.. rubric:: Changing the Default Encoding + +Bottle uses the `charset` parameter of the ``Content-Type`` header to decide how to encode unicode strings. This header defaults to ``text/html; charset=UTF8`` and can be changed using the :attr:`Response.content_type` attribute or by setting the :attr:`Response.charset` attribute directly. (The :class:`Response` object is described in the section :ref:`tutorial-response`.) + +:: + + from bottle import response + @route('/iso') + def get_iso(): + response.charset = 'ISO-8859-15' + return u'This will be sent with ISO-8859-15 encoding.' + + @route('/latin9') + def get_latin(): + response.content_type = 'text/html; charset=latin9' + return u'ISO-8859-15 is also known as latin9.' + +In some rare cases the Python encoding names differ from the names supported by the HTTP specification. Then, you have to do both: first set the :attr:`Response.content_type` header (which is sent to the client unchanged) and then set the :attr:`Response.charset` attribute (which is used to encode unicode). + +.. _tutorial-static-files: + +Static Files +-------------------------------------------------------------------------------- + +You can directly return file objects, but :func:`static_file` is the recommended way to serve static files. It automatically guesses a mime-type, adds a ``Last-Modified`` header, restricts paths to a ``root`` directory for security reasons and generates appropriate error responses (401 on permission errors, 404 on missing files). It even supports the ``If-Modified-Since`` header and eventually generates a ``304 Not Modified`` response. You can pass a custom MIME type to disable guessing. + +:: + + from bottle import static_file + @route('/images/#') + def send_image(filename): + return static_file(filename, root='/path/to/image/files', mimetype='image/png') + + @route('/static/') + def send_static(filename): + return static_file(filename, root='/path/to/static/files') + +You can raise the return value of :func:`static_file` as an exception if you really need to. + +.. rubric:: Forced Download + +Most browsers try to open downloaded files if the MIME type is known and assigned to an application (e.g. PDF files). If this is not what you want, you can force a download dialog and even suggest a filename to the user:: + + @route('/download/') + def download(filename): + return static_file(filename, root='/path/to/static/files', download=filename) + +If the ``download`` parameter is just ``True``, the original filename is used. + +.. _tutorial-error: + +HTTP Errors and Redirects +-------------------------------------------------------------------------------- + +The :func:`abort` function is a shortcut for generating HTTP error pages. + +:: + + from bottle import route, abort + @route('/restricted') + def restricted(): + abort(401, "Sorry, access denied.") + +To redirect a client to a different URL, you can send a ``303 See Other`` response with the ``Location`` header set to the new URL. :func:`redirect` does that for you:: + + from bottle import redirect + @route('/wrong/url') + def wrong(): + redirect("/right/url") + +You may provide a different HTTP status code as a second parameter. + +.. note:: + Both functions will interrupt your callback code by raising an :exc:`HTTPError` exception. + +.. rubric:: Other Exceptions + +All exceptions other than :exc:`HTTPResponse` or :exc:`HTTPError` will result in a ``500 Internal Server Error`` response, so they won't crash your WSGI server. You can turn off this behavior to handle exceptions in your middleware by setting ``bottle.app().catchall`` to ``False``. + + +.. _tutorial-response: + +The :class:`Response` Object +-------------------------------------------------------------------------------- + +Response metadata such as the HTTP status code, response headers and cookies are stored in an object called :data:`response` up to the point where they are transmitted to the browser. You can manipulate these metadata directly or use the predefined helper methods to do so. The full API and feature list is described in the API section (see :class:`Response`), but the most common use cases and features are covered here, too. + +.. rubric:: Status Code + +The `HTTP status code `_ controls the behavior of the browser and defaults to ``200 OK``. In most scenarios you won't need to set the :attr:`Response.status` attribute manually, but use the :func:`abort` helper or return an :exc:`HTTPResponse` instance with the appropriate status code. Any integer is allowed, but codes other than the ones defined by the `HTTP specification `_ will only confuse the browser and break standards. + +.. rubric:: Response Header + +Response headers such as ``Cache-Control`` or ``Location`` are defined via :meth:`Response.set_header`. This method takes two parameters, a header name and a value. The name part is case-insensitive:: + + @route('/wiki/') + def wiki(page): + response.set_header('Content-Language', 'en') + ... + +Most headers are unique, meaning that only one header per name is send to the client. Some special headers however are allowed to appear more than once in a response. To add an additional header, use :meth:`Response.add_header` instead of :meth:`Response.set_header`:: + + response.set_header('Set-Cookie', 'name=value') + response.add_header('Set-Cookie', 'name2=value2') + +Please note that this is just an example. If you want to work with cookies, read :ref:`ahead `. + + +.. _tutorial-cookies: + +Cookies +------------------------------------------------------------------------------- + +A cookie is a named piece of text stored in the user's browser profile. You can access previously defined cookies via :meth:`Request.get_cookie` and set new cookies with :meth:`Response.set_cookie`:: + + @route('/hello') + def hello_again(): + if request.get_cookie("visited"): + return "Welcome back! Nice to see you again" + else: + response.set_cookie("visited", "yes") + return "Hello there! Nice to meet you" + +The :meth:`Response.set_cookie` method accepts a number of additional keyword arguments that control the cookies lifetime and behavior. Some of the most common settings are described here: + +* **max_age:** Maximum age in seconds. (default: ``None``) +* **expires:** A datetime object or UNIX timestamp. (default: ``None``) +* **domain:** The domain that is allowed to read the cookie. (default: current domain) +* **path:** Limit the cookie to a given path (default: ``/``) +* **secure:** Limit the cookie to HTTPS connections (default: off). +* **httponly:** Prevent client-side javascript to read this cookie (default: off, requires Python 2.6 or newer). + +If neither `expires` nor `max_age` is set, the cookie expires at the end of the browser session or as soon as the browser window is closed. There are some other gotchas you should consider when using cookies: + +* Cookies are limited to 4 KB of text in most browsers. +* Some users configure their browsers to not accept cookies at all. Most search engines ignore cookies too. Make sure that your application still works without cookies. +* Cookies are stored at client side and are not encrypted in any way. Whatever you store in a cookie, the user can read it. Worse than that, an attacker might be able to steal a user's cookies through `XSS `_ vulnerabilities on your side. Some viruses are known to read the browser cookies, too. Thus, never store confidential information in cookies. +* Cookies are easily forged by malicious clients. Do not trust cookies. + +.. _tutorial-signed-cookies: + +.. rubric:: Signed Cookies + +As mentioned above, cookies are easily forged by malicious clients. Bottle can cryptographically sign your cookies to prevent this kind of manipulation. All you have to do is to provide a signature key via the `secret` keyword argument whenever you read or set a cookie and keep that key a secret. As a result, :meth:`Request.get_cookie` will return ``None`` if the cookie is not signed or the signature keys don't match:: + + @route('/login') + def login(): + username = request.forms.get('username') + password = request.forms.get('password') + if check_user_credentials(username, password): + response.set_cookie("account", username, secret='some-secret-key') + return "Welcome %s! You are now logged in." % username + else: + return "Login failed." + + @route('/restricted') + def restricted_area(): + username = request.get_cookie("account", secret='some-secret-key') + if username: + return "Hello %s. Welcome back." % username + else: + return "You are not logged in. Access denied." + +In addition, Bottle automatically pickles and unpickles any data stored to signed cookies. This allows you to store any pickle-able object (not only strings) to cookies, as long as the pickled data does not exceed the 4 KB limit. + +.. warning:: Signed cookies are not encrypted (the client can still see the content) and not copy-protected (the client can restore an old cookie). The main intention is to make pickling and unpickling safe and prevent manipulation, not to store secret information at client side. + + + + + + + + + +.. _tutorial-request: + +Request Data +============================================================================== + +Bottle provides access to HTTP-related metadata such as cookies, headers and POST form data through a global ``request`` object. This object always contains information about the *current* request, as long as it is accessed from within a callback function. This works even in multi-threaded environments where multiple requests are handled at the same time. For details on how a global object can be thread-safe, see :doc:`contextlocal`. + +.. note:: + + Bottle stores most of the parsed HTTP metadata in :class:`FormsDict` instances. These behave like normal dictionaries, but have some additional features: All values in the dictionary are available as attributes. These virtual attributes always return a unicode string, even if the value is missing. In that case, the string is empty. + + :class:`FormsDict` is a subclass of :class:`MultiDict` and can store more than one value per key. The standard dictionary access methods will only return a single value, but the :meth:`MultiDict.getall` method returns a (possibly empty) list of all values for a specific key. + +The full API and feature list is described in the API section (see :class:`Request`), but the most common use cases and features are covered here, too. + + +Cookies +-------------------------------------------------------------------------------- + +Cookies are stored in :attr:`BaseRequest.cookies` as a :class:`FormsDict`. The :meth:`BaseRequest.get_cookie` method allows access to :ref:`signed cookies ` as described in a separate section. This example shows a simple cookie-based view counter:: + + from bottle import route, request, response + @route('/counter') + def counter(): + count = int( request.cookies.get('counter', '0') ) + count += 1 + response.set_cookie('counter', str(count)) + return 'You visited this page %d times' % count + + +HTTP Headers +-------------------------------------------------------------------------------- + +All HTTP headers sent by the client (e.g. ``Referer``, ``Agent`` or ``Accept-Language``) are stored in a :class:`WSGIHeaderDict` and accessible through :attr:`BaseRequest.headers`. A :class:`WSGIHeaderDict` is basically a dictionary with case-insensitive keys:: + + from bottle import route, request + @route('/is_ajax') + def is_ajax(): + if request.headers.get('X-Requested-With') == 'XMLHttpRequest': + return 'This is an AJAX request' + else: + return 'This is a normal request' + + +Query Variables +-------------------------------------------------------------------------------- + +The query string (as in ``/forum?id=1&page=5``) is commonly used to transmit a small number of key/value pairs to the server. You can use the :attr:`BaseRequest.query` (a :class:`FormsDict`) to access these values and the :attr:`BaseRequest.query_string` attribute to get the whole string. + +:: + + from bottle import route, request, response + @route('/forum') + def display_forum(): + forum_id = request.query.id + page = request.query.page or '1' + return 'Forum ID: %s (page %s)' % (forum_id, page) + + +POST Form Data and File Uploads +------------------------------- + +The request body of ``POST`` and ``PUT`` requests may contain form data encoded in various formats. The :attr:`BaseRequest.forms` dictionary contains parsed textual form fields, :attr:`BaseRequest.files` stores file uploads and :attr:`BaseRequest.POST` combines both dictionaries into one. All three are :class:`FormsDict` instances and are created on demand. File uploads are saved as special :class:`cgi.FieldStorage` objects along with some metadata. Finally, you can access the raw body data as a file-like object via :attr:`BaseRequest.body`. + +Here is an example for a simple file upload form: + +.. code-block:: html + +
+ + +
+ +:: + + from bottle import route, request + @route('/upload', method='POST') + def do_upload(): + name = request.forms.name + data = request.files.data + if name and data and data.file: + raw = data.file.read() # This is dangerous for big files + filename = data.filename + return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) + return "You missed a field." + + +Unicode issues +----------------------- + +In **Python 2** all keys and values are byte-strings. If you need unicode, you can call :meth:`FormsDict.getunicode` or fetch values via attribute access. Both methods try to decode the string (default: utf8) and return an empty string if that fails. No need to catch :exc:`UnicodeError`:: + + >>> request.query['city'] + 'G\xc3\xb6ttingen' # A utf8 byte string + >>> request.query.city + u'Göttingen' # The same string as unicode + +In **Python 3** all strings are unicode, but HTTP is a byte-based wire protocol. The server has to decode the byte strings somehow before they are passed to the application. To be on the safe side, WSGI suggests ISO-8859-1 (aka latin1), a reversible single-byte codec that can be re-encoded with a different encoding later. Bottle does that for :meth:`FormsDict.getunicode` and attribute access, but not for the dict-access methods. These return the unchanged values as provided by the server implementation, which is probably not what you want. + + >>> request.query['city'] + 'Göttingen' # An utf8 string provisionally decoded as ISO-8859-1 by the server + >>> request.query.city + 'Göttingen' # The same string correctly re-encoded as utf8 by bottle + +If you need the whole dictionary with correctly decoded values (e.g. for WTForms), you can call :meth:`FormsDict.decode` to get a re-encoded copy. + + +WSGI Environment +-------------------------------------------------------------------------------- + +Each :class:`BaseRequest` instance wraps a WSGI environment dictionary. The original is stored in :attr:`BaseRequest.environ`, but the request object itself behaves like a dictionary, too. Most of the interesting data is exposed through special methods or attributes, but if you want to access `WSGI environ variables `_ directly, you can do so:: + + @route('/my_ip') + def show_ip(): + ip = request.environ.get('REMOTE_ADDR') + # or ip = request.get('REMOTE_ADDR') + # or ip = request['REMOTE_ADDR'] + return "Your IP is: %s" % ip + + + + + + + +.. _tutorial-templates: + +Templates +================================================================================ + +Bottle comes with a fast and powerful built-in template engine called :doc:`stpl`. To render a template you can use the :func:`template` function or the :func:`view` decorator. All you have to do is to provide the name of the template and the variables you want to pass to the template as keyword arguments. Here’s a simple example of how to render a template:: + + @route('/hello') + @route('/hello/') + def hello(name='World'): + return template('hello_template', name=name) + +This will load the template file ``hello_template.tpl`` and render it with the ``name`` variable set. Bottle will look for templates in the ``./views/`` folder or any folder specified in the ``bottle.TEMPLATE_PATH`` list. + +The :func:`view` decorator allows you to return a dictionary with the template variables instead of calling :func:`template`:: + + @route('/hello') + @route('/hello/') + @view('hello_template') + def hello(name='World'): + return dict(name=name) + +.. rubric:: Syntax + +.. highlight:: html+django + +The template syntax is a very thin layer around the Python language. Its main purpose is to ensure correct indentation of blocks, so you can format your template without worrying about indentation. Follow the link for a full syntax description: :doc:`stpl` + +Here is an example template:: + + %if name == 'World': +

Hello {{name}}!

+

This is a test.

+ %else: +

Hello {{name.title()}}!

+

How are you?

+ %end + +.. rubric:: Caching + +Templates are cached in memory after compilation. Modifications made to the template files will have no affect until you clear the template cache. Call ``bottle.TEMPLATES.clear()`` to do so. Caching is disabled in debug mode. + +.. highlight:: python + + + + +.. _plugins: + +Plugins +================================================================================ + +.. versionadded:: 0.9 + +Bottle's core features cover most common use-cases, but as a micro-framework it has its limits. This is where "Plugins" come into play. Plugins add missing functionality to the framework, integrate third party libraries, or just automate some repetitive work. + +We have a growing :doc:`/plugins/index` and most plugins are designed to be portable and re-usable across applications. The chances are high that your problem has already been solved and a ready-to-use plugin exists. If not, the :doc:`/plugindev` may help you. + +The effects and APIs of plugins are manifold and depend on the specific plugin. The ``SQLitePlugin`` plugin for example detects callbacks that require a ``db`` keyword argument and creates a fresh database connection object every time the callback is called. This makes it very convenient to use a database:: + + from bottle import route, install, template + from bottle_sqlite import SQLitePlugin + + install(SQLitePlugin(dbfile='/tmp/test.db')) + + @route('/show/') + def show(db, post_id): + c = db.execute('SELECT title, content FROM posts WHERE id = ?', (post_id,)) + row = c.fetchone() + return template('show_post', title=row['title'], text=row['content']) + + @route('/contact') + def contact_page(): + ''' This callback does not need a db connection. Because the 'db' + keyword argument is missing, the sqlite plugin ignores this callback + completely. ''' + return template('contact') + +Other plugin may populate the thread-safe :data:`local` object, change details of the :data:`request` object, filter the data returned by the callback or bypass the callback completely. An "auth" plugin for example could check for a valid session and return a login page instead of calling the original callback. What happens exactly depends on the plugin. + + +Application-wide Installation +-------------------------------------------------------------------------------- + +Plugins can be installed application-wide or just to some specific routes that need additional functionality. Most plugins can safely be installed to all routes and are smart enough to not add overhead to callbacks that do not need their functionality. + +Let us take the ``SQLitePlugin`` plugin for example. It only affects route callbacks that need a database connection. Other routes are left alone. Because of this, we can install the plugin application-wide with no additional overhead. + +To install a plugin, just call :func:`install` with the plugin as first argument:: + + from bottle_sqlite import SQLitePlugin + install(SQLitePlugin(dbfile='/tmp/test.db')) + +The plugin is not applied to the route callbacks yet. This is delayed to make sure no routes are missed. You can install plugins first and add routes later, if you want to. The order of installed plugins is significant, though. If a plugin requires a database connection, you need to install the database plugin first. + + +.. rubric:: Uninstall Plugins + +You can use a name, class or instance to :func:`uninstall` a previously installed plugin:: + + sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db') + install(sqlite_plugin) + + uninstall(sqlite_plugin) # uninstall a specific plugin + uninstall(SQLitePlugin) # uninstall all plugins of that type + uninstall('sqlite') # uninstall all plugins with that name + uninstall(True) # uninstall all plugins at once + +Plugins can be installed and removed at any time, even at runtime while serving requests. This enables some neat tricks (installing slow debugging or profiling plugins only when needed) but should not be overused. Each time the list of plugins changes, the route cache is flushed and all plugins are re-applied. + +.. note:: + The module-level :func:`install` and :func:`uninstall` functions affect the :ref:`default-app`. To manage plugins for a specific application, use the corresponding methods on the :class:`Bottle` application object. + + +Route-specific Installation +-------------------------------------------------------------------------------- + +The ``apply`` parameter of the :func:`route` decorator comes in handy if you want to install plugins to only a small number of routes:: + + sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db') + + @route('/create', apply=[sqlite_plugin]) + def create(db): + db.execute('INSERT INTO ...') + + +Blacklisting Plugins +-------------------------------------------------------------------------------- + +You may want to explicitly disable a plugin for a number of routes. The :func:`route` decorator has a ``skip`` parameter for this purpose:: + + sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db') + install(sqlite_plugin) + + @route('/open/', skip=[sqlite_plugin]) + def open_db(db): + # The 'db' keyword argument is not touched by the plugin this time. + if db in ('test', 'test2'): + # The plugin handle can be used for runtime configuration, too. + sqlite_plugin.dbfile = '/tmp/%s.db' % db + return "Database File switched to: /tmp/%s.db" % db + abort(404, "No such database.") + +The ``skip`` parameter accepts a single value or a list of values. You can use a name, class or instance to identify the plugin that is to be skipped. Set ``skip=True`` to skip all plugins at once. + +Plugins and Sub-Applications +-------------------------------------------------------------------------------- + +Most plugins are specific to the application they were installed to. Consequently, they should not affect sub-applications mounted with :meth:`Bottle.mount`. Here is an example:: + + root = Bottle() + root.mount('/blog', apps.blog) + + @root.route('/contact', template='contact') + def contact(): + return {'email': 'contact@example.com'} + + root.install(plugins.WTForms()) + +Whenever you mount an application, Bottle creates a proxy-route on the main-application that forwards all requests to the sub-application. Plugins are disabled for this kind of proxy-route by default. As a result, our (fictional) `WTForms` plugin affects the ``/contact`` route, but does not affect the routes of the ``/blog`` sub-application. + +This behavior is intended as a sane default, but can be overridden. The following example re-activates all plugins for a specific proxy-route:: + + root.mount('/blog', apps.blog, skip=None) + +But there is a snag: The plugin sees the whole sub-application as a single route, namely the proxy-route mentioned above. In order to affect each individual route of the sub-application, you have to install the plugin to the mounted application explicitly. + + + +Development +================================================================================ + +So you have learned the basics and want to write your own application? Here are +some tips that might help you to be more productive. + +.. _default-app: + +Default Application +-------------------------------------------------------------------------------- + +Bottle maintains a global stack of :class:`Bottle` instances and uses the top of the stack as a default for some of the module-level functions and decorators. The :func:`route` decorator, for example, is a shortcut for calling :meth:`Bottle.route` on the default application:: + + @route('/') + def hello(): + return 'Hello World' + +This is very convenient for small applications and saves you some typing, but also means that, as soon as your module is imported, routes are installed to the global application. To avoid this kind of import side-effects, Bottle offers a second, more explicit way to build applications:: + + app = Bottle() + + @app.route('/') + def hello(): + return 'Hello World' + +Separating the application object improves re-usability a lot, too. Other developers can safely import the ``app`` object from your module and use :meth:`Bottle.mount` to merge applications together. + +As an alternative, you can make use of the application stack to isolate your routes while still using the convenient shortcuts:: + + default_app.push() + + @route('/') + def hello(): + return 'Hello World' + + app = default_app.pop() + +Both :func:`app` and :func:`default_app` are instance of :class:`AppStack` and implement a stack-like API. You can push and pop applications from and to the stack as needed. This also helps if you want to import a third party module that does not offer a separate application object:: + + default_app.push() + + import some.module + + app = default_app.pop() + + +.. _tutorial-debugging: + + +Debug Mode +-------------------------------------------------------------------------------- + +During early development, the debug mode can be very helpful. + +.. highlight:: python + +:: + + bottle.debug(True) + +In this mode, Bottle is much more verbose and provides helpful debugging information whenever an error occurs. It also disables some optimisations that might get in your way and adds some checks that warn you about possible misconfiguration. + +Here is an incomplete list of things that change in debug mode: + +* The default error page shows a traceback. +* Templates are not cached. +* Plugins are applied immediately. + +Just make sure not to use the debug mode on a production server. + +Auto Reloading +-------------------------------------------------------------------------------- + +During development, you have to restart the server a lot to test your +recent changes. The auto reloader can do this for you. Every time you +edit a module file, the reloader restarts the server process and loads +the newest version of your code. + +:: + + from bottle import run + run(reloader=True) + +How it works: the main process will not start a server, but spawn a new +child process using the same command line arguments used to start the +main process. All module-level code is executed at least twice! Be +careful. + +The child process will have ``os.environ['BOTTLE_CHILD']`` set to ``True`` +and start as a normal non-reloading app server. As soon as any of the +loaded modules changes, the child process is terminated and re-spawned by +the main process. Changes in template files will not trigger a reload. +Please use debug mode to deactivate template caching. + +The reloading depends on the ability to stop the child process. If you are +running on Windows or any other operating system not supporting +``signal.SIGINT`` (which raises ``KeyboardInterrupt`` in Python), +``signal.SIGTERM`` is used to kill the child. Note that exit handlers and +finally clauses, etc., are not executed after a ``SIGTERM``. + + +Command Line Interface +-------------------------------------------------------------------------------- + +.. versionadded: 0.10 + +Starting with version 0.10 you can use bottle as a command-line tool: + +.. code-block:: console + + $ python -m bottle + + Usage: bottle.py [options] package.module:app + + Options: + -h, --help show this help message and exit + --version show version number. + -b ADDRESS, --bind=ADDRESS + bind socket to ADDRESS. + -s SERVER, --server=SERVER + use SERVER as backend. + -p PLUGIN, --plugin=PLUGIN + install additional plugin/s. + --debug start server in debug mode. + --reload auto-reload on file changes. + +The `ADDRESS` field takes an IP address or an IP:PORT pair and defaults to ``localhost:8080``. The other parameters should be self-explanatory. + +Both plugins and applications are specified via import expressions. These consist of an import path (e.g. ``package.module``) and an expression to be evaluated in the namespace of that module, separated by a colon. See :func:`load` for details. Here are some examples: + +.. code-block:: console + + # Grab the 'app' object from the 'myapp.controller' module and + # start a paste server on port 80 on all interfaces. + python -m bottle -server paste -bind 0.0.0.0:80 myapp.controller:app + + # Start a self-reloading development server and serve the global + # default application. The routes are defined in 'test.py' + python -m bottle --debug --reload test + + # Install a custom debug plugin with some parameters + python -m bottle --debug --reload --plugin 'utils:DebugPlugin(exc=True)'' test + + # Serve an application that is created with 'myapp.controller.make_app()' + # on demand. + python -m bottle 'myapp.controller:make_app()'' + + +Deployment +================================================================================ + +Bottle runs on the built-in `wsgiref WSGIServer `_ by default. This non-threading HTTP server is perfectly fine for development and early production, but may become a performance bottleneck when server load increases. + +The easiest way to increase performance is to install a multi-threaded server library like paste_ or cherrypy_ and tell Bottle to use that instead of the single-threaded server:: + + bottle.run(server='paste') + +This, and many other deployment options are described in a separate article: :doc:`deployment` + + + + +.. _tutorial-glossary: + +Glossary +======== + +.. glossary:: + + callback + Programmer code that is to be called when some external action happens. + In the context of web frameworks, the mapping between URL paths and + application code is often achieved by specifying a callback function + for each URL. + + decorator + A function returning another function, usually applied as a function transformation using the ``@decorator`` syntax. See `python documentation for function definition `_ for more about decorators. + + environ + A structure where information about all documents under the root is + saved, and used for cross-referencing. The environment is pickled + after the parsing stage, so that successive runs only need to read + and parse new and changed documents. + + handler function + A function to handle some specific event or situation. In a web + framework, the application is developed by attaching a handler function + as callback for each specific URL comprising the application. + + source directory + The directory which, including its subdirectories, contains all + source files for one Sphinx project. + diff --git a/html/_sources/tutorial_app.txt b/html/_sources/tutorial_app.txt new file mode 100644 index 0000000..0b41ee0 --- /dev/null +++ b/html/_sources/tutorial_app.txt @@ -0,0 +1,711 @@ +.. _Bottle: http://bottle.paws.org +.. _Python: http://www.python.org +.. _SQLite: http://www.sqlite.org +.. _Windows: http://www.sqlite.org/download.html +.. _PySQLite: http://pypi.python.org/pypi/pysqlite/ +.. _`decorator statement`: http://docs.python.org/glossary.html#term-decorator +.. _`Python DB API`: http://www.python.org/dev/peps/pep-0249/ +.. _`WSGI reference Server`: http://docs.python.org/library/wsgiref.html#module-wsgiref.simple_server +.. _Cherrypy: http://www.cherrypy.org/ +.. _Fapws3: http://github.com/william-os4y/fapws3 +.. _Flup: http://trac.saddi.com/flup +.. _Paste: http://pythonpaste.org/ +.. _Apache: http://www.apache.org +.. _`Bottle documentation`: http://bottlepy.org/docs/dev/tutorial.html +.. _`mod_wsgi`: http://code.google.com/p/modwsgi/ +.. _`json`: http://www.json.org + +=============================== +Tutorial: Todo-List Application +=============================== + +.. note:: + + This tutorial is a work in progess and written by `noisefloor `_. + + +This tutorial should give a brief introduction to the Bottle_ WSGI Framework. The main goal is to be able, after reading through this tutorial, to create a project using Bottle. Within this document, not all abilities will be shown, but at least the main and important ones like routing, utilizing the Bottle template abilities to format output and handling GET / POST parameters. + +To understand the content here, it is not necessary to have a basic knowledge of WSGI, as Bottle tries to keep WSGI away from the user anyway. You should have a fair understanding of the Python_ programming language. Furthermore, the example used in the tutorial retrieves and stores data in a SQL databse, so a basic idea about SQL helps, but is not a must to understand the concepts of Bottle. Right here, SQLite_ is used. The output of Bottle sent to the browser is formatted in some examples by the help of HTML. Thus, a basic idea about the common HTML tags does help as well. + +For the sake of introducing Bottle, the Python code "in between" is kept short, in order to keep the focus. Also all code within the tutorial is working fine, but you may not necessarily use it "in the wild", e.g. on a public web server. In order to do so, you may add e.g. more error handling, protect the database with a password, test and escape the input etc. + +.. contents:: Table of Contents + +Goals +=========== + +At the end of this tutorial, we will have a simple, web-based ToDo list. The list contains a text (with max 100 characters) and a status (0 for closed, 1 for open) for each item. Through the web-based user interface, open items can be view and edited and new items can be added. + +During development, all pages will be available on ``localhost`` only, but later on it will be shown how to adapt the application for a "real" server, including how to use with Apache's mod_wsgi. + +Bottle will do the routing and format the output, with the help of templates. The items of the list will be stored inside a SQLite database. Reading and writing the database will be done by Python code. + +We will end up with an application with the following pages and functionality: + + * start page ``http://localhost:8080/todo`` + * adding new items to the list: ``http://localhost:8080/new`` + * page for editing items: ``http://localhost:8080/edit/:no`` + * validating data assigned by dynamic routes with the @validate decorator + * catching errors + +Before We Start... +==================== + + +.. rubric:: Install Bottle + +Assuming that you have a fairly new installation of Python (version 2.5 or higher), you only need to install Bottle in addition to that. Bottle has no other dependencies than Python itself. + +You can either manually install Bottle or use Python's easy_install: ``easy_install bottle`` + + +.. rubric:: Further Software Necessities + +As we use SQLite3 as a database, make sure it is installed. On Linux systems, most distributions have SQLite3 installed by default. SQLite is available for Windows and MacOS X as well and the `sqlite3` module is part of the python standard library. + +.. rubric:: Create An SQL Database + +First, we need to create the database we use later on. To do so, save the following script in your project directory and run it with python. You can use the interactive interpreter too:: + + import sqlite3 + con = sqlite3.connect('todo.db') # Warning: This file is created in the current directory + con.execute("CREATE TABLE todo (id INTEGER PRIMARY KEY, task char(100) NOT NULL, status bool NOT NULL)") + con.execute("INSERT INTO todo (task,status) VALUES ('Read A-byte-of-python to get a good introduction into Python',0)") + con.execute("INSERT INTO todo (task,status) VALUES ('Visit the Python website',1)") + con.execute("INSERT INTO todo (task,status) VALUES ('Test various editors for and check the syntax highlighting',1)") + con.execute("INSERT INTO todo (task,status) VALUES ('Choose your favorite WSGI-Framework',0)") + con.commit() + +This generates a database-file `todo.db` with tables called ``todo`` and three columns ``id``, ``task``, and ``status``. ``id`` is a unique id for each row, which is used later on to reference the rows. The column ``task`` holds the text which describes the task, it can be max 100 characters long. Finally, the column ``status`` is used to mark a task as open (value 1) or closed (value 0). + +Using Bottle for a Web-Based ToDo List +================================================ + +Now it is time to introduce Bottle in order to create a web-based application. But first, we need to look into a basic concept of Bottle: routes. + + +.. rubric:: Understanding routes + +Basically, each page visible in the browser is dynamically generated when the page address is called. Thus, there is no static content. That is exactly what is called a "route" within Bottle: a certain address on the server. So, for example, when the page ``http://localhost:8080/todo`` is called from the browser, Bottle "grabs" the call and checks if there is any (Python) function defined for the route "todo". If so, Bottle will execute the corresponding Python code and return its result. + + +.. rubric:: First Step - Showing All Open Items + +So, after understanding the concept of routes, let's create the first one. The goal is to see all open items from the ToDo list:: + + import sqlite3 + from bottle import route, run + + @route('/todo') + def todo_list(): + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT id, task FROM todo WHERE status LIKE '1'") + result = c.fetchall() + return str(result) + + run() + +Save the code a ``todo.py``, preferably in the same directory as the file ``todo.db``. Otherwise, you need to add the path to ``todo.db`` in the ``sqlite3.connect()`` statement. + +Let's have a look what we just did: We imported the necessary module ``sqlite3`` to access to SQLite database and from Bottle we imported ``route`` and ``run``. The ``run()`` statement simply starts the web server included in Bottle. By default, the web server serves the pages on localhost and port 8080. Furthermore, we imported ``route``, which is the function responsible for Bottle's routing. As you can see, we defined one function, ``todo_list()``, with a few lines of code reading from the database. The important point is the `decorator statement`_ ``@route('/todo')`` right before the ``def todo_list()`` statement. By doing this, we bind this function to the route ``/todo``, so every time the browsers calls ``http://localhost:8080/todo``, Bottle returns the result of the function ``todo_list()``. That is how routing within bottle works. + +Actually you can bind more than one route to a function. So the following code:: + + @route('/todo') + @route('/my_todo_list') + def todo_list(): + ... + +will work fine, too. What will not work is to bind one route to more than one function. + +What you will see in the browser is what is returned, thus the value given by the ``return`` statement. In this example, we need to convert ``result`` in to a string by ``str()``, as Bottle expects a string or a list of strings from the return statement. But here, the result of the database query is a list of tuples, which is the standard defined by the `Python DB API`_. + +Now, after understanding the little script above, it is time to execute it and watch the result yourself. Remember that on Linux- / Unix-based systems the file ``todo.py`` needs to be executable first. Then, just run ``python todo.py`` and call the page ``http://localhost:8080/todo`` in your browser. In case you made no mistake writing the script, the output should look like this:: + + [(2, u'Visit the Python website'), (3, u'Test various editors for and check the syntax highlighting')] + +If so - congratulations! You are now a successful user of Bottle. In case it did not work and you need to make some changes to the script, remember to stop Bottle serving the page, otherwise the revised version will not be loaded. + +Actually, the output is not really exciting nor nice to read. It is the raw result returned from the SQL query. + +So, in the next step we format the output in a nicer way. But before we do that, we make our life easier. + + +.. rubric:: Debugging and Auto-Reload + +Maybe you already noticed that Bottle sends a short error message to the browser in case something within the script is wrong, e.g. the connection to the database is not working. For debugging purposes it is quite helpful to get more details. This can be easily achieved by adding the following statement to the script:: + + from bottle import run, route, debug + ... + #add this at the very end: + debug(True) + run() + +By enabling "debug", you will get a full stacktrace of the Python interpreter, which usually contains useful information for finding bugs. Furthermore, templates (see below) are not cached, thus changes to templates will take effect without stopping the server. + +.. warning:: + + That ``debug(True)`` is supposed to be used for development only, it should *not* be used in production environments. + + + +A further quiet nice feature is auto-reloading, which is enabled by modifying the ``run()`` statement to + +:: + + run(reloader=True) + +This will automatically detect changes to the script and reload the new version once it is called again, without the need to stop and start the server. + +Again, the feature is mainly supposed to be used while development, not on productive systems. + + +.. rubric:: Bottle Template To Format The Output + +Now let's have a look at casting the output of the script into a proper format. + +Actually Bottle expects to receive a string or a list of strings from a function and returns them by the help of the built-in server to the browser. Bottle does not bother about the content of the string itself, so it can be text formatted with HTML markup, too. + +Bottle brings its own easy-to-use template engine with it. Templates are stored as separate files having a ``.tpl`` extension. The template can be called then from within a function. Templates can contain any type of text (which will be most likely HTML-markup mixed with Python statements). Furthermore, templates can take arguments, e.g. the result set of a database query, which will be then formatted nicely within the template. + +Right here, we are going to cast the result of our query showing the open ToDo items into a simple table with two columns: the first column will contain the ID of the item, the second column the text. The result set is, as seen above, a list of tuples, each tuple contains one set of results. + +To include the template in our example, just add the following lines:: + + from bottle import route, run, debug, template + ... + result = c.fetchall() + c.close() + output = template('make_table', rows=result) + return output + ... + +So we do here two things: first, we import ``template`` from Bottle in order to be able to use templates. Second, we assign the output of the template ``make_table`` to the variable ``output``, which is then returned. In addition to calling the template, we assign ``result``, which we received from the database query, to the variable ``rows``, which is later on used within the template. If necessary, you can assign more than one variable / value to a template. + +Templates always return a list of strings, thus there is no need to convert anything. Of course, we can save one line of code by writing ``return template('make_table', rows=result)``, which gives exactly the same result as above. + +Now it is time to write the corresponding template, which looks like this:: + + %#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...) +

The open items are as follows:

+ + %for row in rows: + + %for col in row: + + %end + + %end +
{{col}}
+ +Save the code as ``make_table.tpl`` in the same directory where ``todo.py`` is stored. + +Let's have a look at the code: every line starting with % is interpreted as Python code. Please note that, of course, only valid Python statements are allowed, otherwise the template will raise an exception, just as any other Python code. The other lines are plain HTML markup. + +As you can see, we use Python's ``for`` statement two times, in order to go through ``rows``. As seen above, ``rows`` is a variable which holds the result of the database query, so it is a list of tuples. The first ``for`` statement accesses the tuples within the list, the second one the items within the tuple, which are put each into a cell of the table. It is important that you close all ``for``, ``if``, ``while`` etc. statements with ``%end``, otherwise the output may not be what you expect. + +If you need to access a variable within a non-Python code line inside the template, you need to put it into double curly braces. This tells the template to insert the actual value of the variable right in place. + +Run the script again and look at the output. Still not really nice, but at least more readable than the list of tuples. Of course, you can spice-up the very simple HTML markup above, e.g. by using in-line styles to get a better looking output. + + +.. rubric:: Using GET and POST Values + +As we can review all open items properly, we move to the next step, which is adding new items to the ToDo list. The new item should be received from a regular HTML-based form, which sends its data by the GET method. + +To do so, we first add a new route to our script and tell the route that it should get GET data:: + + from bottle import route, run, debug, template, request + ... + return template('make_table', rows=result) + ... + + @route('/new', method='GET') + def new_item(): + + new = request.GET.get('task', '').strip() + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + + c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1)) + new_id = c.lastrowid + + conn.commit() + c.close() + + return '

The new task was inserted into the database, the ID is %s

' % new_id + +To access GET (or POST) data, we need to import ``request`` from Bottle. To assign the actual data to a variable, we use the statement ``request.GET.get('task','').strip()`` statement, where ``task`` is the name of the GET data we want to access. That's all. If your GET data has more than one variable, multiple ``request.GET.get()`` statements can be used and assigned to other variables. + +The rest of this piece of code is just processing of the gained data: writing to the database, retrieve the corresponding id from the database and generate the output. + +But where do we get the GET data from? Well, we can use a static HTML page holding the form. Or, what we do right now, is to use a template which is output when the route ``/new`` is called without GET data. + +The code needs to be extended to:: + + ... + @route('/new', method='GET') + def new_item(): + + if request.GET.get('save','').strip(): + + new = request.GET.get('task', '').strip() + conn = sqlite3.connect('todo.db') + c = conn.cursor() + + c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1)) + new_id = c.lastrowid + + conn.commit() + c.close() + + return '

The new task was inserted into the database, the ID is %s

' % new_id + else: + return template('new_task.tpl') + + +``new_task.tpl`` looks like this:: + +

Add a new task to the ToDo list:

+
+ + +
+ +That's all. As you can see, the template is plain HTML this time. + +Now we are able to extend our to do list. + +By the way, if you prefer to use POST data: this works exactly the same way, just use ``request.POST.get()`` instead. + + +.. rubric:: Editing Existing Items + +The last point to do is to enable editing of existing items. + +By using only the routes we know so far it is possible, but may be quite tricky. But Bottle knows something called "dynamic routes", which makes this task quite easy. + +The basic statement for a dynamic route looks like this:: + + @route('/myroute/:something') + +The key point here is the colon. This tells Bottle to accept for ``:something`` any string up to the next slash. Furthermore, the value of ``something`` will be passed to the function assigned to that route, so the data can be processed within the function. + +For our ToDo list, we will create a route ``@route('/edit/:no)``, where ``no`` is the id of the item to edit. + +The code looks like this:: + + @route('/edit/:no', method='GET') + def edit_item(no): + + if request.GET.get('save','').strip(): + edit = request.GET.get('task','').strip() + status = request.GET.get('status','').strip() + + if status == 'open': + status = 1 + else: + status = 0 + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("UPDATE todo SET task = ?, status = ? WHERE id LIKE ?", (edit, status, no)) + conn.commit() + + return '

The item number %s was successfully updated

' % no + else: + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (str(no))) + cur_data = c.fetchone() + + return template('edit_task', old=cur_data, no=no) + +It is basically pretty much the same what we already did above when adding new items, like using ``GET`` data etc. The main addition here is using the dynamic route ``:no``, which here passes the number to the corresponding function. As you can see, ``no`` is used within the function to access the right row of data within the database. + +The template ``edit_task.tpl`` called within the function looks like this:: + + %#template for editing a task + %#the template expects to receive a value for "no" as well a "old", the text of the selected ToDo item +

Edit the task with ID = {{no}}

+
+ + +
+ +
+ +Again, this template is a mix of Python statements and HTML, as already explained above. + +A last word on dynamic routes: you can even use a regular expression for a dynamic route, as demonstrated later. + + +.. rubric:: Validating Dynamic Routes + +Using dynamic routes is fine, but for many cases it makes sense to validate the dynamic part of the route. For example, we expect an integer number in our route for editing above. But if a float, characters or so are received, the Python interpreter throws an exception, which is not what we want. + +For those cases, Bottle offers the ``@validate`` decorator, which validates the "input" prior to passing it to the function. In order to apply the validator, extend the code as follows:: + + from bottle import route, run, debug, template, request, validate + ... + @route('/edit/:no', method='GET') + @validate(no=int) + def edit_item(no): + ... + +At first, we imported ``validate`` from the Bottle framework, than we apply the @validate-decorator. Right here, we validate if ``no`` is an integer. Basically, the validation works with all types of data like floats, lists etc. + +Save the code and call the page again using a "403 forbidden" value for ``:no``, e.g. a float. You will receive not an exception, but a "403 - Forbidden" error, saying that an integer was expected. + +.. rubric:: Dynamic Routes Using Regular Expressions + +Bottle can also handle dynamic routes, where the "dynamic part" of the route can be a regular expression. + +So, just to demonstrate that, let's assume that all single items in our ToDo list should be accessible by their plain number, by a term like e.g. "item1". For obvious reasons, you do not want to create a route for every item. Furthermore, the simple dynamic routes do not work either, as part of the route, the term "item" is static. + +As said above, the solution is a regular expression:: + + @route('/item:item#[1-9]+#') + def show_item(item): + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (item)) + result = c.fetchall() + c.close() + if not result: + return 'This item number does not exist!' + else: + return 'Task: %s' %result[0] + +Of course, this example is somehow artificially constructed - it would be easier to use a plain dynamic route only combined with a validation. Nevertheless, we want to see how regular expression routes work: the line ``@route(/item:item_#[1-9]+#)`` starts like a normal route, but the part surrounded by # is interpreted as a regular expression, which is the dynamic part of the route. So in this case, we want to match any digit between 0 and 9. The following function "show_item" just checks whether the given item is present in the database or not. In case it is present, the corresponding text of the task is returned. As you can see, only the regular expression part of the route is passed forward. Furthermore, it is always forwarded as a string, even if it is a plain integer number, like in this case. + + +.. rubric:: Returning Static Files + +Sometimes it may become necessary to associate a route not to a Python function, but just return a static file. So if you have for example a help page for your application, you may want to return this page as plain HTML. This works as follows:: + + from bottle import route, run, debug, template, request, validate, static_file + + @route('/help') + def help(): + return static_file('help.html', root='/path/to/file') + +At first, we need to import the ``static_file`` function from Bottle. As you can see, the ``return static_file`` statement replaces the ``return`` statement. It takes at least two arguments: the name of the file to be returned and the path to the file. Even if the file is in the same directory as your application, the path needs to be stated. But in this case, you can use ``'.'`` as a path, too. Bottle guesses the MIME-type of the file automatically, but in case you like to state it explicitly, add a third argument to ``static_file``, which would be here ``mimetype='text/html'``. ``static_file`` works with any type of route, including the dynamic ones. + + +.. rubric:: Returning JSON Data + +There may be cases where you do not want your application to generate the output directly, but return data to be processed further on, e.g. by JavaScript. For those cases, Bottle offers the possibility to return JSON objects, which is sort of standard for exchanging data between web applications. Furthermore, JSON can be processed by many programming languages, including Python + +So, let's assume we want to return the data generated in the regular expression route example as a JSON object. The code looks like this:: + + @route('/json:json#[1-9]+#') + def show_json(json): + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (json)) + result = c.fetchall() + c.close() + + if not result: + return {'task':'This item number does not exist!'} + else: + return {'Task': result[0]} + +As you can, that is fairly simple: just return a regular Python dictionary and Bottle will convert it automatically into a JSON object prior to sending. So if you e.g. call "http://localhost/json1" Bottle should in this case return the JSON object ``{"Task": ["Read A-byte-of-python to get a good introduction into Python"]}``. + + + +.. rubric:: Catching Errors + +The next step may is to catch the error with Bottle itself, to keep away any type of error message from the user of your application. To do that, Bottle has an "error-route", which can be a assigned to a HTML-error. + +In our case, we want to catch a 403 error. The code is as follows:: + + from bottle import error + + @error(403) + def mistake(code): + return 'The parameter you passed has the wrong format!' + +So, at first we need to import ``error`` from Bottle and define a route by ``error(403)``, which catches all "403 forbidden" errors. The function "mistake" is assigned to that. Please note that ``error()`` always passes the error-code to the function - even if you do not need it. Thus, the function always needs to accept one argument, otherwise it will not work. + +Again, you can assign more than one error-route to a function, or catch various errors with one function each. So this code:: + + @error(404) + @error(403) + def mistake(code): + return 'There is something wrong!' + +works fine, the following one as well:: + + @error(403) + def mistake403(code): + return 'The parameter you passed has the wrong format!' + + @error(404) + def mistake404(code): + return 'Sorry, this page does not exist!' + + +.. rubric:: Summary + +After going through all the sections above, you should have a brief understanding how the Bottle WSGI framework works. Furthermore you have all the knowledge necessary to use Bottle for your applications. + +The following chapter give a short introduction how to adapt Bottle for larger projects. Furthermore, we will show how to operate Bottle with web servers which perform better on a higher load / more web traffic than the one we used so far. + +Server Setup +================================ + +So far, we used the standard server used by Bottle, which is the `WSGI reference Server`_ shipped along with Python. Although this server is perfectly suitable for development purposes, it is not really suitable for larger applications. But before we have a look at the alternatives, let's have a look how to tweak the settings of the standard server first. + + +.. rubric:: Running Bottle on a different port and IP + +As standard, Bottle serves the pages on the IP adress 127.0.0.1, also known as ``localhost``, and on port ``8080``. To modify the setting is pretty simple, as additional parameters can be passed to Bottle's ``run()`` function to change the port and the address. + +To change the port, just add ``port=portnumber`` to the run command. So, for example:: + + run(port=80) + +would make Bottle listen to port 80. + +To change the IP address where Bottle is listening:: + + run(host='123.45.67.89') + +Of course, both parameters can be combined, like:: + + run(port=80, host='123.45.67.89') + +The ``port`` and ``host`` parameter can also be applied when Bottle is running with a different server, as shown in the following section. + + +.. rubric:: Running Bottle with a different server + +As said above, the standard server is perfectly suitable for development, personal use or a small group of people only using your application based on Bottle. For larger tasks, the standard server may become a bottleneck, as it is single-threaded, thus it can only serve one request at a time. + +But Bottle has already various adapters to multi-threaded servers on board, which perform better on higher load. Bottle supports Cherrypy_, Fapws3_, Flup_ and Paste_. + +If you want to run for example Bottle with the Paste server, use the following code:: + + from bottle import PasteServer + ... + run(server=PasteServer) + +This works exactly the same way with ``FlupServer``, ``CherryPyServer`` and ``FapwsServer``. + + +.. rubric:: Running Bottle on Apache with mod_wsgi + +Maybe you already have an Apache_ or you want to run a Bottle-based application large scale - then it is time to think about Apache with mod_wsgi_. + +We assume that your Apache server is up and running and mod_wsgi is working fine as well. On a lot of Linux distributions, mod_wsgi can be easily installed via whatever package management system is in use. + +Bottle brings an adapter for mod_wsgi with it, so serving your application is an easy task. + +In the following example, we assume that you want to make your application "ToDo list" accessible through ``http://www.mypage.com/todo`` and your code, templates and SQLite database are stored in the path ``/var/www/todo``. + +When you run your application via mod_wsgi, it is imperative to remove the ``run()`` statement from your code, otherwise it won't work here. + +After that, create a file called ``adapter.wsgi`` with the following content:: + + import sys, os, bottle + + sys.path = ['/var/www/todo/'] + sys.path + os.chdir(os.path.dirname(__file__)) + + import todo # This loads your application + + application = bottle.default_app() + +and save it in the same path, ``/var/www/todo``. Actually the name of the file can be anything, as long as the extension is ``.wsgi``. The name is only used to reference the file from your virtual host. + +Finally, we need to add a virtual host to the Apache configuration, which looks like this:: + + + ServerName mypage.com + + WSGIDaemonProcess todo user=www-data group=www-data processes=1 threads=5 + WSGIScriptAlias / /var/www/todo/adapter.wsgi + + + WSGIProcessGroup todo + WSGIApplicationGroup %{GLOBAL} + Order deny,allow + Allow from all + + + +After restarting the server, your ToDo list should be accessible at ``http://www.mypage.com/todo`` + +Final Words +========================= + +Now we are at the end of this introduction and tutorial to Bottle. We learned about the basic concepts of Bottle and wrote a first application using the Bottle framework. In addition to that, we saw how to adapt Bottle for large tasks and serve Bottle through an Apache web server with mod_wsgi. + +As said in the introduction, this tutorial is not showing all shades and possibilities of Bottle. What we skipped here is e.g. receiving file objects and streams and how to handle authentication data. Furthermore, we did not show how templates can be called from within another template. For an introduction into those points, please refer to the full `Bottle documentation`_ . + +Complete Example Listing +========================= + +As the ToDo list example was developed piece by piece, here is the complete listing: + +Main code for the application ``todo.py``:: + + import sqlite3 + from bottle import route, run, debug, template, request, validate, static_file, error + + # only needed when you run Bottle on mod_wsgi + from bottle import default_app + + @route('/todo') + def todo_list(): + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT id, task FROM todo WHERE status LIKE '1';") + result = c.fetchall() + c.close() + + output = template('make_table', rows=result) + return output + + @route('/new', method='GET') + def new_item(): + + if request.GET.get('save','').strip(): + + new = request.GET.get('task', '').strip() + conn = sqlite3.connect('todo.db') + c = conn.cursor() + + c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1)) + new_id = c.lastrowid + + conn.commit() + c.close() + + return '

The new task was inserted into the database, the ID is %s

' % new_id + + else: + return template('new_task.tpl') + + @route('/edit/:no', method='GET') + @validate(no=int) + def edit_item(no): + + if request.GET.get('save','').strip(): + edit = request.GET.get('task','').strip() + status = request.GET.get('status','').strip() + + if status == 'open': + status = 1 + else: + status = 0 + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("UPDATE todo SET task = ?, status = ? WHERE id LIKE ?", (edit,status,no)) + conn.commit() + + return '

The item number %s was successfully updated

' %no + + else: + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (str(no))) + cur_data = c.fetchone() + + return template('edit_task', old = cur_data, no = no) + + @route('/item:item#[1-9]+#') + def show_item(item): + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (item)) + result = c.fetchall() + c.close() + + if not result: + return 'This item number does not exist!' + else: + return 'Task: %s' %result[0] + + @route('/help') + def help(): + + static_file('help.html', root='.') + + @route('/json:json#[1-9]+#') + def show_json(json): + + conn = sqlite3.connect('todo.db') + c = conn.cursor() + c.execute("SELECT task FROM todo WHERE id LIKE ?", (json)) + result = c.fetchall() + c.close() + + if not result: + return {'task':'This item number does not exist!'} + else: + return {'Task': result[0]} + + + @error(403) + def mistake403(code): + return 'There is a mistake in your url!' + + @error(404) + def mistake404(code): + return 'Sorry, this page does not exist!' + + + debug(True) + run(reloader=True) + #remember to remove reloader=True and debug(True) when you move your application from development to a productive environment + +Template ``make_table.tpl``:: + + %#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...) +

The open items are as follows:

+ + %for row in rows: + + %for col in row: + + %end + + %end +
{{col}}
+ +Template ``edit_task.tpl``:: + + %#template for editing a task + %#the template expects to receive a value for "no" as well a "old", the text of the selected ToDo item +

Edit the task with ID = {{no}}

+
+ + +
+ +
+ +Template ``new_task.tpl``:: + + %#template for the form for a new task +

Add a new task to the ToDo list:

+
+ + +
diff --git a/html/_static/ajax-loader.gif b/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/html/_static/basic.css b/html/_static/basic.css new file mode 100644 index 0000000..43e8baf --- /dev/null +++ b/html/_static/basic.css @@ -0,0 +1,540 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/html/_static/bgrad.png b/html/_static/bgrad.png new file mode 100644 index 0000000000000000000000000000000000000000..82da06473c76f4c16352d264c3d82ebb0b9c888e GIT binary patch literal 159 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 literal 0 HcmV?d00001 diff --git a/html/_static/comment-bright.png b/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..551517b8c83b76f734ff791f847829a760ad1903 GIT binary patch literal 3500 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 A2LJ#7 literal 0 HcmV?d00001 diff --git a/html/_static/comment.png b/html/_static/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..92feb52b8824c6b0f59b658b1196c61de9162a95 GIT binary patch literal 3445 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 Xn!ZpXD%P(H00000NkvXXu0mjf').addClass(this.css).appendTo('body'); + this.link = $('').text(this.title) + .attr('href', '#'+this.id) + .appendTo(this.node); + this.node.css('right', '-'+(this.node.outerWidth()-this.peak)+'px'); + this.refresh(); + this.node.mouseenter(function() { POI.show(); }); + this.node.mouseleave(function() { POI.hide(POI.delay); }); +} + +POI.prototype.refresh = function() { + // Re-arrange the anchors + var dsize = $(document).height(); + var wsize = $(window).height(); + var pos = this.anchor.offset().top; + var hpos = Math.round(wsize*(pos/dsize)); + this.node.css('top', hpos+'px'); +} + +POI.prototype.show = function() { + // Show the handle + if(this.visible) return; + this.node.stop(true).animate({'right': '0px'}, 250); + this.visible = true; +} + +POI.prototype.hide = function() { + // Hide the handle + if(this.pinned) return; + if(! this.visible) return; + this.node.stop(true).animate({ + 'right': '-'+(this.node.outerWidth()-this.peak)+'px' + }, 250); + this.visible = false; +} + + + +// Static attributes and methods. + +POI.all = Array(); +POI.peak = 20; +POI.delay = 2000; +POI.css = 'sidelegend'; +POI.hide_timeout = null; + +POI.refresh = function() { + // Refresh all at once + jQuery.each(POI.all, function() { + this.refresh(); + }) +} + +POI.show = function() { + // Show all at once + if(POI.hide_timeout) window.clearTimeout(POI.hide_timeout); + POI.hide_timeout = null; + jQuery.each(POI.all, function() { + this.show(); + }) +} + +POI.hide = function(delay) { + // Hide all at once after a specific delay + if(POI.hide_timeout) window.clearTimeout(POI.hide_timeout); + if(delay) { + POI.hide_timeout = window.setTimeout(function() { + POI.hide_timeout = null; + POI.hide(); + }, delay) + } else { + jQuery.each(POI.all, function() { + this.hide(); + }) + } +} + +POI.whereami = function() { + // Show and pin the currently viewed POI + var position = $(window).scrollTop() + $(window).height() / 2; + var last = null; + jQuery.each(POI.all, function() { + if(position < this.anchor.offset().top) return false; + last = this; + }) + if(last) { + last.pinned = true; + last.show(); + } + jQuery.each(POI.all, function() { + if(this != last) { + this.pinned = false; + this.hide(); + } + }) +} + + + +$(document).resize(POI.refresh); +$(window).resize(POI.refresh); +$(window).scroll(POI.whereami); + +// Global events that affect all POIs +$(document).ready(function() { + $('.section > h1 > a.headerlink, .section > h2 > a.headerlink').each(function(index){ + var lnk = $(this); + var title = lnk.parent().text().replace('¶','') + var anchor = lnk.parent().parent() + new POI(anchor, title) + }) + POI.whereami(); +}) + + diff --git a/html/_static/doctools.js b/html/_static/doctools.js new file mode 100644 index 0000000..d4619fd --- /dev/null +++ b/html/_static/doctools.js @@ -0,0 +1,247 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +} + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * small function to check if an array contains + * a given item. + */ +jQuery.contains = function(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == item) + return true; + } + return false; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/html/_static/down-pressed.png b/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7ad782782e4f8e39b0c6e15c7344700cdd2527 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}Z23@f-Ava~9&<9T!#}JFtXD=!G zGdl{fK6ro2OGiOl+hKvH6i=D3%%Y^j`yIkRn!8O>@bG)IQR0{Kf+mxNd=_WScA8u_ z3;8(7x2){m9`nt+U(Nab&1G)!{`SPVpDX$w8McLTzAJ39wprG3p4XLq$06M`%}2Yk zRPPsbES*dnYm1wkGL;iioAUB*Or2kz6(-M_r_#Me-`{mj$Z%( literal 0 HcmV?d00001 diff --git a/html/_static/down.png b/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..3003a88770de3977d47a2ba69893436a2860f9e7 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}xaV3tUZ$qnrLa#kt978NlpS`ru z&)HFc^}^>{UOEce+71h5nn>6&w6A!ieNbu1wh)UGh{8~et^#oZ1# z>T7oM=FZ~xXWnTo{qnXm$ZLOlqGswI_m2{XwVK)IJmBjW{J3-B3x@C=M{ShWt#fYS9M?R;8K$~YwlIqwf>VA7q=YKcwf2DS4Zj5inDKXXB1zl=(YO3ST6~rDq)&z z*o>z)=hxrfG-cDBW0G$!?6{M<$@{_4{m1o%Ub!naEtn|@^frU1tDnm{r-UW|!^@B8 literal 0 HcmV?d00001 diff --git a/html/_static/favicon.ico b/html/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b6b83f12da8eda7f5202f228db6d4fcec59effcd GIT binary patch literal 4286 zcmc&&2~3nn6y8Rgv{2%Ka>al)N>RKZv=Rjs1kqqYtECaFSE6DJVx>|JMQFKHibxPE zha$=i;Z)RRRbb1toC3Ro6a?gy`w&=IzRvtsqEgmfwCQYSXXed2X1;lE=IydrpODYO zg)I8bik{74DX>^94N?h-wUJaxX9}4U$i1qs2rL#PEZN!Fu(r0wx^?R?ckW!s%F04b zO$`PH1_%rcM05Tr{!_(4A8J(S- zICA6&6ciLdvHFlQG&IEEdf>nT^!9Zl^?@5sol}9Gmm*GjD&T~NJdXc18^>H_VD0iL z4mq=MA!GyEJ8Kv`=Fgx1L2EEKH^=_{`-#44T#hoquYpTQRcERj>7Nbw5@-BX;pC@` zUw)T|-T5zI>p2rA&&eXUG!z*b8BkPIM1Oz3)G)-x#zIF&2SVX6t|#xn#hcpjyQPCm zx4t3m*JP{%-*7El2wM*CYhS@5cp==bDC2a%960!WhEu*X(a_3+m6a7dJw2teKRi6l z_;glQ7PzIp2u{>TXp#Z0C2zv@6l2mFk+C5{5;x##!de8z>A*jF1$-lx;QWmR@CcQM z>s1-}M=eJs|1sz}^!4>gyatNfnl)?C*;|c>`&$sj-iDZr?TF=khqwp3NZm>LI}pwO z77_QhAUvI{Ep07=lC^L-K?9d!RN)gL56>H)gInf_-Me?g-Q8Vc`}X$saB*=#W!+6A zX75C5juq|}90t441{p=R$S6FH`@EyLox2~&-0zW)X@-~wn-Rg*N7!9$1gB{rFlhlU z#m_+$#}GwDMOd_Gk;L}buV2sjPW}^jWRx62R=FK=`7S7^@&K>eo3x(D6S#p}>41l2 z$B@pmL~7m+B>uS>u~~YEc%X$a_7ViADX%G-p*JYB?cH4%}ihA@si zUi6k@#*7&f+ov(p+S-cZx-)p(;Eg9uS5VV>1GR0@sB4cSH3omR-9lA!Fe)2;37-pc zs;%*;@&~ZXO>w7WJyHs_kdVI^F*(ZU85BT9Mn>W|)YjHUK|uldP5uxx2M}8~QQr}d z#?Dkc@4AiWoww1@k%-#%NL053p}f%>g|&9buKE!V`P*^7d=u_HHe~4i!_Sy~D=RCb zsi{dK4CsAJ-;&;!)p$A5j8V}5hJ@{S(N}<$ZVp;{GSJj@m#irPHEm&JoflE^>@;|_ zKOy(&VKjE6VN5hMVT;C|oSYm62L~r;;yPhrVc5EL>m(MDXaoafKO>_(7#4Og7*K2k z1gDy|8w`K{P%XyCN8gf7NJxOOvGH3paRYk)sHmtgJ~$Phh}fX#LGALJ{Lt2$jd6?- zjPe-F-jvhVCvi#kBu(-4^@WLv3E9i|lwu>JU1;ykLH9rf;S&)&l9=;YL(P}I7!hz1nL_V6&2v|cu-POk_eNH8#f{( zBxEX;)20Un1%c{*UnwpwX6}{gesj*Xe4`J}V6^LzQEWys9TWO59e zGm9%Up61P)hlYj*act9?v#_vu?|nrTySlo<($aETHpB_l*Vi+-rnq;O`Yg?>O-)Td zS}eS|CYm?y-MjZq64M_W8w0&ZX)YWZ8aiqIV-e^Zud1qw{QP`ICH2j?xHzm_xe`W3 yMxYq|*CjGC61uv&2oDd3hK2_7TRAl~RqR{(vDc)hr^lSJq`yI5{}1qgwSNQ169jbt literal 0 HcmV?d00001 diff --git a/html/_static/file.png b/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d18082e397e7e54f20721af768c4c2983258f1b4 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN literal 0 HcmV?d00001 diff --git a/html/_static/jquery.js b/html/_static/jquery.js new file mode 100644 index 0000000..8ccd0ea --- /dev/null +++ b/html/_static/jquery.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

API Reference¶

+

This is a mostly auto-generated API. If you are new to bottle, you might find the +narrative Tutorial more helpful.

+
+

Module Contents¶

+

The module defines several functions, constants, and an exception.

+
+
+debug(mode=True)[source]¶
+

Change the debug level. +There is only one debug level supported at the moment.

+
+ +
+
+run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=False, **kargs)[source]¶
+

Start a server instance. This method blocks until the server terminates.

+ +++ + + + +
Parameters:
    +
  • app – WSGI application or target string supported by +load_app(). (default: default_app())
  • +
  • server – Server adapter to use. See server_names keys +for valid names or pass a ServerAdapter subclass. +(default: wsgiref)
  • +
  • host – Server address to bind to. Pass 0.0.0.0 to listens on +all interfaces including the external one. (default: 127.0.0.1)
  • +
  • port – Server port to bind to. Values below 1024 require root +privileges. (default: 8080)
  • +
  • reloader – Start auto-reloading server? (default: False)
  • +
  • interval – Auto-reloader interval in seconds (default: 1)
  • +
  • quiet – Suppress output to stdout and stderr? (default: False)
  • +
  • options – Options passed to the server adapter.
  • +
+
+
+ +
+
+load(target, **namespace)[source]¶
+

Import a module or fetch an object from a module.

+
    +
  • package.module returns module as a module object.
  • +
  • pack.mod:name returns the module variable name from pack.mod.
  • +
  • pack.mod:func() calls pack.mod.func() and returns the result.
  • +
+

The last form accepts not only function calls, but any type of +expression. Keyword arguments passed to this function are available as +local variables. Example: import_string('re:compile(x)', x='[a-z]')

+
+ +
+
+load_app(target)[source]¶
+

Load a bottle application from a module and make sure that the import +does not affect the current default application, but returns a separate +application object. See load() for the target parameter.

+
+ +
+
+request = <LocalRequest: GET http://127.0.0.1/>¶
+

A thread-safe instance of LocalRequest. If accessed from within a +request callback, this instance always refers to the current request +(even on a multithreaded server).

+
+ +
+
+response = Content-Type: text/html; charset=UTF-8 ¶
+

A thread-safe instance of LocalResponse. It is used to change the +HTTP response for the current request.

+
+ +
+
+HTTP_CODES = {300: 'Multiple Choices', 301: 'Moved Permanently', 302: 'Found', 303: 'See Other', 304: 'Not Modified', 305: 'Use Proxy', 306: '(Unused)', 307: 'Temporary Redirect', 100: 'Continue', 101: 'Switching Protocols', 400: 'Bad Request', 401: 'Unauthorized', 402: 'Payment Required', 403: 'Forbidden', 404: 'Not Found', 405: 'Method Not Allowed', 406: 'Not Acceptable', 407: 'Proxy Authentication Required', 408: 'Request Timeout', 409: 'Conflict', 410: 'Gone', 411: 'Length Required', 412: 'Precondition Failed', 413: 'Request Entity Too Large', 414: 'Request-URI Too Long', 415: 'Unsupported Media Type', 416: 'Requested Range Not Satisfiable', 417: 'Expectation Failed', 418: "I'm a teapot", 428: 'Precondition Required', 429: 'Too Many Requests', 431: 'Request Header Fields Too Large', 200: 'OK', 201: 'Created', 202: 'Accepted', 203: 'Non-Authoritative Information', 204: 'No Content', 205: 'Reset Content', 206: 'Partial Content', 500: 'Internal Server Error', 501: 'Not Implemented', 502: 'Bad Gateway', 503: 'Service Unavailable', 504: 'Gateway Timeout', 505: 'HTTP Version Not Supported', 511: 'Network Authentication Required'}¶
+

A dict to map HTTP status codes (e.g. 404) to phrases (e.g. ‘Not Found’)

+
+ +
+
+app()¶
+
+default_app()¶
+

Return the current Default Application. Actually, these are callable instances of AppStack and implement a stack-like API.

+
+ +
+

Routing¶

+

Bottle maintains a stack of Bottle instances (see app() and AppStack) and uses the top of the stack as a default application for some of the module-level functions and decorators.

+
+
+route(path, method='GET', callback=None, **options)¶
+
+get(...)¶
+
+post(...)¶
+
+put(...)¶
+
+delete(...)¶
+

Decorator to install a route to the current default application. See Bottle.route() for details.

+
+ +
+
+error(...)¶
+

Decorator to install an error handler to the current default application. See Bottle.error() for details.

+
+ +
+
+

WSGI and HTTP Utilities¶

+
+
+parse_date(ims)[source]¶
+

Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch.

+
+ +
+
+parse_auth(header)[source]¶
+

Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None

+
+ +
+
+cookie_encode(data, key)[source]¶
+

Encode and sign a pickle-able object. Return a (byte) string

+
+ +
+
+cookie_decode(data, key)[source]¶
+

Verify and decode an encoded string. Return an object or None.

+
+ +
+
+cookie_is_encoded(data)[source]¶
+

Return True if the argument looks like a encoded cookie.

+
+ +
+
+yieldroutes(func)[source]¶
+

Return a generator for routes that match the signature (name, args) +of the func parameter. This may yield more than one route if the function +takes optional keyword arguments. The output is best described by example:

+
a()         -> '/a'
+b(x, y)     -> '/b/:x/:y'
+c(x, y=5)   -> '/c/:x' and '/c/:x/:y'
+d(x=5, y=6) -> '/d' and '/d/:x' and '/d/:x/:y'
+
+
+ +
+
+path_shift(script_name, path_info, shift=1)[source]¶
+

Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa.

+ +++ + + + + + +
Returns:

The modified paths.

+
Parameters:
    +
  • script_name – The SCRIPT_NAME path.
  • +
  • script_name – The PATH_INFO path.
  • +
  • shift – The number of path fragments to shift. May be negative to +change the shift direction. (default: 1)
  • +
+
+
+ +
+
+

Data Structures¶

+
+
+class MultiDict(*a, **k)[source]¶
+

This dict stores multiple values per key, but behaves exactly like a +normal dict in that it returns only the newest value for any given key. +There are special methods available to access the full list of values.

+
+
+get(key, default=None, index=-1, type=None)[source]¶
+

Return the most recent value for a key.

+ +++ + + + +
Parameters:
    +
  • default – The default value to be returned if the key is not +present or the type conversion fails.
  • +
  • index – An index for the list of available values.
  • +
  • type – If defined, this callable is used to cast the value +into a specific type. Exception are suppressed and result in +the default value to be returned.
  • +
+
+
+ +
+
+append(key, value)[source]¶
+

Add a new value to the list of values for this key.

+
+ +
+
+replace(key, value)[source]¶
+

Replace the list of values with a single value.

+
+ +
+
+getall(key)[source]¶
+

Return a (possibly empty) list of values for a key.

+
+ +
+
+getone(key, default=None, index=-1, type=None)¶
+

Aliases for WTForms to mimic other multi-dict APIs (Django)

+
+ +
+
+getlist(key)¶
+

Return a (possibly empty) list of values for a key.

+
+ +
+ +
+
+class HeaderDict(*a, **ka)[source]¶
+

A case-insensitive version of MultiDict that defaults to +replace the old value instead of appending it.

+
+ +
+
+class FormsDict(*a, **k)[source]¶
+

This MultiDict subclass is used to store request form data. +Additionally to the normal dict-like item access methods (which return +unmodified data as native strings), this container also supports +attribute-like access to its values. Attributes are automatically de- +or recoded to match input_encoding (default: ‘utf8’). Missing +attributes default to an empty string.

+
+
+input_encoding = 'utf8'¶
+

Encoding used for attribute values.

+
+ +
+
+recode_unicode = True¶
+

If true (default), unicode strings are first encoded with latin1 +and then decoded to match input_encoding.

+
+ +
+
+decode(encoding=None)[source]¶
+

Returns a copy with all keys and values de- or recoded to match +input_encoding. Some libraries (e.g. WTForms) want a +unicode dictionary.

+
+ +
+ +
+
+class WSGIHeaderDict(environ)[source]¶
+

This dict-like class wraps a WSGI environ dict and provides convenient +access to HTTP_* fields. Keys and values are native strings +(2.x bytes or 3.x unicode) and keys are case-insensitive. If the WSGI +environment contains non-native string values, these are de- or encoded +using a lossless ‘latin1’ character set.

+

The API will remain stable even on changes to the relevant PEPs. +Currently PEP 333, 444 and 3333 are supported. (PEP 444 is the only one +that uses non-native strings.)

+
+
+cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH')¶
+

List of keys that do not have a HTTP_ prefix.

+
+ +
+
+raw(key, default=None)[source]¶
+

Return the header value as is (may be bytes or unicode).

+
+ +
+ +
+
+class AppStack[source]¶
+

A stack-like list. Calling it returns the head of the stack.

+
+
+pop()¶
+

Return the current default application and remove it from the stack.

+
+ +
+
+push(value=None)[source]¶
+

Add a new Bottle instance to the stack

+
+ +
+ +
+
+class ResourceManager(base='./', opener=<built-in function open>, cachemode='all')[source]¶
+

This class manages a list of search paths and helps to find and open +application-bound resources (files).

+ +++ + + + +
Parameters:
    +
  • base – default value for add_path() calls.
  • +
  • opener – callable used to open resources.
  • +
  • cachemode – controls which lookups are cached. One of ‘all’, +‘found’ or ‘none’.
  • +
+
+
+
+path = None¶
+

A list of search paths. See add_path() for details.

+
+ +
+
+cache = None¶
+

A cache for resolved paths. res.cache.clear() clears the cache.

+
+ +
+
+add_path(path, base=None, index=None, create=False)[source]¶
+

Add a new path to the list of search paths. Return False if the +path does not exist.

+ +++ + + + +
Parameters:
    +
  • path – The new search path. Relative paths are turned into +an absolute and normalized form. If the path looks like a file +(not ending in /), the filename is stripped off.
  • +
  • base – Path used to absolutize relative search paths. +Defaults to base which defaults to os.getcwd().
  • +
  • index – Position within the list of search paths. Defaults +to last index (appends to the list).
  • +
+
+

The base parameter makes it easy to reference files installed +along with a python module or package:

+
res.add_path('./resources/', __file__)
+
+
+
+ +
+
+lookup(name)[source]¶
+

Search for a resource and return an absolute file path, or None.

+

The path list is searched in order. The first match is +returend. Symlinks are followed. The result is cached to speed up +future lookups.

+
+ +
+
+open(name, mode='r', *args, **kwargs)[source]¶
+

Find a resource and return a file object, or raise IOError.

+
+ +
+ +
+
+

Exceptions¶

+
+
+exception BottleException[source]¶
+

A base class for exceptions used by bottle.

+
+ +
+
+
+

The Bottle Class¶

+
+
+class Bottle(catchall=True, autojson=True)[source]¶
+

Each Bottle object represents a single, distinct web application and +consists of routes, callbacks, plugins, resources and configuration. +Instances are callable WSGI applications.

+ +++ + + + +
Parameters:catchall – If true (default), handle all exceptions. Turn off to +let debugging middleware handle exceptions.
+
+
+catchall = None¶
+

If true, most exceptions are caught and returned as HTTPError

+
+ +
+
+resources = None¶
+

A ResourceManager for application files

+
+ +
+
+config = None¶
+

A ConfigDict for app specific configuration.

+
+ +
+
+mount(prefix, app, **options)[source]¶
+

Mount an application (Bottle or plain WSGI) to a specific +URL prefix. Example:

+
root_app.mount('/admin/', admin_app)
+
+
+ +++ + + + +
Parameters:
    +
  • prefix – path prefix or mount-point. If it ends in a slash, +that slash is mandatory.
  • +
  • app – an instance of Bottle or a WSGI application.
  • +
+
+

All other parameters are passed to the underlying route() call.

+
+ +
+
+merge(routes)[source]¶
+

Merge the routes of another Bottle application or a list of +Route objects into this application. The routes keep their +‘owner’, meaning that the Route.app attribute is not +changed.

+
+ +
+
+install(plugin)[source]¶
+

Add a plugin to the list of plugins and prepare it for being +applied to all routes of this application. A plugin may be a simple +decorator or an object that implements the Plugin API.

+
+ +
+
+uninstall(plugin)[source]¶
+

Uninstall plugins. Pass an instance to remove a specific plugin, a type +object to remove all plugins that match that type, a string to remove +all plugins with a matching name attribute or True to remove all +plugins. Return the list of removed plugins.

+
+ +
+
+run(**kwargs)[source]¶
+

Calls run() with the same parameters.

+
+ +
+
+reset(route=None)[source]¶
+

Reset all routes (force plugins to be re-applied) and clear all +caches. If an ID or route object is given, only that specific route +is affected.

+
+ +
+
+close()[source]¶
+

Close the application and all installed plugins.

+
+ +
+
+match(environ)[source]¶
+

Search for a matching route and return a (Route , urlargs) +tuple. The second value is a dictionary with parameters extracted +from the URL. Raise HTTPError (404/405) on a non-match.

+
+ +
+
+get_url(routename, **kargs)[source]¶
+

Return a string that matches a named route

+
+ +
+
+add_route(route)[source]¶
+

Add a route object, but do not change the Route.app +attribute.

+
+ +
+
+route(path=None, method='GET', callback=None, name=None, apply=None, skip=None, **config)[source]¶
+

A decorator to bind a function to a request URL. Example:

+
@app.route('/hello/:name')
+def hello(name):
+    return 'Hello %s' % name
+
+
+

The :name part is a wildcard. See Router for syntax +details.

+ +++ + + + +
Parameters:
    +
  • path – Request path or a list of paths to listen to. If no +path is specified, it is automatically generated from the +signature of the function.
  • +
  • method – HTTP method (GET, POST, PUT, ...) or a list of +methods to listen to. (default: GET)
  • +
  • callback – An optional shortcut to avoid the decorator +syntax. route(..., callback=func) equals route(...)(func)
  • +
  • name – The name for this route. (default: None)
  • +
  • apply – A decorator or plugin or a list of plugins. These are +applied to the route callback in addition to installed plugins.
  • +
  • skip – A list of plugins, plugin classes or names. Matching +plugins are not installed to this route. True skips all.
  • +
+
+

Any additional keyword arguments are stored as route-specific +configuration and passed to plugins (see Plugin.apply()).

+
+ +
+
+get(path=None, method='GET', **options)[source]¶
+

Equals route().

+
+ +
+
+post(path=None, method='POST', **options)[source]¶
+

Equals route() with a POST method parameter.

+
+ +
+
+put(path=None, method='PUT', **options)[source]¶
+

Equals route() with a PUT method parameter.

+
+ +
+
+delete(path=None, method='DELETE', **options)[source]¶
+

Equals route() with a DELETE method parameter.

+
+ +
+
+error(code=500)[source]¶
+

Decorator: Register an output handler for a HTTP error code

+
+ +
+
+hook(name)[source]¶
+

Return a decorator that attaches a callback to a hook. Three hooks +are currently implemented:

+
    +
  • before_request: Executed once before each request
  • +
  • after_request: Executed once after each request
  • +
  • app_reset: Called whenever reset() is called.
  • +
+
+ +
+
+handle(path, method='GET')[source]¶
+

(deprecated) Execute the first matching route callback and return +the result. HTTPResponse exceptions are caught and returned. +If Bottle.catchall is true, other exceptions are caught as +well and returned as HTTPError instances (500).

+
+ +
+
+wsgi(environ, start_response)[source]¶
+

The bottle WSGI-interface.

+
+ +
+ +
+
+class Route(app, rule, method, callback, name=None, plugins=None, skiplist=None, **config)[source]¶
+

This class wraps a route callback along with route specific metadata and +configuration and applies Plugins on demand. It is also responsible for +turing an URL path rule into a regular expression usable by the Router.

+
+
+app = None¶
+

The application this route is installed to.

+
+ +
+
+rule = None¶
+

The path-rule string (e.g. /wiki/:page).

+
+ +
+
+method = None¶
+

The HTTP method as a string (e.g. GET).

+
+ +
+
+callback = None¶
+

The original callback with no plugins applied. Useful for introspection.

+
+ +
+
+name = None¶
+

The name of the route (if specified) or None.

+
+ +
+
+plugins = None¶
+

A list of route-specific plugins (see Bottle.route()).

+
+ +
+
+skiplist = None¶
+

A list of plugins to not apply to this route (see Bottle.route()).

+
+ +
+
+config = None¶
+

Additional keyword arguments passed to the Bottle.route() +decorator are stored in this dictionary. Used for route-specific +plugin configuration and meta-data.

+
+ +
+
+reset()[source]¶
+

Forget any cached values. The next time call is accessed, +all plugins are re-applied.

+
+ +
+
+prepare()[source]¶
+

Do all on-demand work immediately (useful for debugging).

+
+ +
+
+all_plugins()[source]¶
+

Yield all Plugins affecting this route.

+
+ +
+ +
+
+

The Request Object¶

+

The Request class wraps a WSGI environment and provides helpful methods to parse and access form data, cookies, file uploads and other metadata. Most of the attributes are read-only.

+
+
+Request¶
+

alias of BaseRequest

+
+ +
+
+class BaseRequest(environ=None)[source]¶
+

A wrapper for WSGI environment dictionaries that adds a lot of +convenient access methods and properties. Most of them are read-only.

+

Adding new attributes to a request actually adds them to the environ +dictionary (as ‘bottle.request.ext.<name>’). This is the recommended +way to store and access request-specific data.

+
+
+MEMFILE_MAX = 102400¶
+

Maximum size of memory buffer for body in bytes.

+
+ +
+
+MAX_PARAMS = 100¶
+

Maximum number pr GET or POST parameters per request

+
+ +
+
+environ¶
+

The wrapped WSGI environ dictionary. This is the only real attribute. +All other attributes actually are read-only properties.

+
+ +
+
+app[source]¶
+

Bottle application handling this request.

+
+ +
+
+path[source]¶
+

The value of PATH_INFO with exactly one prefixed slash (to fix +broken clients and avoid the “empty path” edge case).

+
+ +
+
+method[source]¶
+

The REQUEST_METHOD value as an uppercase string.

+
+ +
+
+headers[source]¶
+

A WSGIHeaderDict that provides case-insensitive access to +HTTP request headers.

+
+ +
+
+get_header(name, default=None)[source]¶
+

Return the value of a request header, or a given default value.

+
+ +
+
+cookies[source]¶
+

Cookies parsed into a FormsDict. Signed cookies are NOT +decoded. Use get_cookie() if you expect signed cookies.

+
+ +
+ +

Return the content of a cookie. To read a Signed Cookie, the +secret must match the one used to create the cookie (see +BaseResponse.set_cookie()). If anything goes wrong (missing +cookie or wrong signature), return a default value.

+
+ +
+
+query[source]¶
+

The query_string parsed into a FormsDict. These +values are sometimes called “URL arguments” or “GET parameters”, but +not to be confused with “URL wildcards” as they are provided by the +Router.

+
+ +
+
+forms[source]¶
+

Form values parsed from an url-encoded or multipart/form-data +encoded POST or PUT request body. The result is retuned as a +FormsDict. All keys and values are strings. File uploads +are stored separately in files.

+
+ +
+
+params[source]¶
+

A FormsDict with the combined values of query and +forms. File uploads are stored in files.

+
+ +
+
+files[source]¶
+

File uploads parsed from an url-encoded or multipart/form-data +encoded POST or PUT request body. The values are instances of +cgi.FieldStorage. The most important attributes are:

+
+
filename
+
The filename, if specified; otherwise None; this is the client +side filename, not the file name on which it is stored (that’s +a temporary file you don’t deal with)
+
file
+
The file(-like) object from which you can read the data.
+
value
+
The value as a string; for file uploads, this transparently +reads the file every time you request the value. Do not do this +on big files.
+
+
+ +
+
+json[source]¶
+

If the Content-Type header is application/json, this +property holds the parsed content of the request body. Only requests +smaller than MEMFILE_MAX are processed to avoid memory +exhaustion.

+
+ +
+
+body[source]¶
+

The HTTP request body as a seek-able file-like object. Depending on +MEMFILE_MAX, this is either a temporary file or a +io.BytesIO instance. Accessing this property for the first +time reads and replaces the wsgi.input environ variable. +Subsequent accesses just do a seek(0) on the file object.

+
+ +
+
+GET¶
+

An alias for query.

+
+ +
+
+POST[source]¶
+

The values of forms and files combined into a single +FormsDict. Values are either strings (form values) or +instances of cgi.FieldStorage (file uploads).

+
+ +
+
+COOKIES[source]¶
+

Alias for cookies (deprecated).

+
+ +
+
+url[source]¶
+

The full request URI including hostname and scheme. If your app +lives behind a reverse proxy or load balancer and you get confusing +results, make sure that the X-Forwarded-Host header is set +correctly.

+
+ +
+
+urlparts[source]¶
+

The url string as an urlparse.SplitResult tuple. +The tuple contains (scheme, host, path, query_string and fragment), +but the fragment is always empty because it is not visible to the +server.

+
+ +
+
+fullpath[source]¶
+

Request path including script_name (if present).

+
+ +
+
+query_string[source]¶
+

The raw query part of the URL (everything in between ? +and #) as a string.

+
+ +
+
+script_name[source]¶
+

The initial portion of the URL’s path that was removed by a higher +level (server or routing middleware) before the application was +called. This script path is returned with leading and tailing +slashes.

+
+ +
+
+path_shift(shift=1)[source]¶
+

Shift path segments from path to script_name and +vice versa.

+ +++ + + + +
Parameters:shift – The number of path segments to shift. May be negative +to change the shift direction. (default: 1)
+
+ +
+
+content_length[source]¶
+

The request body length as an integer. The client is responsible to +set this header. Otherwise, the real length of the body is unknown +and -1 is returned. In this case, body will be empty.

+
+ +
+
+content_type[source]¶
+

The Content-Type header as a lowercase-string (default: empty).

+
+ +
+
+is_xhr[source]¶
+

True if the request was triggered by a XMLHttpRequest. This only +works with JavaScript libraries that support the X-Requested-With +header (most of the popular libraries do).

+
+ +
+
+is_ajax[source]¶
+

Alias for is_xhr. “Ajax” is not the right term.

+
+ +
+
+auth[source]¶
+

HTTP authentication data as a (user, password) tuple. This +implementation currently supports basic (not digest) authentication +only. If the authentication happened at a higher level (e.g. in the +front web-server or a middleware), the password field is None, but +the user field is looked up from the REMOTE_USER environ +variable. On any errors, None is returned.

+
+ +
+
+remote_route[source]¶
+

A list of all IPs that were involved in this request, starting with +the client IP and followed by zero or more proxies. This does only +work if all proxies support the `X-Forwarded-For header. Note +that this information can be forged by malicious clients.

+
+ +
+
+remote_addr[source]¶
+

The client IP as a string. Note that this information can be forged +by malicious clients.

+
+ +
+
+copy()[source]¶
+

Return a new Request with a shallow environ copy.

+
+ +
+ +

The module-level bottle.request is a proxy object (implemented in LocalRequest) and always refers to the current request, or in other words, the request that is currently processed by the request handler in the current thread. This thread locality ensures that you can safely use a global instance in a multi-threaded environment.

+
+
+class LocalRequest(environ=None)[source]¶
+

A thread-local subclass of BaseRequest with a different +set of attribues for each thread. There is usually only one global +instance of this class (request). If accessed during a +request/response cycle, this instance always refers to the current +request (even on a multithreaded server).

+
+
+bind(environ=None)¶
+

Wrap a WSGI environ dictionary.

+
+ +
+
+environ¶
+

Thread-local property stored in _lctx.request_environ

+
+ +
+ +
+
+

The Response Object¶

+

The Response class stores the HTTP status code as well as headers and cookies that are to be sent to the client. Similar to bottle.request there is a thread-local bottle.response instance that can be used to adjust the current response. Moreover, you can instantiate Response and return it from your request handler. In this case, the custom instance overrules the headers and cookies defined in the global one.

+
+
+Response¶
+

alias of BaseResponse

+
+ +
+
+class BaseResponse(body='', status=None, **headers)[source]¶
+

Storage class for a response body as well as headers and cookies.

+

This class does support dict-like case-insensitive item-access to +headers, but is NOT a dict. Most notably, iterating over a response +yields parts of the body and not the headers.

+
+
+copy()[source]¶
+

Returns a copy of self.

+
+ +
+
+status_line[source]¶
+

The HTTP status line as a string (e.g. 404 Not Found).

+
+ +
+
+status_code[source]¶
+

The HTTP status code as an integer (e.g. 404).

+
+ +
+
+status¶
+

A writeable property to change the HTTP response status. It accepts +either a numeric code (100-999) or a string with a custom reason +phrase (e.g. “404 Brain not found”). Both status_line and +status_code are updated accordingly. The return value is +always a status string.

+
+ +
+
+headers[source]¶
+

An instance of HeaderDict, a case-insensitive dict-like +view on the response headers.

+
+ +
+
+get_header(name, default=None)[source]¶
+

Return the value of a previously defined header. If there is no +header with that name, return a default value.

+
+ +
+
+set_header(name, value)[source]¶
+

Create a new response header, replacing any previously defined +headers with the same name.

+
+ +
+
+add_header(name, value)[source]¶
+

Add an additional response header, not removing duplicates.

+
+ +
+
+iter_headers()[source]¶
+

Yield (header, value) tuples, skipping headers that are not +allowed with the current response status code.

+
+ +
+
+headerlist[source]¶
+

WSGI conform list of (header, value) tuples.

+
+ +
+
+content_type¶
+

Current value of the ‘Content-Type’ header.

+
+ +
+
+content_length¶
+

Current value of the ‘Content-Length’ header.

+
+ +
+
+charset[source]¶
+

Return the charset specified in the content-type header (default: utf8).

+
+ +
+
+COOKIES[source]¶
+

A dict-like SimpleCookie instance. This should not be used directly. +See set_cookie().

+
+ +
+ +

Create a new cookie or replace an old one. If the secret parameter is +set, create a Signed Cookie (described below).

+ +++ + + + +
Parameters:
    +
  • name – the name of the cookie.
  • +
  • value – the value of the cookie.
  • +
  • secret – a signature key required for signed cookies.
  • +
+
+

Additionally, this method accepts all RFC 2109 attributes that are +supported by cookie.Morsel, including:

+ +++ + + + +
Parameters:
    +
  • max_age – maximum age in seconds. (default: None)
  • +
  • expires – a datetime object or UNIX timestamp. (default: None)
  • +
  • domain – the domain that is allowed to read the cookie. +(default: current domain)
  • +
  • path – limits the cookie to a given path (default: current path)
  • +
  • secure – limit the cookie to HTTPS connections (default: off).
  • +
  • httponly – prevents client-side javascript to read this cookie +(default: off, requires Python 2.6 or newer).
  • +
+
+

If neither expires nor max_age is set (default), the cookie will +expire at the end of the browser session (as soon as the browser +window is closed).

+

Signed cookies may store any pickle-able object and are +cryptographically signed to prevent manipulation. Keep in mind that +cookies are limited to 4kb in most browsers.

+

Warning: Signed cookies are not encrypted (the client can still see +the content) and not copy-protected (the client can restore an old +cookie). The main intention is to make pickling and unpickling +save, not to store secret information at client side.

+
+ +
+ +

Delete a cookie. Be sure to use the same domain and path +settings as used to create the cookie.

+
+ +
+ +
+
+class LocalResponse(body='', status=None, **headers)[source]¶
+

A thread-local subclass of BaseResponse with a different +set of attribues for each thread. There is usually only one global +instance of this class (response). Its attributes are used +to build the HTTP response at the end of the request/response cycle.

+
+
+body¶
+

Thread-local property stored in _lctx.response_body

+
+ +
+ +

The following two classes can be raised as an exception. The most noticeable difference is that bottle invokes error handlers for HTTPError, but not for HTTPResponse or other response types.

+
+
+exception HTTPResponse(body='', status=None, header=None, **headers)[source]¶
+
+
+output¶
+

Alias for .body

+
+ +
+ +
+
+exception HTTPError(status=None, body=None, exception=None, traceback=None, header=None, **headers)[source]¶
+
+ +
+
+

Templates¶

+

All template engines supported by bottle implement the BaseTemplate API. This way it is possible to switch and mix template engines without changing the application code at all.

+
+
+class BaseTemplate(source=None, name=None, lookup=[], encoding='utf8', **settings)[source]¶
+

Base class and minimal API for template adapters

+
+
+__init__(source=None, name=None, lookup=[], encoding='utf8', **settings)[source]¶
+

Create a new template. +If the source parameter (str or buffer) is missing, the name argument +is used to guess a template filename. Subclasses can assume that +self.source and/or self.filename are set. Both are strings. +The lookup, encoding and settings parameters are stored as instance +variables. +The lookup parameter stores a list containing directory paths. +The encoding parameter should be used to decode byte strings or files. +The settings parameter contains a dict for engine-specific settings.

+
+ +
+
+classmethod search(name, lookup=[])[source]¶
+

Search name in all directories specified in lookup. +First without, then with common extensions. Return first hit.

+
+ +
+
+classmethod global_config(key, *args)[source]¶
+

This reads or sets the global settings stored in class.settings.

+
+ +
+
+prepare(**options)[source]¶
+

Run preparations (parsing, caching, ...). +It should be possible to call this again to refresh a template or to +update settings.

+
+ +
+
+render(*args, **kwargs)[source]¶
+

Render the template with the specified local variables and return +a single byte or unicode string. If it is a byte string, the encoding +must match self.encoding. This method must be thread-safe! +Local variables may be provided in dictionaries (*args) +or directly, as keywords (**kwargs).

+
+ +
+ +
+
+view(tpl_name, **defaults)[source]¶
+

Decorator: renders a template for a handler. +The handler can control its behavior like that:

+
    +
  • return a dict of template vars to fill out the template
  • +
  • return something other than a dict and the view decorator will not +process the template, but return the handler result as is. +This includes returning a HTTPResponse(dict) to get, +for instance, JSON with autojson or other castfilters.
  • +
+
+ +
+
+template(*args, **kwargs)[source]¶
+

Get a rendered template as a string iterator. +You can use a name, a filename or a template string as first parameter. +Template rendering arguments can be passed as dictionaries +or directly (as keyword arguments).

+
+ +

You can write your own adapter for your favourite template engine or use one of the predefined adapters. Currently there are four fully supported template engines:

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassURLDecoratorRender function
SimpleTemplateSimpleTemplate Engineview()template()
MakoTemplatehttp://www.makotemplates.orgmako_view()mako_template()
CheetahTemplatehttp://www.cheetahtemplate.org/cheetah_view()cheetah_template()
Jinja2Templatehttp://jinja.pocoo.org/jinja2_view()jinja2_template()
+

To use MakoTemplate as your default template engine, just import its specialised decorator and render function:

+
from bottle import mako_view as view, mako_template as template
+
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

SimpleTemplate Engine

+

Next topic

+

List of available Plugins

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/async.html b/html/async.html new file mode 100644 index 0000000..0e39b74 --- /dev/null +++ b/html/async.html @@ -0,0 +1,301 @@ + + + + + + + + + + Primer to Asynchronous Applications — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Primer to Asynchronous Applications¶

+

Asynchronous design patterns don’t mix well with the synchronous nature of WSGI. This is why most asynchronous frameworks (tornado, twisted, ...) implement a specialized API to expose their asynchronous features. Bottle is a WSGI framework and shares the synchronous nature of WSGI, but thanks to the awesome gevent project, it is still possible to write asynchronous applications with bottle. This article documents the usage of Bottle with Asynchronous WSGI.

+
+

The Limits of Synchronous WSGI¶

+

Briefly worded, the WSGI specification (pep 3333) defines a request/response circle as follows: The application callable is invoked once for each request and must return a body iterator. The server then iterates over the body and writes each chunk to the socket. As soon as the body iterator is exhausted, the client connection is closed.

+

Simple enough, but there is a snag: All this happens synchronously. If your application needs to wait for data (IO, sockets, databases, ...), it must either yield empty strings (busy wait) or block the current thread. Both solutions occupy the handling thread and prevent it from answering new requests. There is consequently only one ongoing request per thread.

+

Most servers limit the number of threads to avoid their relatively high overhead. Pools of 20 or less threads are common. As soon as all threads are occupied, any new connection is stalled. The server is effectively dead for everyone else. If you want to implement a chat that uses long-polling ajax requests to get real-time updates, you’d reach the limited at 20 concurrent connections. That’s a pretty small chat.

+
+
+

Greenlets to the rescue¶

+

Most servers limit the size of their worker pools to a relatively low number of concurrent threads, due to the high overhead involved in switching between and creating new threads. While threads are cheap compared to processes (forks), they are still expensive to create for each new connection.

+

The gevent module adds greenlets to the mix. Greenlets behave similar to traditional threads, but are very cheap to create. A gevent-based server can spawn thousands of greenlets (one for each connection) with almost no overhead. Blocking individual greenlets has no impact on the servers ability to accept new requests. The number of concurrent connections is virtually unlimited.

+

This makes creating asynchronous applications incredibly easy, because they look and feel like synchronous applications. A gevent-based server is actually not asynchronous, but massively multi-threaded. Here is an example:

+
from gevent import monkey; monkey.patch_all()
+
+from time import sleep
+from bottle import route, run
+
+@route('/stream')
+def stream():
+    yield 'START'
+    sleep(3)
+    yield 'MIDDLE'
+    sleep(5)
+    yield 'END'
+
+run(host='0.0.0.0', port=8080, server='gevent')
+
+
+

The first line is important. It causes gevent to monkey-patch most of Python’s blocking APIs to not block the current thread, but pass the CPU to the next greenlet instead. It actually replaces Python’s threading with gevent-based pseudo-threads. This is why you can still use time.sleep() which would normally block the whole thread. If you don’t feel comfortable with monkey-patching python built-ins, you can use the corresponding gevent functions (gevent.sleep() in this case).

+

If you run this script and point your browser to http://localhost:8080/stream, you should see START, MIDDLE, and END show up one by one (rather than waiting 8 seconds to see them all at once). It works exactly as with normal threads, but now your server can handle thousands of concurrent requests without any problems.

+
+

Note

+

Some browsers buffer a certain amount of data before they start rendering a +page. You might need to yield more than a few bytes to see an effect in +these browsers. Additionally, many browsers have a limit of one concurrent +connection per URL. If this is the case, you can use a second browser or a +benchmark tool (e.g. ab or httperf) to measure performance.

+
+
+
+

Event Callbacks¶

+

A very common design pattern in asynchronous frameworks (including tornado, twisted, node.js and friends) is to use non-blocking APIs and bind callbacks to asynchronous events. The socket object is kept open until it is closed explicitly to allow callbacks to write to the socket at a later point. Here is an example based on the tornado library:

+
class MainHandler(tornado.web.RequestHandler):
+    @tornado.web.asynchronous
+    def get(self):
+        worker = SomeAsyncWorker()
+        worker.on_data(lambda chunk: self.write(chunk))
+        worker.on_finish(lambda: self.finish())
+
+
+

The main benefit is that the request handler terminates early. The handling thread can move on and accept new requests while the callbacks continue to write to sockets of previous requests. This is how these frameworks manage to process a lot of concurrent requests with only a small number of OS threads.

+

With Gevent+WSGI, things are different: First, terminating early has no benefit because we have an unlimited pool of (pseudo)threads to accept new connections. Second, we cannot terminate early because that would close the socket (as required by WSGI). Third, we must return an iterable to conform to WSGI.

+

In order to conform to the WSGI standard, all we have to do is to return a body iterable that we can write to asynchronously. With the help of gevent.queue, we can simulate a detached socket and rewrite the previous example as follows:

+
@route('/fetch')
+def fetch():
+    body = gevent.queue.Queue()
+    worker = SomeAsyncWorker()
+    worker.on_data(lambda chunk: body.put(chunk))
+    worker.on_finish(lambda: body.put(StopIteration))
+    return body
+
+
+

From the server perspective, the queue object is iterable. It blocks if empty and stops as soon as it reaches StopIteration. This conforms to WSGI. On the application side, the queue object behaves like a non-blocking socket. You can write to it at any time, pass it around and even start a new (pseudo)thread that writes to it asynchronously. This is how long-polling is implemented most of the time.

+
+
+

Finally: WebSockets¶

+

Lets forget about the low-level details for a while and speak about WebSockets. Since you are reading this article, you probably know what WebSockets are: A bidirectional communication channel between a browser (client) and a web application (server).

+

Thankfully the gevent-websocket package does all the hard work for us. Here is a simple WebSocket endpoint that receives messages and just sends them back to the client:

+
from bottle import request, Bottle, abort
+app = Bottle()
+
+@app.route('/websocket')
+def handle_websocket():
+    wsock = request.environ.get('wsgi.websocket')
+    if not wsock:
+        abort(400, 'Expected WebSocket request.')
+
+    while True:
+        try:
+            message = wsock.receive()
+            wsock.send("Your message was: %r" % message)
+        except WebSocketError:
+            break
+
+from gevent.pywsgi import WSGIServer
+from geventwebsocket import WebSocketHandler, WebSocketError
+server = WSGIServer(("0.0.0.0", 8080), app,
+                    handler_class=WebSocketHandler)
+server.serve_forever()
+
+
+

The while-loop runs until the client closes the connection. You get the idea :)

+

The client-site JavaScript API is really straight forward, too:

+
<!DOCTYPE html>
+<html>
+<head>
+  <script type="text/javascript">
+    var ws = new WebSocket("ws://example.com:8080/websocket");
+    ws.onopen = function() {
+        ws.send("Hello, world");
+    };
+    ws.onmessage = function (evt) {
+        alert(evt.data);
+    };
+  </script>
+</head>
+</html>
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Tutorial: Todo-List Application

+

Next topic

+

Recipes

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html new file mode 100644 index 0000000..8b8aeef --- /dev/null +++ b/html/changelog.html @@ -0,0 +1,380 @@ + + + + + + + + + + Release Notes and Changelog — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Release Notes and Changelog¶

+
+

Release 0.11¶

+
    +
  • Native support for Python 2.x and 3.x syntax. No need to run 2to3 anymore.
  • +
  • Support for partial downloads (Range header) in static_file().
  • +
  • The new ResourceManager interface helps locating files bundled with an application.
  • +
  • Added a server adapter for waitress.
  • +
  • New Bottle.merge() method to install all routes from one application into another.
  • +
  • New BaseRequest.app property to get the application object that handles a request.
  • +
  • Added FormsDict.decode() to get an all-unicode version (needed by WTForms).
  • +
  • MultiDict and subclasses are now pickle-able.
  • +
+

API Changes

+
    +
  • Response.status is a read-write property that can be assigned either a numeric status code or a status string with a reason phrase (200 OK). The return value is now a string to better match existing APIs (WebOb, werkzeug). To be absolutely clear, you can use the read-only properties BaseResponse.status_code and BaseResponse.status_line.
  • +
+

API Deprecations

+
    +
  • SimpleTALTemplate is now deprecating. There seems to be no demand.
  • +
+
+
+

Release 0.10¶

+
    +
  • Plugin API v2
      +
    • To use the new API, set Plugin.api to 2.
    • +
    • Plugin.apply() receives a Route object instead of a context dictionary as second parameter. The new object offers some additional information and may be extended in the future.
    • +
    • Plugin names are considered unique now. The topmost plugin with a given name on a given route is installed, all other plugins with the same name are silently ignored.
    • +
    +
  • +
  • The Request/Response Objects +
  • +
  • Templates
      +
    • Added three new functions to the SimpleTemplate default namespace that handle undefined variables: stpl.defined(), stpl.get() and stpl.setdefault().
    • +
    • The default escape function for SimpleTemplate now additionally escapes single and double quotes.
    • +
    +
  • +
  • Routing
      +
    • A new route syntax (e.g. /object/<id:int>) and support for route wildcard filters.
    • +
    • Four new wildcard filters: int, float, path and re.
    • +
    +
  • +
  • Oher changes
      +
    • Added command line interface to load applications and start servers.
    • +
    • Introduced a ConfigDict that makes accessing configuration a lot easier (attribute access and auto-expanding namespaces).
    • +
    • Added support for raw WSGI applications to Bottle.mount().
    • +
    • Bottle.mount() parameter order changed.
    • +
    • Bottle.route() now accpets an import string for the callback parameter.
    • +
    • Dropped Gunicorn 0.8 support. Current supported version is 0.13.
    • +
    • Added custom options to Gunicorn server.
    • +
    • Finally dropped support for type filters. Replace with a custom plugin of needed.
    • +
    +
  • +
+
+
+

Release 0.9¶

+

Whats new?

+
    +
  • A brand new plugin-API. See Plugins and Plugin Development Guide for details.
  • +
  • The route() decorator got a lot of new features. See Bottle.route() for details.
  • +
  • New server adapters for gevent, meinheld and bjoern.
  • +
  • Support for SimpleTAL templates.
  • +
  • Better runtime exception handling for mako templates in debug mode.
  • +
  • Lots of documentation, fixes and small improvements.
  • +
  • A new Request.urlparts property.
  • +
+

Performance improvements

+
    +
  • The Router now special-cases wsgi.run_once environments to speed up CGI.
  • +
  • Reduced module load time by ~30% and optimized template parser. See 8ccb2d, f72a7c and b14b9a for details.
  • +
  • Support for “App Caching” on Google App Engine. See af93ec.
  • +
  • Some of the rarely used or deprecated features are now plugins that avoid overhead if the feature is not used.
  • +
+

API changes

+

This release is mostly backward compatible, but some APIs are marked deprecated now and will be removed for the next release. Most noteworthy:

+
    +
  • The static route parameter is deprecated. You can escape wild-cards with a backslash.
  • +
  • Type-based output filters are deprecated. They can easily be replaced with plugins.
  • +
+
+
+

Release 0.8¶

+

API changes

+

These changes may break compatibility with previous versions.

+
    +
  • The built-in Key/Value database is not available anymore. It is marked deprecated since 0.6.4
  • +
  • The Route syntax and behaviour changed.
      +
    • Regular expressions must be encapsulated with #. In 0.6 all non-alphanumeric characters not present in the regular expression were allowed.
    • +
    • Regular expressions not part of a route wildcard are escaped automatically. You don’t have to escape dots or other regular control characters anymore. In 0.6 the whole URL was interpreted as a regular expression. You can use anonymous wildcards (/index:#(\.html)?#) to achieve a similar behaviour.
    • +
    +
  • +
  • The BreakTheBottle exception is gone. Use HTTPResponse instead.
  • +
  • The SimpleTemplate engine escapes HTML special characters in {{bad_html}} expressions automatically. Use the new {{!good_html}} syntax to get old behaviour (no escaping).
  • +
  • The SimpleTemplate engine returns unicode strings instead of lists of byte strings.
  • +
  • bottle.optimize() and the automatic route optimization is obsolete.
  • +
  • Some functions and attributes were renamed:
      +
    • Request._environ is now Request.environ
    • +
    • Response.header is now Response.headers
    • +
    • default_app() is obsolete. Use app() instead.
    • +
    +
  • +
  • The default redirect() code changed from 307 to 303.
  • +
  • Removed support for @default. Use @error(404) instead.
  • +
+

New features

+

This is an incomplete list of new features and improved functionality.

+
    +
  • The Request object got new properties: Request.body, Request.auth, Request.url, Request.header, Request.forms, Request.files.
  • +
  • The Response.set_cookie() and Request.get_cookie() methods are now able to encode and decode python objects. This is called a secure cookie because the encoded values are signed and protected from changes on client side. All pickle-able data structures are allowed.
  • +
  • The new Router class drastically improves performance for setups with lots of dynamic routes and supports named routes (named route + dict = URL string).
  • +
  • It is now possible (and recommended) to return HTTPError and HTTPResponse instances or other exception objects instead of raising them.
  • +
  • The new function static_file() equals send_file() but returns a HTTPResponse or HTTPError instead of raising it. send_file() is deprecated.
  • +
  • New get(), post(), put() and delete() decorators.
  • +
  • The SimpleTemplate engine got full unicode support.
  • +
  • Lots of non-critical bugfixes.
  • +
+
+
+
+

Contributors¶

+

Bottle is written and maintained by Marcel Hellkamp <marc@bottlepy.org>.

+

Thanks to all the people who found bugs, sent patches, spread the word, helped each other on the mailing-list and made this project possible. I hope the following (alphabetically sorted) list is complete. If you miss your name on that list (or want your name removed) please tell me or add it yourself.

+
    +
  • acasajus
  • +
  • Adam R. Smith
  • +
  • Alexey Borzenkov
  • +
  • Alexis Daboville
  • +
  • Anton I. Sipos
  • +
  • Anton Kolechkin
  • +
  • apexi200sx
  • +
  • apheage
  • +
  • BillMa
  • +
  • Brad Greenlee
  • +
  • Brandon Gilmore
  • +
  • Branko Vukelic
  • +
  • Brian Sierakowski
  • +
  • Brian Wickman
  • +
  • Carl Scharenberg
  • +
  • Damien Degois
  • +
  • David Buxton
  • +
  • Duane Johnson
  • +
  • fcamel
  • +
  • Frank Murphy
  • +
  • Frederic Junod
  • +
  • goldfaber3012
  • +
  • Greg Milby
  • +
  • gstein
  • +
  • Ian Davis
  • +
  • Itamar Nabriski
  • +
  • Iuri de Silvio
  • +
  • Jaimie Murdock
  • +
  • Jeff Nichols
  • +
  • Jeremy Kelley
  • +
  • joegester
  • +
  • Johannes Krampf
  • +
  • Jonas Haag
  • +
  • Joshua Roesslein
  • +
  • Karl
  • +
  • Kraken
  • +
  • Kyle Fritz
  • +
  • m35
  • +
  • Marcos Neves
  • +
  • masklinn
  • +
  • Michael Labbe
  • +
  • Michael Soulier
  • +
  • reddit
  • +
  • Robert Rollins
  • +
  • rogererens
  • +
  • rwxrwx
  • +
  • Santiago Gala
  • +
  • Sean M. Collins
  • +
  • Sebastian Wollrath
  • +
  • Seth
  • +
  • Sigurd Høgsbro
  • +
  • Stuart Rackham
  • +
  • Sun Ning
  • +
  • Tomás A. Schertel
  • +
  • Tristan Zajonc
  • +
  • voltron
  • +
  • Wieland Hoffmann
  • +
  • zombat
  • +
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Frequently Asked Questions

+

Next topic

+

Developer Notes

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/contact.html b/html/contact.html new file mode 100644 index 0000000..a49f880 --- /dev/null +++ b/html/contact.html @@ -0,0 +1,181 @@ + + + + + + + + + + Contact — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Contact¶

+

About the Autor

+Photo +

Hi, I’m Marcel Hellkamp (aka defnull), author of Bottle and the guy behind this website. I’m 27 years old and studying computer science at the Georg-August-University in Göttingen, Germany. Python is my favorite language, but I also code in ruby and JavaScript a lot. Watch me on twitter or visit my profile at GitHub to get in contact. A mailinglist is open for Bottle related questions, too.

+

About Bottle

+

This is my first open source project so far. It started and a small experiment but soon got so much positive feedback I decided to make something real out of it. Here it is.

+

Impressum und Kontaktdaten

+

(This is required by German law)

+

Die Nutzung der folgenden Kontaktdaten ist ausschließlich für die +Kontaktaufnahme mit dem Betreiber dieser Webseite bei rechtlichen +Problemen vorgesehen. Insbesondere die Nutzung zu Werbe- oder ähnlichen +Zwecken ist ausdrücklich untersagt.

+
+
    +
  • Betreiber: Marcel Hellkamp
  • +
  • Ort: D - 37075 Göttingen
  • +
  • Strasse: Theodor-Heuss Strasse 13
  • +
  • Telefon: +49 (0) 551 20005915
  • +
  • E-Mail: marc at gsites dot de
  • +
+
+
+ + + +
+
+
+
+
+ + + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/deployment.html b/html/deployment.html new file mode 100644 index 0000000..ec4e1d6 --- /dev/null +++ b/html/deployment.html @@ -0,0 +1,393 @@ + + + + + + + + + + Deployment — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Deployment¶

+

The bottle run() function, when called without any parameters, starts a local development server on port 8080. You can access and test your application via http://localhost:8080/ if you are on the same host.

+

To get your application available to the outside world, specify the IP of the interface the server should listen to (e.g. run(host='192.168.0.1')) or let the server listen to all interfaces at once (e.g. run(host='0.0.0.0')). The listening port can be changed in a similar way, but you need root or admin rights to choose a port below 1024. Port 80 is the standard for HTTP servers:

+
run(host='0.0.0.0', port=80) # Listen to HTTP requests on all interfaces
+
+
+
+

Server Options¶

+

The built-in default server is based on wsgiref WSGIServer. This non-threading HTTP server is perfectly fine for development and early production, but may become a performance bottleneck when server load increases. There are three ways to eliminate this bottleneck:

+
    +
  • Use a different server that is either multi-threaded or asynchronous.
  • +
  • Start multiple server processes and spread the load with a load-balancer.
  • +
  • Do both.
  • +
+

Multi-threaded servers are the ‘classic’ way to do it. They are very robust, reasonably fast and easy to manage. As a drawback, they can only handle a limited number of connections at the same time and utilize only one CPU core due to the “Global Interpreter Lock” (GIL). This does not hurt most applications, they are waiting for network IO most of the time anyway, but may slow down CPU intensive tasks (e.g. image processing).

+

Asynchronous servers are very fast, can handle a virtually unlimited number of concurrent connections and are easy to manage, but can get a bit tricky. To take full advantage of their potential, you need to design your application accordingly and understand the concepts of the specific server.

+

Multi-processing (forking) servers are not limited by the GIL and utilize more than one CPU core, but make communication between server instances more expensive. You need a database or external message query to share state between processes, or design your application so that it does not need any shared state. The setup is also a bit more complicated, but there are good tutorials available.

+
+
+

Switching the Server Backend¶

+

The easiest way to increase performance is to install a multi-threaded server library like paste or cherrypy and tell Bottle to use that instead of the single-threaded server:

+
bottle.run(server='paste')
+
+
+

Bottle ships with a lot of ready-to-use adapters for the most common WSGI servers and automates the setup process. Here is an incomplete list:

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameHomepageDescription
cgi Run as CGI script
flupflupRun as FastCGI process
gaegaeHelper for Google App Engine deployments
wsgirefwsgirefSingle-threaded default server
cherrypycherrypyMulti-threaded and very stable
pastepasteMulti-threaded, stable, tried and tested
rocketrocketMulti-threaded
waitresswaitressMulti-threaded, poweres Pyramid
gunicorngunicornPre-forked, partly written in C
eventleteventletAsynchronous framework with WSGI support.
geventgeventAsynchronous (greenlets)
dieseldieselAsynchronous (greenlets)
fapws3fapws3Asynchronous (network side only), written in C
tornadotornadoAsynchronous, powers some parts of Facebook
twistedtwistedAsynchronous, well tested but... twisted
meinheldmeinheldAsynchronous, partly written in C
bjoernbjoernAsynchronous, very fast and written in C
auto Automatically selects an available server adapter
+

The full list is available through server_names.

+

If there is no adapter for your favorite server or if you need more control over the server setup, you may want to start the server manually. Refer to the server documentation on how to run WSGI applications. Here is an example for paste:

+
application = bottle.default_app()
+from paste import httpserver
+httpserver.serve(application, host='0.0.0.0', port=80)
+
+
+
+

Apache mod_wsgi¶

+

Instead of running your own HTTP server from within Bottle, you can attach Bottle applications to an Apache server using mod_wsgi.

+

All you need is an app.wsgi file that provides an application object. This object is used by mod_wsgi to start your application and should be a WSGI-compatible Python callable.

+

File /var/www/yourapp/app.wsgi:

+
# Change working directory so relative paths (and template lookup) work again
+os.chdir(os.path.dirname(__file__))
+
+import bottle
+# ... build or import your bottle application here ...
+# Do NOT use bottle.run() with mod_wsgi
+application = bottle.default_app()
+
+
+

The Apache configuration may look like this:

+
<VirtualHost *>
+    ServerName example.com
+
+    WSGIDaemonProcess yourapp user=www-data group=www-data processes=1 threads=5
+    WSGIScriptAlias / /var/www/yourapp/app.wsgi
+
+    <Directory /var/www/yourapp>
+        WSGIProcessGroup yourapp
+        WSGIApplicationGroup %{GLOBAL}
+        Order deny,allow
+        Allow from all
+    </Directory>
+</VirtualHost>
+
+
+
+

Google AppEngine¶

+

+New in version 0.9.

+

The gae server adapter is used to run applications on Google App Engine. It works similar to the cgi adapter in that it does not start a new HTTP server, but prepares and optimizes your application for Google App Engine and makes sure it conforms to their API:

+
bottle.run(server='gae') # No need for a host or port setting.
+
+
+

It is always a good idea to let GAE serve static files directly. Here is example for a working app.yaml:

+
application: myapp
+version: 1
+runtime: python
+api_version: 1
+
+handlers:
+- url: /static
+  static_dir: static
+
+- url: /.*
+  script: myapp.py
+
+
+
+

Load Balancer (Manual Setup)¶

+

A single Python process can utilize only one CPU at a time, even if there are more CPU cores available. The trick is to balance the load between multiple independent Python processes to utilize all of your CPU cores.

+

Instead of a single Bottle application server, you start one instance for each CPU core available using different local port (localhost:8080, 8081, 8082, ...). You can choose any server adapter you want, even asynchronous ones. Then a high performance load balancer acts as a reverse proxy and forwards each new requests to a random port, spreading the load between all available back-ends. This way you can use all of your CPU cores and even spread out the load between different physical servers.

+

One of the fastest load balancers available is Pound but most common web servers have a proxy-module that can do the work just fine.

+

Pound example:

+
ListenHTTP
+    Address 0.0.0.0
+    Port    80
+
+    Service
+        BackEnd
+            Address 127.0.0.1
+            Port    8080
+        End
+        BackEnd
+            Address 127.0.0.1
+            Port    8081
+        End
+    End
+End
+
+

Apache example:

+
<Proxy balancer://mycluster>
+BalancerMember http://192.168.1.50:80
+BalancerMember http://192.168.1.51:80
+</Proxy>
+ProxyPass / balancer://mycluster
+
+

Lighttpd example:

+
server.modules += ( "mod_proxy" )
+proxy.server = (
+    "" => (
+        "wsgi1" => ( "host" => "127.0.0.1", "port" => 8080 ),
+        "wsgi2" => ( "host" => "127.0.0.1", "port" => 8081 )
+    )
+)
+
+
+
+
+

Good old CGI¶

+

A CGI server starts a new process for each request. This adds a lot of overhead but is sometimes the only option, especially on cheap hosting packages. The cgi server adapter does not actually start a CGI server, but transforms your bottle application into a valid CGI application:

+
bottle.run(server='cgi')
+
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + + + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/development.html b/html/development.html new file mode 100644 index 0000000..4e78ba9 --- /dev/null +++ b/html/development.html @@ -0,0 +1,328 @@ + + + + + + + + + + Developer Notes — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Developer Notes¶

+

This document is intended for developers and package maintainers interested in the bottle development and release workflow. If you want to contribute, you are just right!

+
+

Get involved¶

+

There are several ways to join the community and stay up to date. Here are some of them:

+ +
+
+

Get the Sources¶

+

The bottle development repository and the issue tracker are both hosted at github. If you plan to contribute, it is a good idea to create an account there and fork the main repository. This way your changes and ideas are visible to other developers and can be discussed openly. Even without an account, you can clone the repository or just download the latest development version as a source archive.

+
    +
  • git: git clone git://github.com/defnull/bottle.git
  • +
  • git/https: git clone https://github.com/defnull/bottle.git
  • +
  • Download: Development branch as tar archive or zip file.
  • +
+
+
+

Releases and Updates¶

+

Bottle is released at irregular intervals and distributed through PyPi. Release candidates and bugfix-revisions of outdated releases are only available from the git repository mentioned above. Some Linux distributions may offer packages for outdated releases, though.

+

The Bottle version number splits into three parts (major.minor.revision). These are not used to promote new features but to indicate important bug-fixes and/or API changes. Critical bugs are fixed in at least the two latest minor releases and announced in all available channels (mailinglist, twitter, github). Non-critical bugs or features are not guaranteed to be backported. This may change in the future, through.

+
+
Major Release (x.0)
+
The major release number is increased on important milestones or updates that completely break backward compatibility. You probably have to work over your entire application to use a new release. These releases are very rare, through.
+
Minor Release (x.y)
+
The minor release number is increased on updates that change the API or behaviour in some way. You might get some depreciation warnings any may have to tweak some configuration settings to restore the old behaviour, but in most cases these changes are designed to be backward compatible for at least one minor release. You should update to stay up do date, but don’t have to. An exception is 0.8, which will break backward compatibility hard. (This is why 0.7 was skipped). Sorry about that.
+
Revision (x.y.z)
+
The revision number is increased on bug-fixes and other patches that do not change the API or behaviour. You can safely update without editing your application code. In fact, you really should as soon as possible, because important security fixes are released this way.
+
Pre-Release Versions
+
Release candidates are marked by an rc in their revision number. These are API stable most of the time and open for testing, but not officially released yet. You should not use these for production.
+
+
+
+

Repository Structure¶

+

The source repository is structured as follows:

+
+
master branch
+
This is the integration, testing and development branch. All changes that are planned to be part of the next release are merged and tested here.
+
release-x.y branches
+
As soon as the master branch is (almost) ready for a new release, it is branched into a new release branch. This “release candidate” is feature-frozen but may receive bug-fixes and last-minute changes until it is considered production ready and officially released. From that point on it is called a “support branch” and still receives bug-fixes, but only important ones. The revision number is increased on each push to these branches, so you can keep up with important changes.
+
bugfix_name-x.y branches
+
These branches are only temporary and used to develop and share non-trivial bug-fixes for existing releases. They are merged into the corresponding release branch and deleted soon after that.
+
Feature branches
+
All other branches are feature branches. These are based on the master branch and only live as long as they are still active and not merged back into master.
+
+

What does this mean for a developer?

+

If you want to add a feature, create a new branch from master. If you want to fix a bug, branch release-x.y for each affected release. Please use a separate branch for each feature or bug to make integration as easy as possible. Thats all. There are git workflow examples at the bottom of this page.

+

Oh, and never ever change the release number. We’ll do that on integration. You never know in which order we pull pending requests anyway :)

+

What does this mean for a maintainer ?

+

Watch the tags (and the mailing list) for bug-fixes and new releases. If you want to fetch a specific release from the git repository, trust the tags, not the branches. A branch may contain changes that are not released yet, but a tag marks the exact commit which changed the version number.

+
+
+

Submitting Patches¶

+

The best way to get your changes integrated into the main development branch is to fork the main repository at github, create a new feature-branch, apply your changes and send a pull-request. Further down this page is a small collection of git workflow examples that may guide you. Submitting git-compatible patches to the mailing list is fine too. In any case, please follow some basic rules:

+
    +
  • Documentation: Tell us what your patch does. Comment your code. If you introduced a new feature, add to the documentation so others can learn about it.
  • +
  • Test: Write tests to prove that your code works as expected and does not break anything. If you fixed a bug, write at least one test-case that triggers the bug. Make sure that all tests pass before you submit a patch.
  • +
  • One patch at a time: Only fix one bug or add one feature at a time. Design your patches so that they can be applyed as a whole. Keep your patches clean, small and focused.
  • +
  • Sync with upstream: If the upstream/master branch changed while you were working on your patch, rebase or pull to make sure that your patch still applies without conflicts.
  • +
+
+
+

Building the Documentation¶

+

You need a recent version of Sphinx to build the documentation. The recommended way is to install virtualenv using your distribution package repository and install sphinx manually to get an up-to-date version.

+
# Install prerequisites
+which virtualenv || sudo apt-get install python-virtualenv
+virtualenv --no-site-dependencies venv
+./venv/pip install -U sphinx
+
+# Clone or download bottle from github
+git clone https://github.com/defnull/bottle.git
+
+# Activate build environment
+source ./venv/bin/activate
+
+# Build HTML docs
+cd bottle/docs
+make html
+
+# Optional: Install prerequisites for PDF generation
+sudo apt-get install texlive-latex-extra \
+                     texlive-latex-recommended \
+                     texlive-fonts-recommended
+
+# Optional: Build the documentation as PDF
+make latex
+cd ../build/docs/latex
+make pdf
+
+
+
+
+

GIT Workflow Examples¶

+

The following examples assume that you have an (free) github account. This is not mandatory, but makes things a lot easier.

+

First of all you need to create a fork (a personal clone) of the official repository. To do this, you simply click the “fork” button on the bottle project page. When the fork is done, you will be presented with a short introduction to your new repository.

+

The fork you just created is hosted at github and read-able by everyone, but write-able only by you. Now you need to clone the fork locally to actually make changes to it. Make sure you use the private (read-write) URL and not the public (read-only) one:

+
git clone git@github.com:your_github_account/bottle.git
+
+

Once the clone is complete your repository will have a remote named “origin” that points to your fork on github. Don’t let the name confuse you, this does not point to the original bottle repository, but to your own fork. To keep track of the official repository, add another remote named “upstream”:

+
cd bottle
+git remote add upstream git://github.com/defnull/bottle.git
+git fetch upstream
+
+

Note that “upstream” is a public clone URL, which is read-only. You cannot push changes directly to it. Instead, we will pull from your public repository. This is described later.

+

Submit a Feature

+

New features are developed in separate feature-branches to make integration easy. Because they are going to be integrated into the master branch, they must be based on upstream/master. To create a new feature-branch, type the following:

+
git checkout -b cool_feature upstream/master
+
+

Now implement your feature, write tests, update the documentation, make sure that all tests pass and commit your changes:

+
git commit -a -m "Cool Feature"
+
+

If the upstream/master branch changed in the meantime, there may be conflicts with your changes. To solve these, ‘rebase’ your feature-branch onto the top of the updated upstream/master branch:

+
git fetch upstream
+git rebase upstream
+
+

This is equivalent to undoing all your changes, updating your branch to the latest version and reapplying all your patches again. If you released your branch already (see next step), this is not an option because it rewrites your history. You can do a normal pull instead. Resolve any conflicts, run the tests again and commit.

+

Now you are almost ready to send a pull request. But first you need to make your feature-branch public by pushing it to your github fork:

+
git push origin cool_feature
+
+

After you’ve pushed your commit(s) you need to inform us about the new feature. One way is to send a pull-request using github. Another way would be to start a thread in the mailing-list, which is recommended. It allows other developers to see and discuss your patches and you get some feedback for free :)

+

If we accept your patch, we will integrate it into the official development branch and make it part of the next release.

+

Fix a Bug

+

The workflow for bug-fixes is very similar to the one for features, but there are some differences:

+
    +
  1. Branch off of the affected release branches instead of just the development branch.
  2. +
  3. Write at least one test-case that triggers the bug.
  4. +
  5. Do this for each affected branch including upstream/master if it is affected. git cherry-pick may help you reducing repetitive work.
  6. +
  7. Name your branch after the release it is based on to avoid confusion. Examples: my_bugfix-x.y or my_bugfix-dev.
  8. +
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Release Notes and Changelog

+

Next topic

+

Plugin Development Guide

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/faq.html b/html/faq.html new file mode 100644 index 0000000..0328d76 --- /dev/null +++ b/html/faq.html @@ -0,0 +1,235 @@ + + + + + + + + + + Frequently Asked Questions — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Frequently Asked Questions¶

+
+

About Bottle¶

+
+

Is bottle suitable for complex applications?¶

+

Bottle is a micro framework designed for prototyping and building small web applications and services. It stays out of your way and allows you to get things done fast, but misses some advanced features and ready-to-use solutions found in other frameworks (MVC, ORM, form validation, scaffolding, XML-RPC). Although it is possible to add these features and build complex applications with Bottle, you should consider using a full-stack Web framework like pylons or paste instead.

+
+
+
+

Common Problems and Pitfalls¶

+
+

“Template Not Found” in mod_wsgi/mod_python¶

+

Bottle searches in ./ and ./views/ for templates. In a mod_python or mod_wsgi environment, the working directory (./) depends on your Apache settings. You should add an absolute path to the template search path:

+
bottle.TEMPLATE_PATH.insert(0,'/absolut/path/to/templates/')
+
+
+

so bottle searches the right paths.

+
+
+

Dynamic Routes and Slashes¶

+

In dynamic route syntax, a placeholder token (:name) matches everything up to the next slash. This equals to [^/]+ in regular expression syntax. To accept slashes too, you have to add a custom regular pattern to the placeholder. An example: /images/:filepath#.*# would match /images/icons/error.png but /images/:filename won’t.

+
+
+

Problems with reverse proxies¶

+

Redirects and url-building only works if bottle knows the public address and location of your application. If you run bottle locally behind a reverse proxy or load balancer, some information might get lost along the way. For example, the wsgi.url_scheme value or the Host header might reflect the local request by your proxy, not the real request by the client. Here is a small WSGI middleware snippet that helps to fix these values:

+
def fix_environ_middleware(app):
+  def fixed_app(environ, start_response):
+    environ['wsgi.url_scheme'] = 'https'
+    environ['HTTP_X_FORWARDED_HOST'] = 'example.com'
+    return app(environ, start_response)
+  return https_app
+
+app = bottle.default_app()
+app.wsgi = fix_environ_middleware(app.wsgi)
+
+
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Recipes

+

Next topic

+

Release Notes and Changelog

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/genindex.html b/html/genindex.html new file mode 100644 index 0000000..9f6fc32 --- /dev/null +++ b/html/genindex.html @@ -0,0 +1,1094 @@ + + + + + + + + + + + + Index — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ _ + | A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | Y + +
+

_

+ + + +
+ +
__call__() (Plugin method) +
+ +
+ +
__init__() (BaseTemplate method) +
+ +
+ +

A

+ + + +
+ +
add_header() (BaseResponse method) +
+ + +
add_path() (ResourceManager method) +
+ + +
add_route() (Bottle method) +
+ + +
all_plugins() (Route method) +
+ + +
api (Plugin attribute) +
+ + +
app (BaseRequest attribute) +
+ +
+ +
(Route attribute) +
+ +
+
+ +
app() (in module bottle) +
+ + +
append() (MultiDict method) +
+ + +
apply() (Plugin method) +
+ + +
AppStack (class in bottle) +
+ + +
auth (BaseRequest attribute) +
+ +
+ +

B

+ + + +
+ +
BaseRequest (class in bottle) +
+ + +
BaseResponse (class in bottle) +
+ + +
BaseTemplate (class in bottle) +
+ + +
bind() (LocalRequest method) +
+ +
+ +
body (BaseRequest attribute) +
+ +
+ +
(LocalResponse attribute) +
+ +
+ +
Bottle (class in bottle) +
+ + +
bottle (module), [1], [2], [3], [4], [5] +
+ + +
BottleException +
+ +
+ +

C

+ + + +
+ +
cache (ResourceManager attribute) +
+ + +
callback +
+ +
+ +
(Route attribute) +
+ +
+ +
catchall (Bottle attribute) +
+ + +
cgikeys (WSGIHeaderDict attribute) +
+ + +
charset (BaseResponse attribute) +
+ + +
close() (Bottle method) +
+ +
+ +
(Plugin method) +
+ +
+ +
config (Bottle attribute) +
+ +
+ +
(Route attribute) +
+ +
+ +
content_length (BaseRequest attribute) +
+ +
+ +
(BaseResponse attribute) +
+ +
+
+ +
content_type (BaseRequest attribute) +
+ +
+ +
(BaseResponse attribute) +
+ +
+ +
cookie_decode() (in module bottle) +
+ + +
cookie_encode() (in module bottle) +
+ + +
cookie_is_encoded() (in module bottle) +
+ + +
cookies (BaseRequest attribute) +
+ + +
COOKIES (BaseRequest attribute) +
+ +
+ +
(BaseResponse attribute) +
+ +
+ +
copy() (BaseRequest method) +
+ +
+ +
(BaseResponse method) +
+ +
+
+ +

D

+ + + +
+ +
debug() (in module bottle) +
+ + +
decode() (FormsDict method) +
+ + +
decorator +
+ + +
default_app() (in module bottle) +
+ +
+ +
defined() (in module stpl) +
+ + +
delete() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+ +
delete_cookie() (BaseResponse method) +
+ +
+ +

E

+ + + +
+ +
environ +
+ +
+ +
(BaseRequest attribute) +
+ + +
(LocalRequest attribute) +
+ +
+
+ +
error() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+
+ +

F

+ + + +
+ +
files (BaseRequest attribute) +
+ + +
forms (BaseRequest attribute) +
+ +
+ +
FormsDict (class in bottle) +
+ + +
fullpath (BaseRequest attribute) +
+ +
+ +

G

+ + + +
+ +
GET (BaseRequest attribute) +
+ + +
get() (Bottle method) +
+ +
+ +
(MultiDict method) +
+ + +
(in module bottle) +
+ + +
(in module stpl) +
+ +
+ +
get_cookie() (BaseRequest method) +
+ + +
get_header() (BaseRequest method) +
+ +
+ +
(BaseResponse method) +
+ +
+ +
get_url() (Bottle method) +
+ +
+ +
getall() (MultiDict method) +
+ + +
getlist() (MultiDict method) +
+ + +
getone() (MultiDict method) +
+ + +
global_config() (bottle.BaseTemplate class method) +
+ +
+ +

H

+ + + +
+ +
handle() (Bottle method) +
+ + +
handler function +
+ + +
HeaderDict (class in bottle) +
+ + +
headerlist (BaseResponse attribute) +
+ + +
headers (BaseRequest attribute) +
+ +
+ +
(BaseResponse attribute) +
+ +
+
+ +
hook() (Bottle method) +
+ + +
HTTP_CODES (in module bottle) +
+ + +
HTTPError +
+ + +
HTTPResponse +
+ +
+ +

I

+ + + +
+ +
input_encoding (FormsDict attribute) +
+ + +
install() (Bottle method) +
+ + +
is_ajax (BaseRequest attribute) +
+ +
+ +
is_xhr (BaseRequest attribute) +
+ + +
iter_headers() (BaseResponse method) +
+ +
+ +

J

+ + +
+ +
json (BaseRequest attribute) +
+ +
+ +

L

+ + + +
+ +
load() (in module bottle) +
+ + +
load_app() (in module bottle) +
+ + +
LocalRequest (class in bottle) +
+ +
+ +
LocalResponse (class in bottle) +
+ + +
lookup() (ResourceManager method) +
+ +
+ +

M

+ + + +
+ +
match() (Bottle method) +
+ + +
MAX_PARAMS (BaseRequest attribute) +
+ + +
MEMFILE_MAX (BaseRequest attribute) +
+ + +
merge() (Bottle method) +
+ +
+ +
method (BaseRequest attribute) +
+ +
+ +
(Route attribute) +
+ +
+ +
mount() (Bottle method) +
+ + +
MultiDict (class in bottle) +
+ +
+ +

N

+ + +
+ +
name (Plugin attribute) +
+ +
+ +
(Route attribute) +
+ +
+
+ +

O

+ + + +
+ +
open() (ResourceManager method) +
+ +
+ +
output (HTTPResponse attribute) +
+ +
+ +

P

+ + + +
+ +
params (BaseRequest attribute) +
+ + +
parse_auth() (in module bottle) +
+ + +
parse_date() (in module bottle) +
+ + +
path (BaseRequest attribute) +
+ +
+ +
(ResourceManager attribute) +
+ +
+ +
path_shift() (BaseRequest method) +
+ +
+ +
(in module bottle) +
+ +
+ +
Plugin (class in bottle) +
+ + +
plugins (Route attribute) +
+ +
+ +
pop() (AppStack method) +
+ + +
POST (BaseRequest attribute) +
+ + +
post() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+ +
prepare() (BaseTemplate method) +
+ +
+ +
(Route method) +
+ +
+ +
push() (AppStack method) +
+ + +
put() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+
+ +

Q

+ + + +
+ +
query (BaseRequest attribute) +
+ +
+ +
query_string (BaseRequest attribute) +
+ +
+ +

R

+ + + +
+ +
raw() (WSGIHeaderDict method) +
+ + +
recode_unicode (FormsDict attribute) +
+ + +
remote_addr (BaseRequest attribute) +
+ + +
remote_route (BaseRequest attribute) +
+ + +
render() (BaseTemplate method) +
+ +
+ +
(SimpleTemplate method) +
+ +
+ +
replace() (MultiDict method) +
+ + +
Request (in module bottle) +
+ + +
request (in module bottle) +
+ + +
reset() (Bottle method) +
+ +
+ +
(Route method) +
+ +
+
+ +
ResourceManager (class in bottle) +
+ + +
resources (Bottle attribute) +
+ + +
response (in module bottle) +
+ + +
Response (in module bottle) +
+ + +
Route (class in bottle) +
+ + +
route() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+ +
rule (Route attribute) +
+ + +
run() (Bottle method) +
+ +
+ +
(in module bottle) +
+ +
+
+ +

S

+ + + +
+ +
script_name (BaseRequest attribute) +
+ + +
search() (bottle.BaseTemplate class method) +
+ + +
set_cookie() (BaseResponse method) +
+ + +
set_header() (BaseResponse method) +
+ + +
setdefault() (in module stpl) +
+ + +
setup() (Plugin method) +
+ + +
SimpleTemplate (class in bottle) +
+ +
+ +
skiplist (Route attribute) +
+ + +
source directory +
+ + +
split_comment() (bottle.SimpleTemplate class method) +
+ + +
status (BaseResponse attribute) +
+ + +
status_code (BaseResponse attribute) +
+ + +
status_line (BaseResponse attribute) +
+ +
+ +

T

+ + +
+ +
template() (in module bottle) +
+ +
+ +

U

+ + + +
+ +
uninstall() (Bottle method) +
+ + +
url (BaseRequest attribute) +
+ +
+ +
urlparts (BaseRequest attribute) +
+ +
+ +

V

+ + +
+ +
view() (in module bottle) +
+ +
+ +

W

+ + + +
+ +
wsgi() (Bottle method) +
+ +
+ +
WSGIHeaderDict (class in bottle) +
+ +
+ +

Y

+ + +
+ +
yieldroutes() (in module bottle) +
+ +
+ + + +
+
+
+
+
+ + + + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..34a8abd --- /dev/null +++ b/html/index.html @@ -0,0 +1,386 @@ + + + + + + + + + + Bottle: Python Web Framework — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Bottle: Python Web Framework¶

+

Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library.

+
    +
  • Routing: Requests to function-call mapping with support for clean and dynamic URLs.
  • +
  • Templates: Fast and pythonic built-in template engine and support for mako, jinja2 and cheetah templates.
  • +
  • Utilities: Convenient access to form data, file uploads, cookies, headers and other HTTP-related metadata.
  • +
  • Server: Built-in HTTP development server and support for paste, fapws3, bjoern, Google App Engine, cherrypy or any other WSGI capable HTTP server.
  • +
+

Example: “Hello World” in a bottle

+
from bottle import route, run, template
+
+@route('/hello/:name')
+def index(name='World'):
+    return template('<b>Hello {{name}}</b>!', name=name)
+
+run(host='localhost', port=8080)
+
+
+

Run this script or paste it into a Python console, then point your browser to http://localhost:8080/hello/world. That’s it.

+

Download and Install

+

Install the latest stable release via PyPi (easy_install -U bottle) or download bottle.py (unstable) into your project directory. There are no hard [1] dependencies other than the Python standard library. Bottle runs with Python 2.5+ and 3.x.

+ + + +
+

License¶

+

Code and documentation are available according to the MIT License:

+
Copyright (c) 2012, Marcel Hellkamp.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+

The Bottle logo however is NOT covered by that license. It is allowed to +use the logo as a link to the bottle homepage or in direct context with +the unmodified library. In all other cases please ask first.

+

Footnotes

+ + + + + +
[1]Usage of the template or server adapter classes of course requires the corresponding template or server modules.
+
+
+ + + +
+
+
+
+
+

+ Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. +

+

Some Links

+ +

Installation

+

Install Bottle with pip install bottle or download the source package at PyPI.

+

Documentation

+

+ Download this documentation as PDF or HTML (zip) for offline use. +

+

Sources

+

Browse the sources at GitHub.

+

Other Releases

+ + + + + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/objects.inv b/html/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..9b53aed5024714b6f060da069575c1d13e3b9add GIT binary patch literal 1757 zcmV<31|s<*AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkHZ*+8Q zWeOu8R%LQ?X>V>iATSCeAXI2&AaZ4GVQFq;WpW^IW*~HEX>%ZEX>4U6X>%ZBZ*6dL zWpi_7WFU2OX>MmAdTeQ8E(&? zmH5j&-I`W@JIZf2Ib>2Z{3E3M0fnLd&9$s4q8St7#Ik3KY{}|efKJX$omn1!euoH;aulSIBg&OeAye^VV))s2JsbtRU9A4&%>ay+s;dPUP%o_p8 zy?Zno)$m^fCSdhPCv?Xwo2nWmYXj@LPbHv!C;4#th2h&M(Gxz$FXrs|Dux)Sq zvN)%IPY%Cl#+-a|>*Wz7XVwV2WlF7^yYqs{jZ%VV%mrt>s2>LQ$=wbU)hg68&4Go1ta_LKXox`_Lpe zkN1gJnOxOEr3AAfKRxwgqh=0D$V-Koo~w?}$5{1GM(sjKV^~KdZ|6@ZwK2eSR?da} zv(B+cFW~&MK^R&j1vX^(oA1A$NKS8dYKkHlkvk{m@)V}39+trzTg7iC3@G1uS)YAo0myaLZ%xek&Mt1(C0mh`}CED;(nl$9h@P2H;) z&An5d!_Ck1@#e?P;TWs=%g_?n`+NVAfokK3Dlq)98lpgWT1+Ey7bv+3^%)P|K0N$$ zzdybsX$@9Gn`W|V`-(ol))Ux8B{d~KTMA$MUzKe9``3Z#fBi89ClXiZ00TBHfi3yx zZ5U&74&n14(ha0JEphu8liobV-C63&#DewQ2tiE`S80YBgO1j&t&5L@FIZ7NXf)nN zTap{Pdg$g`Qazm7!JpUz(@C{NTfvJ6$@1vdrF7V`v0>*XeJOQ3k7^bJvF?loJ*%cg zJ+=uN>~$0Vnp#Up*fH`N@@Sg$cOm)Vi_6KjlNe#P>VSWbU+=%Q?{BrTfL?BH! zHI*MToYKg>4T7vu#Qxm@`8|EOoBtb=;!sU0@iVZTIH3=pbu2i_o|r(Esn5K4U9+yw z7;bc=Heb3Ck>dn5MS^8EF*whfi8dw-HO?)Bs7o1 zbU-1jwGku`1=?&khk4Hjba)_<3U0{#Pv)G|Ro;*h-=g$$NC4h*k_z3OF6q;zyBZle zLEjGzRXa(LFu5E%s4db`Pbvu0aST(A1I^evlc|F4+2uV1_AgC%3-EgAAnab$CF&B7 z567q2#-;Oc@YXH<%rjSgn#CB2-6H+w@P}MW-1@BF=f`*}qW79oV9c&cLnSSYJA)`b z3!Q4Rm3+O@oYZ9jF~gPf3XTd?BK4n>sGE&3N@P#Oxcjg_e7XO=PY*XgDK;(~MBc5I z!~RjyP%?Nr1xAem+=5Og{WBTIIIyr^>?PLVJ8;bMTt{@DG&^oS+4np1;M_bPXrrC% z{Y#~=aYW%Yj!k|)>^`E936r|$o!%>A)ifM1CYb&k;yWsxTYvV|p1!VdS`jommW;^a z*X|usgIA&jXjn`uaS07??cj@JUjHqOFcx6LMWS z|007!EYYRJ>*dGWH<(d9*++|2j%I(t0qc9H_k6viC(*0}BdunaZ5C<#92P6IGD4T{ zcNw8jce}8FGsgm`+Z|on)SNn-FI(-n97aRb-FU|>4dG)$W9d^xU@rO}ut#Ca5>;3Z literal 0 HcmV?d00001 diff --git a/html/plugindev.html b/html/plugindev.html new file mode 100644 index 0000000..27f9389 --- /dev/null +++ b/html/plugindev.html @@ -0,0 +1,439 @@ + + + + + + + + + + Plugin Development Guide — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Plugin Development Guide¶

+

This guide explains the plugin API and how to write custom plugins. I suggest reading Plugins first if you have not done that already. You might also want to have a look at the List of available Plugins for some practical examples.

+
+

Note

+

This is a draft. If you see any errors or find that a specific part is not explained clear enough, please tell the mailing-list or file a bug report.

+
+
+

How Plugins Work: The Basics¶

+

The plugin API builds on the concept of decorators. To put it briefly, a plugin is a decorator applied to every single route callback of an application.

+

Of course, this is just a simplification. Plugins can do a lot more than just decorating route callbacks, but it is a good starting point. Lets have a look at some code:

+
from bottle import response, install
+import time
+
+def stopwatch(callback):
+    def wrapper(*args, **kwargs):
+        start = time.time()
+        body = callback(*args, **kwargs)
+        end = time.time()
+        response.headers['X-Exec-Time'] = str(end - start)
+        return body
+    return wrapper
+
+install(stopwatch)
+
+
+

This plugin measures the execution time for each request and adds an appropriate X-Exec-Time header to the response. As you can see, the plugin returns a wrapper and the wrapper calls the original callback recursively. This is how decorators usually work.

+

The last line tells Bottle to install the plugin to the default application. This causes the plugin to be automatically applied to all routes of that application. In other words, stopwatch() is called once for each route callback and the return value is used as a replacement for the original callback.

+

Plugins are applied on demand, that is, as soon as a route is requested for the first time. For this to work properly in multi-threaded environments, the plugin should be thread-safe. This is not a problem most of the time, but keep it in mind.

+

Once all plugins are applied to a route, the wrapped callback is cached and subsequent requests are handled by the cached version directly. This means that a plugin is usually applied only once to a specific route. That cache, however, is cleared every time the list of installed plugins changes. Your plugin should be able to decorate the same route more than once.

+

The decorator API is quite limited, though. You don’t know anything about the route being decorated or the associated application object and have no way to efficiently store data that is shared among all routes. But fear not! Plugins are not limited to just decorator functions. Bottle accepts anything as a plugin as long as it is callable or implements an extended API. This API is described below and gives you a lot of control over the whole process.

+
+
+

Plugin API¶

+

Plugin is not a real class (you cannot import it from bottle) but an interface that plugins are expected to implement. Bottle accepts any object of any type as a plugin, as long as it conforms to the following API.

+
+
+class Plugin(object)¶
+

Plugins must be callable or implement apply(). If apply() is defined, it is always preferred over calling the plugin directly. All other methods and attributes are optional.

+
+
+name¶
+

Both Bottle.uninstall() and the skip parameter of Bottle.route() accept a name string to refer to a plugin or plugin type. This works only for plugins that have a name attribute.

+
+ +
+
+api¶
+

The Plugin API is still evolving. This integer attribute tells bottle which version to use. If it is missing, bottle defaults to the first version. The current version is 2. See Plugin API changes for details.

+
+ +
+
+setup(self, app)¶
+

Called as soon as the plugin is installed to an application (see Bottle.install()). The only parameter is the associated application object.

+
+ +
+
+__call__(self, callback)¶
+

As long as apply() is not defined, the plugin itself is used as a decorator and applied directly to each route callback. The only parameter is the callback to decorate. Whatever is returned by this method replaces the original callback. If there is no need to wrap or replace a given callback, just return the unmodified callback parameter.

+
+ +
+
+apply(self, callback, route)¶
+

If defined, this method is used in favor of __call__() to decorate route callbacks. The additional route parameter is an instance of Route and provides a lot of meta-information and context for that route. See The Route Context for details.

+
+ +
+
+close(self)¶
+

Called immediately before the plugin is uninstalled or the application is closed (see Bottle.uninstall() or Bottle.close()).

+
+ +
+ +

Both Plugin.setup() and Plugin.close() are not called for plugins that are applied directly to a route via the Bottle.route() decorator, but only for plugins installed to an application.

+
+

Plugin API changes¶

+

The Plugin API is still evolving and changed with Bottle 0.10 to address certain issues with the route context dictionary. To ensure backwards compatibility with 0.9 Plugins, we added an optional Plugin.api attribute to tell bottle which API to use. The API differences are summarized here.

+
    +
  • Bottle 0.9 API 1 (Plugin.api not present)
      +
    • Original Plugin API as described in the 0.9 docs.
    • +
    +
  • +
  • Bottle 0.10 API 2 (Plugin.api equals 2)
      +
    • The context parameter of the Plugin.apply() method is now an instance of Route instead of a context dictionary.
    • +
    +
  • +
+
+
+
+

The Route Context¶

+

The Route instance passed to Plugin.apply() provides detailed informations about the associated route. The most important attributes are summarized here:

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescription
appThe application object this route is installed to.
ruleThe rule string (e.g. /wiki/:page).
methodThe HTTP method as a string (e.g. GET).
callbackThe original callback with no plugins applied. Useful for +introspection.
nameThe name of the route (if specified) or None.
pluginsA list of route-specific plugins. These are applied in addition to +application-wide plugins. (see Bottle.route()).
skiplistA list of plugins to not apply to this route (again, see +Bottle.route()).
configAdditional keyword arguments passed to the Bottle.route() +decorator are stored in this dictionary. Used for route-specific +configuration and meta-data.
+

For your plugin, Route.config is probably the most important attribute. Keep in mind that this dictionary is local to the route, but shared between all plugins. It is always a good idea to add a unique prefix or, if your plugin needs a lot of configuration, store it in a separate namespace within the config dictionary. This helps to avoid naming collisions between plugins.

+
+

Changing the Route object¶

+

While some Route attributes are mutable, changes may have unwanted effects on other plugins. It is most likely a bad idea to monkey-patch a broken route instead of providing a helpful error message and let the user fix the problem.

+

In some rare cases, however, it might be justifiable to break this rule. After you made your changes to the Route instance, raise RouteReset as an exception. This removes the current route from the cache and causes all plugins to be re-applied. The router is not updated, however. Changes to rule or method values have no effect on the router, but only on plugins. This may change in the future, though.

+
+
+
+

Runtime optimizations¶

+

Once all plugins are applied to a route, the wrapped route callback is cached to speed up subsequent requests. If the behavior of your plugin depends on configuration, and you want to be able to change that configuration at runtime, you need to read the configuration on each request. Easy enough.

+

For performance reasons, however, it might be worthwhile to choose a different wrapper based on current needs, work with closures, or enable or disable a plugin at runtime. Let’s take the built-in HooksPlugin as an example: If no hooks are installed, the plugin removes itself from all affected routes and has virtaully no overhead. As soon as you install the first hook, the plugin activates itself and takes effect again.

+

To achieve this, you need control over the callback cache: Route.reset() clears the cache for a single route and Bottle.reset() clears all caches for all routes of an application at once. On the next request, all plugins are re-applied to the route as if it were requested for the first time.

+

Both methods won’t affect the current request if called from within a route callback, of cause. To force a restart of the current request, raise RouteReset as an exception.

+
+
+

Plugin Example: SQLitePlugin¶

+

This plugin provides an sqlite3 database connection handle as an additional keyword argument to wrapped callbacks, but only if the callback expects it. If not, the route is ignored and no overhead is added. The wrapper does not affect the return value, but handles plugin-related exceptions properly. Plugin.setup() is used to inspect the application and search for conflicting plugins.

+
import sqlite3
+import inspect
+
+class SQLitePlugin(object):
+    ''' This plugin passes an sqlite3 database handle to route callbacks
+    that accept a `db` keyword argument. If a callback does not expect
+    such a parameter, no connection is made. You can override the database
+    settings on a per-route basis. '''
+
+    name = 'sqlite'
+    api = 2
+
+    def __init__(self, dbfile=':memory:', autocommit=True, dictrows=True,
+                 keyword='db'):
+         self.dbfile = dbfile
+         self.autocommit = autocommit
+         self.dictrows = dictrows
+         self.keyword = keyword
+
+    def setup(self, app):
+        ''' Make sure that other installed plugins don't affect the same
+            keyword argument.'''
+        for other in app.plugins:
+            if not isinstance(other, SQLitePlugin): continue
+            if other.keyword == self.keyword:
+                raise PluginError("Found another sqlite plugin with "\
+                "conflicting settings (non-unique keyword).")
+
+    def apply(self, callback, context):
+        # Override global configuration with route-specific values.
+        conf = context.config.get('sqlite') or {}
+        dbfile = conf.get('dbfile', self.dbfile)
+        autocommit = conf.get('autocommit', self.autocommit)
+        dictrows = conf.get('dictrows', self.dictrows)
+        keyword = conf.get('keyword', self.keyword)
+
+        # Test if the original callback accepts a 'db' keyword.
+        # Ignore it if it does not need a database handle.
+        args = inspect.getargspec(context.callback)[0]
+        if keyword not in args:
+            return callback
+
+        def wrapper(*args, **kwargs):
+            # Connect to the database
+            db = sqlite3.connect(dbfile)
+            # This enables column access by name: row['column_name']
+            if dictrows: db.row_factory = sqlite3.Row
+            # Add the connection handle as a keyword argument.
+            kwargs[keyword] = db
+
+            try:
+                rv = callback(*args, **kwargs)
+                if autocommit: db.commit()
+            except sqlite3.IntegrityError, e:
+                db.rollback()
+                raise HTTPError(500, "Database Error", e)
+            finally:
+                db.close()
+            return rv
+
+        # Replace the route callback with the wrapped one.
+        return wrapper
+
+
+

This plugin is actually useful and very similar to the version bundled with Bottle. Not bad for less than 60 lines of code, don’t you think? Here is a usage example:

+
sqlite = SQLitePlugin(dbfile='/tmp/test.db')
+bottle.install(sqlite)
+
+@route('/show/:page')
+def show(page, db):
+    row = db.execute('SELECT * from pages where name=?', page).fetchone()
+    if row:
+        return template('showpage', page=row)
+    return HTTPError(404, "Page not found")
+
+@route('/static/:fname#.*#')
+def static(fname):
+    return static_file(fname, root='/some/path')
+
+@route('/admin/set/:db#[a-zA-Z]+#', skip=[sqlite])
+def change_dbfile(db):
+    sqlite.dbfile = '/tmp/%s.db' % db
+    return "Switched DB to %s.db" % db
+
+
+

The first route needs a database connection and tells the plugin to create a handle by requesting a db keyword argument. The second route does not need a database and is therefore ignored by the plugin. The third route does expect a ‘db’ keyword argument, but explicitly skips the sqlite plugin. This way the argument is not overruled by the plugin and still contains the value of the same-named url argument.

+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Developer Notes

+

Next topic

+

List of available Plugins

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/plugins/index.html b/html/plugins/index.html new file mode 100644 index 0000000..98a5d36 --- /dev/null +++ b/html/plugins/index.html @@ -0,0 +1,216 @@ + + + + + + + + + + List of available Plugins — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

List of available Plugins¶

+

This is a list of third-party plugins that add extend Bottles core functionality or integrate other libraries with the Bottle framework.

+

Have a look at Plugins for general questions about plugins (installation, usage). If you plan to develop a new plugin, the Plugin Development Guide may help you.

+
+
Bottle-Cork
+
Cork provides a simple set of methods to implement Authentication and Authorization in web applications based on Bottle.
+
Bottle-Extras
+
Meta package to install the bottle plugin collection.
+
Bottle-Flash
+
flash plugin for bottle
+
Bottle-Hotqueue
+
FIFO Queue for Bottle built upon redis
+
Macaron
+
Macaron is an object-relational mapper (ORM) for SQLite.
+
Bottle-Memcache
+
Memcache integration for Bottle.
+
Bottle-MongoDB
+
MongoDB integration for Bottle
+
Bottle-Redis
+
Redis integration for Bottle.
+
Bottle-Renderer
+
Renderer plugin for bottle
+
Bottle-Servefiles
+
A reusable app that serves static files for bottle apps
+
Bottle-Sqlalchemy
+
SQLAlchemy integration for Bottle.
+
Bottle-Sqlite
+
SQLite3 database integration for Bottle.
+
Bottle-Web2pydal
+
Web2py Dal integration for Bottle.
+
Bottle-Werkzeug
+
Integrates the werkzeug library (alternative request and response objects, advanced debugging middleware and more).
+
+

Plugins listed here are not part of Bottle or the Bottle project, but developed and maintained by third parties.

+
+
+
+ + + +
+
+
+
+
+ +

Previous topic

+

Plugin Development Guide

+

Next topic

+

Bottle-SQLite

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/plugins/sqlite.html b/html/plugins/sqlite.html new file mode 100644 index 0000000..d6e26e0 --- /dev/null +++ b/html/plugins/sqlite.html @@ -0,0 +1,272 @@ + + + + + + + + + + Bottle-SQLite — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Bottle-SQLite¶

+

SQLite is a self-contained SQL database engine that runs locally and does not +require any additional server software or setup. The sqlite3 module is part of the +Python standard library and already installed on most systems. It it very useful +for prototyping database-driven applications that are later ported to larger +databases such as PostgreSQL or MySQL.

+

This plugin simplifies the use of sqlite databases in your Bottle applications. +Once installed, all you have to do is to add a db keyword argument +(configurable) to route callbacks that need a database connection.

+
+

Installation¶

+

Install with one of the following commands:

+
$ pip install bottle-sqlite
+$ easy_install bottle-sqlite
+
+

or download the latest version from github:

+
$ git clone git://github.com/defnull/bottle.git
+$ cd bottle/plugins/sqlite
+$ python setup.py install
+
+
+
+

Usage¶

+

Once installed to an application, the plugin passes an open +sqlite3.Connection instance to all routes that require a db keyword +argument:

+
import bottle
+
+app = bottle.Bottle()
+plugin = bottle.ext.sqlite.Plugin(dbfile='/tmp/test.db')
+app.install(plugin)
+
+@app.route('/show/:item')
+def show(item, db):
+    row = db.execute('SELECT * from items where name=?', item).fetchone()
+    if row:
+        return template('showitem', page=row)
+    return HTTPError(404, "Page not found")
+
+
+

Routes that do not expect a db keyword argument are not affected.

+

The connection handle is configured so that sqlite3.Row objects can be +accessed both by index (like tuples) and case-insensitively by name. At the end of +the request cycle, outstanding transactions are committed and the connection is +closed automatically. If an error occurs, any changes to the database since the +last commit are rolled back to keep the database in a consistent state.

+
+
+

Configuration¶

+

The following configuration options exist for the plugin class:

+
    +
  • dbfile: Database filename (default: in-memory database).
  • +
  • keyword: The keyword argument name that triggers the plugin (default: ‘db’).
  • +
  • autocommit: Whether or not to commit outstanding transactions at the end of the request cycle (default: True).
  • +
  • dictrows: Whether or not to support dict-like access to row objects (default: True).
  • +
+

You can override each of these values on a per-route basis:

+
@app.route('/cache/:item', sqlite={'dbfile': ':memory:'})
+def cache(item, db):
+    ...
+
+
+

or install two plugins with different keyword settings to the same application:

+
app = bottle.Bottle()
+test_db = bottle.ext.sqlite.Plugin(dbfile='/tmp/test.db')
+cache_db = bottle.ext.sqlite.Plugin(dbfile=':memory:', keyword='cache')
+app.install(test_db)
+app.install(cache_db)
+
+@app.route('/show/:item')
+def show(item, db):
+    ...
+
+@app.route('/cache/:item')
+def cache(item, cache):
+    ...
+
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

List of available Plugins

+

Next topic

+

Bottle-Werkzeug

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/plugins/werkzeug.html b/html/plugins/werkzeug.html new file mode 100644 index 0000000..2f25c03 --- /dev/null +++ b/html/plugins/werkzeug.html @@ -0,0 +1,248 @@ + + + + + + + + + + Bottle-Werkzeug — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Bottle-Werkzeug¶

+

Werkzeug is a powerful WSGI utility library for +Python. It includes an interactive debugger and feature-packed request and response +objects.

+

This plugin integrates werkzeug.wrappers.Request and +werkzeug.wrappers.Response as an alternative to the built-in +implementations, adds support for werkzeug.exceptions and replaces the +default error page with an interactive debugger.

+
+

Installation¶

+

Install with one of the following commands:

+
$ pip install bottle-werkzeug
+$ easy_install bottle-werkzeug
+
+

or download the latest version from github:

+
$ git clone git://github.com/defnull/bottle.git
+$ cd bottle/plugins/werkzeug
+$ python setup.py install
+
+
+
+

Usage¶

+

Once installed to an application, this plugin adds support for +werkzeug.wrappers.Response, all kinds of werkzeug.exceptions and +provides a thread-local instance of werkzeug.wrappers.Request that is +updated with each request. The plugin instance itself doubles as a werkzeug +module object, so you don’t have to import werkzeug in your application. Here +is an example:

+
import bottle
+
+app = bottle.Bottle()
+werkzeug = bottle.ext.werkzeug.Plugin()
+app.install(werkzeug)
+
+req = werkzueg.request # For the lazy.
+
+@app.route('/hello/:name')
+def say_hello(name):
+    greet = {'en':'Hello', 'de':'Hallo', 'fr':'Bonjour'}
+    language = req.accept_languages.best_match(greet.keys())
+    if language:
+        return werkzeug.Response('%s %s!' % (greet[language], name))
+    else:
+        raise werkzeug.exceptions.NotAcceptable()
+
+
+
+
+

Using the Debugger¶

+

This plugin replaces the default error page with an advanced debugger. If you +have the evalex feature enabled, you will get an interactive console that +allows you to inspect the error context in the browser. Please read +Debugging Applications with werkzeug before you enable this +feature.

+
+
+

Configuration¶

+

The following configuration options exist for the plugin class:

+ +
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Bottle-SQLite

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/py-modindex.html b/html/py-modindex.html new file mode 100644 index 0000000..c643af9 --- /dev/null +++ b/html/py-modindex.html @@ -0,0 +1,172 @@ + + + + + + + + + + Python Module Index — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Python Module Index

+ +
+ b +
+ + + + + + + +
 
+ b
+ bottle +
+ + +
+
+
+
+
+ + + + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/recipes.html b/html/recipes.html new file mode 100644 index 0000000..53c2717 --- /dev/null +++ b/html/recipes.html @@ -0,0 +1,421 @@ + + + + + + + + + + Recipes — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Recipes¶

+

This is a collection of code snippets and examples for common use cases.

+
+

Keeping track of Sessions¶

+

There is no built-in support for sessions because there is no right way to do it (in a micro framework). Depending on requirements and environment you could use beaker middleware with a fitting backend or implement it yourself. Here is an example for beaker sessions with a file-based backend:

+
import bottle
+from beaker.middleware import SessionMiddleware
+
+session_opts = {
+    'session.type': 'file',
+    'session.cookie_expires': 300,
+    'session.data_dir': './data',
+    'session.auto': True
+}
+app = SessionMiddleware(bottle.app(), session_opts)
+
+@bottle.route('/test')
+def test():
+  s = bottle.request.environ.get('beaker.session')
+  s['test'] = s.get('test',0) + 1
+  s.save()
+  return 'Test counter: %d' % s['test']
+
+bottle.run(app=app)
+
+
+
+
+

Debugging with Style: Debugging Middleware¶

+

Bottle catches all Exceptions raised in your app code to prevent your WSGI server from crashing. If the built-in debug() mode is not enough and you need exceptions to propagate to a debugging middleware, you can turn off this behaviour:

+
import bottle
+app = bottle.app()
+app.catchall = False #Now most exceptions are re-raised within bottle.
+myapp = DebuggingMiddleware(app) #Replace this with a middleware of your choice (see below)
+bottle.run(app=myapp)
+
+
+

Now, bottle only catches its own exceptions (HTTPError, HTTPResponse and BottleException) and your middleware can handle the rest.

+

The werkzeug and paste libraries both ship with very powerful debugging WSGI middleware. Look at werkzeug.debug.DebuggedApplication for werkzeug and paste.evalexception.middleware.EvalException for paste. They both allow you do inspect the stack and even execute python code within the stack context, so do not use them in production.

+
+
+

Unit-Testing Bottle Applications¶

+

Unit-testing is usually performed against methods defined in your web application without running a WSGI environment.

+

A simple example using Nose:

+
import bottle
+
+@bottle.route('/')
+def index():
+    return 'Hi!'
+
+if __name__ == '__main__':
+    bottle.run()
+
+
+

Test script:

+
import mywebapp
+
+def test_webapp_index():
+    assert mywebapp.index() == 'Hi!'
+
+
+

In the example the Bottle route() method is never executed - only index() is tested.

+
+
+

Functional Testing Bottle Applications¶

+

Any HTTP-based testing system can be used with a running WSGI server, but some testing frameworks work more intimately with WSGI, and provide the ability the call WSGI applications in a controlled environment, with tracebacks and full use of debugging tools. Testing tools for WSGI is a good starting point.

+

Example using WebTest and Nose:

+
from webtest import TestApp
+import mywebapp
+
+def test_functional_login_logout():
+    app = TestApp(mywebapp.app)
+
+    app.post('/login', {'user': 'foo', 'pass': 'bar'}) # log in and get a cookie
+
+    assert app.get('/admin').status == '200 OK'        # fetch a page successfully
+
+    app.get('/logout')                                 # log out
+    app.reset()                                        # drop the cookie
+
+    # fetch the same page, unsuccessfully
+    assert app.get('/admin').status == '401 Unauthorized'
+
+
+
+
+

Embedding other WSGI Apps¶

+

This is not the recommend way (you should use a middleware in front of bottle to do this) but you can call other WSGI applications from within your bottle app and let bottle act as a pseudo-middleware. Here is an example:

+
from bottle import request, response, route
+subproject = SomeWSGIApplication()
+
+@route('/subproject/:subpath#.*#', method='ALL')
+def call_wsgi(subpath):
+    new_environ = request.environ.copy()
+    new_environ['SCRIPT_NAME'] = new_environ.get('SCRIPT_NAME','') + '/subproject'
+    new_environ['PATH_INFO'] = '/' + subpath
+    def start_response(status, headerlist):
+        response.status = int(status.split()[0])
+        for key, value in headerlist:
+            response.add_header(key, value)
+    return app(new_environ, start_response)
+
+
+

Again, this is not the recommend way to implement subprojects. It is only here because many people asked for this and to show how bottle maps to WSGI.

+
+
+

Ignore trailing slashes¶

+

For Bottle, /example and /example/ are two different routes [1]. To treat both URLs the same you can add two @route decorators:

+
@route('/test')
+@route('/test/')
+def test(): return 'Slash? no?'
+
+
+

or add a WSGI middleware that strips trailing slashes from all URLs:

+
class StripPathMiddleware(object):
+  def __init__(self, app):
+    self.app = app
+  def __call__(self, e, h):
+    e['PATH_INFO'] = e['PATH_INFO'].rstrip('/')
+    return self.app(e,h)
+
+app = bottle.app()
+myapp = StripPathMiddleware(app)
+bottle.run(app=myapp)
+
+
+

Footnotes

+ + + + + +
[1]Because they are. See <http://www.ietf.org/rfc/rfc3986.txt>
+
+
+

Keep-alive requests¶

+
+

Note

+

For a more detailed explanation, see Primer to Asynchronous Applications.

+
+

Several “push” mechanisms like XHR multipart need the ability to write response data without closing the connection in conjunction with the response header “Connection: keep-alive”. WSGI does not easily lend itself to this behavior, but it is still possible to do so in Bottle by using the gevent async framework. Here is a sample that works with either the gevent HTTP server or the paste HTTP server (it may work with others, but I have not tried). Just change server='gevent' to server='paste' to use the paste server:

+
from gevent import monkey; monkey.patch_all()
+
+import time
+from bottle import route, run
+
+@route('/stream')
+def stream():
+    yield 'START'
+    time.sleep(3)
+    yield 'MIDDLE'
+    time.sleep(5)
+    yield 'END'
+
+run(host='0.0.0.0', port=8080, server='gevent')
+
+
+

If you browse to http://localhost:8080/stream, you should see ‘START’, ‘MIDDLE’, and ‘END’ show up one at a time (rather than waiting 8 seconds to see them all at once).

+
+
+

Gzip Compression in Bottle¶

+
+

Note

+

For a detailed discussion, see compression

+
+

A common feature request is for Bottle to support Gzip compression, which speeds up sites by compressing static resources (like CSS and JS files) during a request.

+

Supporting Gzip compression is not a straightforward proposition, due to a number of corner cases that crop up frequently. A proper Gzip implementation must:

+
    +
  • Compress on the fly and be fast doing so.
  • +
  • Do not compress for browsers that don’t support it.
  • +
  • Do not compress files that are compressed already (images, videos).
  • +
  • Do not compress dynamic files.
  • +
  • Support two differed compression algorithms (gzip and deflate).
  • +
  • Cache compressed files that don’t change often.
  • +
  • De-validate the cache if one of the files changed anyway.
  • +
  • Make sure the cache does not get to big.
  • +
  • Do not cache small files because a disk seek would take longer than on-the-fly compression.
  • +
+

Because of these requirements, it is the recommendation of the Bottle project that Gzip compression is best handled by the WSGI server Bottle runs on top of. WSGI servers such as cherrypy provide a GzipFilter middleware that can be used to accomplish this.

+
+
+

Using the hooks plugin¶

+

For example, if you want to allow Cross-Origin Resource Sharing for +the content returned by all of your URL, you can use the hook +decorator and setup a callback function:

+
from bottle import hook, response, route
+
+@hook('after_request')
+def enable_cors():
+    response.headers['Access-Control-Allow-Origin'] = '*'
+
+@route('/foo')
+def say_foo():
+    return 'foo!'
+
+@route('/bar')
+def say_bar():
+    return {'type': 'friendly', 'content': 'Hi!'}
+
+
+

You can also use the before_callback to take an action before +every function gets called.

+
+
+

Using Bottle with Heroku¶

+

Heroku, a popular cloud application platform now provides support +for running Python applications on their infastructure.

+

This recipe is based upon the Heroku Quickstart, +with Bottle specific code replacing the +Write Your App +section of the Getting Started with Python on Heroku/Cedar guide:

+
import os
+from bottle import route, run
+
+@route("/")
+def hello_world():
+        return "Hello World!"
+
+run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
+
+
+

Heroku’s app stack passes the port that the application needs to +listen on for requests, using the os.environ dictionary.

+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Primer to Asynchronous Applications

+

Next topic

+

Frequently Asked Questions

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/routing.html b/html/routing.html new file mode 100644 index 0000000..c3d8b18 --- /dev/null +++ b/html/routing.html @@ -0,0 +1,330 @@ + + + + + + + + + + Request Routing — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Request Routing¶

+

Bottle uses a powerful routing engine to find the right callback for each request. The tutorial shows you the basics. This document covers advanced techniques and rule mechanics in detail.

+
+

Rule Syntax¶

+

The Router distinguishes between two basic types of routes: static routes (e.g. /contact) and dynamic routes (e.g. /hello/<name>). A route that contains one or more wildcards it is considered dynamic. All other routes are static.

+

+Changed in version 0.10.

+

The simplest form of a wildcard consists of a name enclosed in angle brackets (e.g. <name>). The name should be unique for a given route and form a valid python identifier (alphanumeric, starting with a letter). This is because wildcards are used as keyword arguments for the request callback later.

+

Each wildcard matches one or more characters, but stops at the first slash (/). This equals a regular expression of [^/]+ and ensures that only one path segment is matched and routes with more than one wildcard stay unambiguous.

+

The rule /<action>/<item> matches as follows:

+ ++++ + + + + + + + + + + + + + + + + + + + +
PathResult
/save/123{'action': 'save', 'item': '123'}
/save/123/No Match
/save/No Match
//123No Match
+

You can change the exact behaviour in many ways using filters. This is described in the next section.

+
+
+

Wildcard Filters¶

+

+New in version 0.10.

+

Filters are used to define more specific wildcards, and/or transform the matched part of the URL before it is passed to the callback. A filtered wildcard is declared as <name:filter> or <name:filter:config>. The syntax for the optional config part depends on the filter used.

+

The following standard filters are implemented:

+
    +
  • :int matches (signed) digits and converts the value to integer.
  • +
  • :float similar to :int but for decimal numbers.
  • +
  • :path matches all characters including the slash character in a non-greedy way and may be used to match more than one path segment.
  • +
  • :re[:exp] allows you to specify a custom regular expression in the config field. The matched value is not modified.
  • +
+

You can add your own filters to the router. All you need is a function that returns three elements: A regular expression string, a callable to convert the URL fragment to a python value, and a callable that does the opposite. The filter function is called with the configuration string as the only parameter and may parse it as needed:

+
app = Bottle()
+
+def list_filter(config):
+    ''' Matches a comma separated list of numbers. '''
+    delimiter = config or ','
+    regexp = r'\d+(%s\d)*' % re.escape(delimiter)
+
+    def to_python(match):
+        return map(int, match.split(delimiter))
+
+    def to_url(numbers):
+        return delimiter.join(map(str, numbers))
+
+    return regexp, to_python, to_url
+
+app.router.add_filter('list', list_filter)
+
+@app.route('/follow/<ids:list>')
+def follow_users(ids):
+    for id in ids:
+        ...
+
+
+
+
+

Legacy Syntax¶

+

+Changed in version 0.10.

+

The new rule syntax was introduce in Bottle 0.10 to simplify some common use cases, but the old syntax still works and you can find lot code examples still using it. The differences are best described by example:

+ ++++ + + + + + + + + + + + + + + + + + + + +
Old SyntaxNew Syntax
:name<name>
:name#regexp#<name:re:regexp>
:#regexp#<:re:regexp>
:##<:re>
+

Try to avoid the old syntax in future projects if you can. It is not currently deprecated, but will be eventually.

+
+
+

Routing Order¶

+

With the power of wildcards and regular expressions it is possible to define overlapping routes. If multiple routes match the same URL, things get a bit tricky. To fully understand what happens in this case, you need to know in which order routes are checked by the router.

+

First you should know that routes are grouped by their path rule. Two routes with the same path rule but different methods are grouped together and the first route determines the position of both routes. Fully identical routes (same path rule and method) replace previously defined routes, but keep the position of their predecessor.

+

Static routes are checked first. This is mostly for performance reasons and can be switched off, but is currently the default. If no static route matches the request, the dynamic routes are checked in the order they were defined. The first hit ends the search. If no rule matched, a “404 Page not found” error is returned.

+

In a second step, the request method is checked. If no exact match is found, and the request method is HEAD, the router checks for a GET route. Otherwise, it checks for an ANY route. If that fails too, a “405 Method not allowed” error is returned.

+

Here is an example where this might bite you:

+
@route('/<action>/<name>', method='GET')
+@route('/save/<name>', method='POST')
+
+

The second route will never hit. Even POST requests don’t arrive at the second route because the request method is checked in a separate step. The router stops at the first route which matches the request path, then checks for a valid request method, can’t find one and raises a 405 error.

+

Sounds complicated, and it is. That is the price for performance. It is best to avoid ambiguous routes at all and choose unique prefixes for each route. This implementation detail may change in the future, though. We are working on it.

+
+
+

Explicit routing configuration¶

+

Route decorator can also be directly called as method. This way provides flexibility in complex setups, allowing you to directly control, when and how routing configuration done.

+

Here is a basic example of explicit routing configuration for default bottle application:

+
def setup_routing():
+    bottle.route('/', method='GET', index)
+    bottle.route('/edit', method=['GET', 'POST'], edit)
+
+
+

In fact, any Bottle instance routing can be configured same way:

+
def setup_routing(app):
+    app.route('/new', method=['GET', 'POST'], form_new)
+    app.route('/edit', method=['GET', 'POST'], form_edit)
+
+app = Bottle()
+setup_routing(app)
+
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Tutorial

+

Next topic

+

SimpleTemplate Engine

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/search.html b/html/search.html new file mode 100644 index 0000000..5f52768 --- /dev/null +++ b/html/search.html @@ -0,0 +1,163 @@ + + + + + + + + + + Search — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+
+
+ + + + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/searchindex.js b/html/searchindex.js new file mode 100644 index 0000000..f97e5f6 --- /dev/null +++ b/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({objects:{"":{bottle:[16,0,1,""]},"bottle.ResourceManager":{path:[4,3,1,""],add_path:[4,2,1,""],cache:[4,3,1,""],open:[4,2,1,""],lookup:[4,2,1,""]},"bottle.BaseTemplate":{search:[4,7,1,""],render:[4,2,1,""],"__init__":[4,2,1,""],prepare:[4,2,1,""],global_config:[4,7,1,""]},"bottle.Route":{reset:[4,2,1,""],name:[4,3,1,""],prepare:[4,2,1,""],app:[4,3,1,""],rule:[4,3,1,""],method:[4,3,1,""],callback:[4,3,1,""],plugins:[4,3,1,""],config:[4,3,1,""],skiplist:[4,3,1,""],all_plugins:[4,2,1,""]},"bottle.Plugin":{name:[9,3,1,""],setup:[9,2,1,""],api:[9,3,1,""],close:[9,2,1,""],"__call__":[9,2,1,""],apply:[9,2,1,""]},"bottle.FormsDict":{decode:[4,2,1,""],input_encoding:[4,3,1,""],recode_unicode:[4,3,1,""]},stpl:{defined:[8,1,1,""],setdefault:[8,1,1,""],get:[8,1,1,""]},"bottle.WSGIHeaderDict":{raw:[4,2,1,""],cgikeys:[4,3,1,""]},"bottle.LocalRequest":{bind:[4,2,1,""],environ:[4,3,1,""]},"bottle.HTTPResponse":{output:[4,3,1,""]},"bottle.SimpleTemplate":{render:[8,2,1,""],split_comment:[8,7,1,""]},bottle:{load:[4,1,1,""],LocalResponse:[4,4,1,""],app:[4,1,1,""],path_shift:[4,1,1,""],load_app:[4,1,1,""],yieldroutes:[4,1,1,""],cookie_encode:[4,1,1,""],cookie_is_encoded:[4,1,1,""],LocalRequest:[4,4,1,""],BaseTemplate:[4,4,1,""],BaseResponse:[4,4,1,""],AppStack:[4,4,1,""],get:[4,1,1,""],response:[4,5,1,""],template:[4,1,1,""],HTTPResponse:[4,6,1,""],FormsDict:[4,4,1,""],Response:[4,3,1,""],Plugin:[9,4,1,""],cookie_decode:[4,1,1,""],run:[4,1,1,""],HTTP_CODES:[4,5,1,""],WSGIHeaderDict:[4,4,1,""],HeaderDict:[4,4,1,""],Route:[4,4,1,""],Request:[4,3,1,""],BottleException:[4,6,1,""],Bottle:[4,4,1,""],put:[4,1,1,""],post:[4,1,1,""],HTTPError:[4,6,1,""],BaseRequest:[4,4,1,""],parse_auth:[4,1,1,""],default_app:[4,1,1,""],ResourceManager:[4,4,1,""],route:[4,1,1,""],request:[4,5,1,""],MultiDict:[4,4,1,""],parse_date:[4,1,1,""],error:[4,1,1,""],debug:[4,1,1,""],SimpleTemplate:[8,4,1,""],"delete":[4,1,1,""],view:[4,1,1,""]},"bottle.Bottle":{wsgi:[4,2,1,""],add_route:[4,2,1,""],catchall:[4,3,1,""],hook:[4,2,1,""],close:[4,2,1,""],handle:[4,2,1,""],config:[4,3,1,""],resources:[4,3,1,""],run:[4,2,1,""],get:[4,2,1,""],put:[4,2,1,""],post:[4,2,1,""],reset:[4,2,1,""],get_url:[4,2,1,""],route:[4,2,1,""],merge:[4,2,1,""],match:[4,2,1,""],install:[4,2,1,""],error:[4,2,1,""],"delete":[4,2,1,""],mount:[4,2,1,""],uninstall:[4,2,1,""]},"bottle.MultiDict":{getlist:[4,2,1,""],get:[4,2,1,""],getall:[4,2,1,""],replace:[4,2,1,""],getone:[4,2,1,""],append:[4,2,1,""]},"bottle.BaseRequest":{content_length:[4,3,1,""],body:[4,3,1,""],cookies:[4,3,1,""],app:[4,3,1,""],script_name:[4,3,1,""],query:[4,3,1,""],MEMFILE_MAX:[4,3,1,""],GET:[4,3,1,""],forms:[4,3,1,""],json:[4,3,1,""],urlparts:[4,3,1,""],params:[4,3,1,""],MAX_PARAMS:[4,3,1,""],method:[4,3,1,""],get_header:[4,2,1,""],files:[4,3,1,""],auth:[4,3,1,""],remote_route:[4,3,1,""],path_shift:[4,2,1,""],content_type:[4,3,1,""],path:[4,3,1,""],POST:[4,3,1,""],copy:[4,2,1,""],COOKIES:[4,3,1,""],get_cookie:[4,2,1,""],url:[4,3,1,""],remote_addr:[4,3,1,""],headers:[4,3,1,""],environ:[4,3,1,""],is_ajax:[4,3,1,""],query_string:[4,3,1,""],is_xhr:[4,3,1,""],fullpath:[4,3,1,""]},"bottle.LocalResponse":{body:[4,3,1,""]},"bottle.AppStack":{push:[4,2,1,""],pop:[4,2,1,""]},"bottle.BaseResponse":{status:[4,3,1,""],content_length:[4,3,1,""],COOKIES:[4,3,1,""],headerlist:[4,3,1,""],set_cookie:[4,2,1,""],add_header:[4,2,1,""],status_code:[4,3,1,""],charset:[4,3,1,""],status_line:[4,3,1,""],set_header:[4,2,1,""],headers:[4,3,1,""],delete_cookie:[4,2,1,""],content_type:[4,3,1,""],copy:[4,2,1,""],iter_headers:[4,2,1,""],get_header:[4,2,1,""]}},terms:{content_length:4,untrust:8,all:[0,1,2,3,5,8,9,10,4,12,13,14,15,16],four:[4,16,3],jinja2_view:4,prefix:[4,12,9],run_onc:3,sleep:[14,5],dirnam:[15,13],gae:13,authorit:4,sorri:[0,15,16],under:16,f72a7c:3,merchant:1,digit:[15,12,16],everi:[5,4,15,16,9],risk:2,"_lctx":4,upstream:0,affect:[0,10,4,16,9],cookie_encod:4,upload:[1,4,16],direct:[1,4],consequ:[14,16],second:[3,5,8,9,4,12,14,15,16],even:[0,5,8,4,12,13,14,15,16],hide:8,eventlet:13,neg:4,item1:15,"new":[0,3,15,7,8,4,12,13,14,16],net:0,ever:0,metadata:[1,4,16],ongo:14,elimin:13,abov:[0,1,15,8,16],send_imag:16,never:[0,5,12,16],forum_id:16,here:[0,1,2,5,6,7,8,9,11,12,13,14,15,16],defnul:[0,10,11,2,16],tornado:[14,13],debugg:2,path:[3,15,6,8,9,4,12,13,16],testapp:5,interpret:[15,13,8,3],forum:16,anymor:3,datetim:[4,16],permit:1,aka:[11,16],pack:[4,2],portabl:16,joshua:3,get_cooki:[4,16,3],unix:[15,4,16],txt:5,middlewar:[1,5,6,7,4,16],describ:[0,15,9,4,12,16],would:[0,5,6,14,15,16],subpath:5,call:[0,1,3,5,8,9,4,12,13,15,16],recommend:[0,5,4,16,3],type:[0,3,5,9,4,12,14,15,16],until:[0,14,4,16],fastcgi:13,hoffmann:3,relat:[1,11,7,16,9],notic:[1,15,4],hurt:13,warn:[0,15,4,8,16],exce:16,herebi:1,overrul:[4,9],must:[0,3,5,8,9,4,14,15,16],join:[0,12,16],restor:[0,4,16],setup:[10,2,1,5,3,9,12,13,15,16],work:[0,1,5,6,8,9,4,12,13,14,15,16],xhr:5,wors:16,remote_rout:[4,3],root:[9,4,15,16,13],overrid:[10,16,9],give:[15,9],indic:0,unavail:4,want:[0,1,3,5,8,9,4,13,14,15,16],keep:[0,1,10,5,8,9,4,12,15,16],declar:[12,16],end:[10,5,8,9,4,12,13,14,15,16],quot:3,how:[1,5,8,9,12,13,14,15,16],conn:15,answer:[1,14],acasaju:3,subproject:5,perspect:14,updat:[0,1,2,15,9,4,14],mako:[1,3],rebas:[0,8],after:[0,15,4,16,9],befor:[0,1,2,5,9,4,12,14,15,16],wrong:[15,4,16],law:11,demonstr:[15,16],nobreak:8,handl:[10,3,5,8,9,4,13,14,15,16],flupserv:15,third:[14,15,7,16,9],classmethod:[4,8],minim:4,credenti:16,lost:6,greet:[2,16],alias:4,maintain:[0,3,7,8,4,16],environ:[0,3,5,6,9,4,14,15,16],enter:16,first:[0,1,4,15,8,9,11,12,14,16],order:[0,1,3,15,4,12,13,14,16],oper:[15,16],feedback:[0,11],over:[0,9,4,13,14,16],becaus:[0,3,5,4,12,14,16],fifo:7,privileg:4,flexibl:[8,16,12],digest:4,fit:[1,5,16],fix:[0,9,4,6,3],bytecod:8,fetchal:15,complex:[6,8,12],easier:[0,15,3],them:[0,3,5,8,4,14,15,16],thei:[0,3,5,8,4,12,13,14,16],fragment:[4,12],safe:[0,4,16,9],"break":[0,3,8,9,14,16],jinja2:1,interrupt:16,choic:[5,4,16],changelog:[1,3],unpickl:[4,16],sessionmiddlewar:5,timeout:4,each:[0,10,2,3,15,8,9,4,12,13,14,16],debug:[1,2,3,5,7,4,15,16],side:[14,13,4,16,3],servefil:7,mean:[0,4,16,9],gstein:3,appengin:13,impressum:11,admin_app:4,logo:1,extract:4,nutzung:11,network:[4,13],goe:[4,16],diesel:13,content:[1,15,8,4,5,16],rewrit:[0,14],dieser:11,adjust:4,adapt:[1,13,4,15,3],got:[11,3],gunicorn:[13,3],make_app:16,worthwhil:9,situat:[8,16],given:[3,15,8,9,4,12,16],free:[0,1],standard:[1,10,15,8,12,13,14,16],post_id:16,angl:[12,16],traceback:[5,4,16],ist:11,filter:[1,12,16,3],say_foo:5,iso:16,confus:[0,4,16],bite:12,token:6,rang:[4,16,3],render:[14,4,7,8,16],independ:13,thereof:16,necess:15,restrict:[1,8,16],hook:[1,5,4,9],alreadi:[0,10,5,8,9,15,16],messag:[14,15,9,16,13],massiv:14,handler_class:14,primari:15,top:[0,5,4,16],sometim:[0,15,4,16,13],fiction:16,isalpha:16,master:[0,16],too:[0,15,6,8,11,4,12,14,16],ioerror:4,listen:[5,4,15,16,13],consol:[1,2],namespac:[9,4,8,16,3],tool:[14,5,16],lighttpd:13,technic:0,target:4,cgikei:4,provid:[1,2,5,7,9,4,12,13,16],project:[0,1,3,5,7,11,12,14,15,16],minut:0,websocket:[1,14],add_head:[5,4,16],mind:[4,8,16,9],raw:[15,4,16,3],pylon:6,"__main__":5,seen:15,seem:3,seek:[5,4],wsgiscriptalia:[15,13],wollrath:3,brandon:3,contact:[11,12,16],fname:9,edit_item:15,transmit:16,simplifi:[10,12,16],germani:11,though:[0,12,16,9],usernam:16,object:[10,2,1,5,3,7,9,4,13,14,15,16],regular:[3,15,6,4,12,16],letter:12,bytesio:4,sub:[8,16],tradit:14,simplic:[8,16],don:[0,2,3,5,8,9,4,12,14,16],simplif:9,doc:[0,9],doe:[0,10,5,9,4,12,13,14,15,16],bracket:[8,16,12],wildcard:[1,4,12,16,3],mod_proxi:13,unchang:16,sum:16,dot:[11,3],wild:[15,3],introspect:[4,9],opposit:12,random:13,syntax:[1,3,15,6,8,4,12,16],mako_templ:4,identifi:[12,16],involv:[0,1,4,8,14],absolut:[4,6,3],submit:[0,1,15,16],layout:8,open_db:16,explain:[15,8,16,9],configur:[0,1,2,10,15,3,9,4,12,13,16],apach:[15,6,13],"_environ":3,gzipfilt:5,busi:14,"__call__":[5,9],folder:16,predecessor:12,set_head:[4,16],googlegroup:0,watch:[0,15,11],report:9,bar:5,ietf:5,patch:[0,1,9,14,3],reload:[15,4,16],bad:[4,9],steal:16,fair:15,serve_forev:14,mandatori:[0,4],result:[15,4,8,16,12],zwecken:11,respons:[1,2,3,5,7,9,4,14,15,16],fail:[4,12,16],import_str:4,best:[0,5,4,12,16],subject:1,awar:8,said:15,databas:[10,3,15,7,9,13,14,16],sigint:16,outstand:10,simplest:12,getunicod:16,awai:[15,16],irc:[0,16],strippathmiddlewar:5,attribut:[9,4,16,3],reddit:3,extend:[15,9,7,3],ask:[1,5,6,16],extens:[15,4],lazi:2,baserequest:[4,16,3],protect:[15,4,16,3],easi:[0,15,8,9,4,13,14,16],irregular:0,simpletempl:[1,4,8,16,3],howev:[1,16,9],against:5,und:11,brad:3,login:[5,16],com:[0,10,2,15,6,13,14,16],col:15,con:15,asctim:4,written:[15,13,3],trust:[0,16],assum:[0,15,4,16],summar:9,duplic:4,liabil:1,attribu:4,add_rout:4,three:[0,3,15,8,4,12,13,16],been:16,wsgiprocessgroup:[15,13],much:[15,11,16],interest:[0,1,16],basic:[0,1,15,8,9,4,12,16],accpet:3,quickli:8,life:15,suppress:[4,8],worker:14,new_task:15,argument:[10,15,8,9,4,12,16],multithread:4,child:16,"catch":[5,15,16],teapot:4,davi:3,ident:[12,16],oher:3,adress:15,servic:[4,6,13],properti:[4,3],neat:16,after_request:[5,4],spawn:[14,16],bin:[0,16],pyramid:13,kwarg:[4,8,9],conf:9,sever:[0,5,4,8,16],betreib:11,on_data:14,perform:[3,5,9,12,13,14,15,16],suggest:[16,9],make:[0,3,5,8,11,4,13,14,9,15,16],transpar:[4,3],drawback:13,split:[0,5,12],folgenden:11,complet:[0,1,15,16,3],fairli:[15,16],rais:[2,3,5,8,9,4,12,15,16],studi:11,kept:[14,15],scenario:[8,16],max_param:4,thu:[15,16],kyle:3,inherit:8,client:[4,14,6,16,3],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],gzip:[1,5],programm:16,everyth:[4,6,16],http_code:4,left:[8,16],evalexcept:5,protocol:[4,16],just:[0,5,8,9,4,13,14,15,16],header_templ:8,yet:[0,8,16],languag:[15,11,2,16,8],previous:[4,12,16],xmlhttprequest:[4,16],expos:[14,16],spread:[13,3],board:15,els:[14,15,2,16,8],save:[15,5,4,12,16],explanatori:16,transit:3,applic:[0,1,2,3,5,6,7,9,10,4,12,13,14,15,16],mayb:15,preserv:8,stpl:[8,3],httprespons:[5,4,16,3],apart:16,measur:[14,9],to_python:12,specif:[0,5,9,4,12,13,14,16],filenam:[4,10,6,16],manual:[0,15,16,13],change_dbfil:9,joegest:3,sebastian:3,underli:4,www:[5,4,15,13],right:[0,1,5,6,8,4,12,13,15,16],old:[0,3,15,11,4,12,13,16],thankfulli:14,deal:[1,4],stopiter:14,somehow:[15,16],dead:14,resolv:[0,4],neve:3,intern:[4,8,16],meinheld:[13,3],bore:16,successfulli:[5,15],autocommit:[10,9],insensit:[10,4,16],bottom:0,untersagt:11,subclass:[4,2,16,3],track:[0,1,5],tracker:0,unit:[1,5],handle_websocket:14,condit:1,foo:5,fieldstorag:[4,16],localhost:[1,5,13,14,15,16],core:[7,16,13],plu:0,cork:7,promot:0,repositori:[0,1],post:[3,15,4,12,5,16],chapter:[1,15,16],postgresql:10,iter_head:4,surround:[15,8],simul:[14,8],is_xhr:4,produc:[8,16],"float":[12,15,8,16,3],encod:[4,8,16,3],bound:4,werkzeug:[5,7,2,3],down:[0,13],sub_templ:8,monkei:[14,5,9],wrap:[4,8,16,9],storag:4,hallo:2,accordingli:[4,13],git:[0,1,2,10],wai:[0,5,6,8,9,4,12,13,15,16],overus:16,support:[0,1,2,3,5,8,10,4,13,15,16],transform:[12,16,13],why:[0,14],avail:[0,1,3,15,7,8,9,4,13,16],width:8,request_method:4,editor:15,overhead:[14,9,13,16,3],gil:13,interv:[0,4],fork:[0,14,2,13],head:[14,4,8,16,12],form:[1,3,15,6,4,12,16],offer:[0,15,16,3],sendfil:16,forg:[4,16],sqlalchemi:7,"true":[10,5,8,9,4,14,15,16],freenod:0,reset:[5,4,9],call_wsgi:5,bugfix:[0,3],depreci:0,maximum:[4,16],tell:[0,3,15,9,13,16],featur:[0,2,3,5,6,8,14,15,16],classic:13,latin9:16,exist:[0,10,2,3,15,4,16],ship:[5,15,13],check:[15,8,16,12],encrypt:[4,16],tip:16,jona:3,test:[0,1,10,5,9,13,15,16],webob:3,unlimit:[14,13],node:14,geton:4,intend:[0,1,16],pywsgi:14,intens:13,intent:[4,16],consid:[0,6,12,16,3],sql:[10,15],outdat:0,receiv:[0,14,15,3],longer:5,furthermor:15,anywher:8,pseudo:[14,5],ignor:[1,5,9,16,3],time:[0,3,5,8,9,4,13,14,15,16],push:[0,5,4,16],lastrowid:15,backward:[0,9,3],concept:[15,9,16,13],chain:8,skip:[0,15,4,16,9],test_db:10,global:[9,4,15,16,13],focus:0,telefon:11,signific:16,primer:[1,5,14],row:[10,15,16,9],decid:[11,16],middl:[14,5],depend:[0,1,5,6,9,4,12,15,16],appstack:[4,16],flash:7,readabl:[15,8],ttingen:16,query_str:[4,16],isinst:[16,9],sourc:[0,1,4,8,11,16],string:[3,15,8,9,4,12,14,16],hellkamp:[1,11,3],word:[1,3,15,9,4,14],exact:[0,12],cool:0,level:[14,4,16],good_html:3,die:11,gui:11,iter:[14,4,16],item:[10,15,4,12],unsupport:4,greenlet:[1,14,13],kolechkin:3,cooki:[1,5,4,16,3],div:8,prevent:[14,5,4,8,16],sign:[4,12,16,3],memfile_max:4,tpl_name:4,port:[1,10,5,4,13,14,15,16],appear:16,scaffold:6,cheetah_view:4,current:[3,15,8,9,4,12,14,16],response_bodi:4,portnumb:15,on_finish:14,block_cont:8,gener:[0,1,15,7,8,4,16],unauthor:[5,4],satisfi:4,explicitli:[14,15,8,16,9],modif:16,send_fil:[16,3],address:[15,6,9,4,13,16],along:[4,15,6,16],wait:[14,5,13],shift:4,dabovil:3,queue:[14,7],behav:[14,4,16],bob:16,commonli:16,regardless:16,extra:[0,7,16],tweak:[0,15],modul:[1,2,10,15,3,4,13,14,16],prefer:[15,16,9],bjoern:[1,13,3],visibl:[0,15,4],instal:[0,1,2,10,15,3,7,9,4,13,16],http_:4,memori:[10,4,16,9],sake:[15,8,16],univers:11,visit:[15,11,16],live:[0,4],handler:[14,4,16,13],value2:16,web2pyd:7,checkout:0,peopl:[5,15,3],claus:16,templat:[3,1,10,15,6,8,9,4,13,16],scharenberg:3,rogereren:3,easiest:[16,13],content_typ:[4,16],fly:5,prepar:[4,13],"ausdr\u00fccklich":11,uniqu:[15,9,12,16,3],imper:15,can:[0,10,3,5,8,9,4,12,13,14,15,16],purpos:[1,15,8,16],problemat:8,claim:1,favourit:4,encapsul:3,stream:[14,5,15],backslash:[8,3],agent:16,topic:16,critic:[0,3],abort:[14,16],occur:[10,16],alwai:[9,4,15,16,13],multipl:[15,8,4,12,13,16],wsgi2:13,wsgi1:13,charset:[4,16],write:[0,3,5,8,9,4,14,15,16],server_stat:16,pure:16,cache_db:10,map:[1,5,4,12,16],product:[0,5,15,16,13],max:15,clone:[0,10,2],make_t:15,usabl:[4,16],commit:[0,10,15,9],mai:[0,3,5,7,8,9,4,12,13,15,16],drastic:3,data:[1,3,5,9,4,13,14,15,16],grow:16,practic:[16,9],johnson:3,favorit:[15,11,13],rollin:3,inform:[0,3,15,6,9,4,16],"switch":[9,4,12,13,14,16],combin:[15,4,16],block:[14,4,8,16],yieldrout:4,hello_again:16,macaron:7,notaccept:2,brain:4,noteworthi:3,still:[0,5,9,4,12,14,15,16],mainli:15,dynam:[1,3,15,6,12,5,16],entiti:4,conjunct:5,group:[15,12,13],thank:[14,3],url_schem:6,precondit:4,yaml:13,window:[15,4,16],test_webapp_index:5,curli:[15,8],mail:[0,1,3,9,11,16],main:[0,15,8,4,14,16],non:[0,2,3,15,8,9,4,12,13,14,16],bottle_child:16,initi:4,cheetah:1,now:[0,3,5,8,9,14,15,16],provision:16,discuss:[0,5],nor:[15,4,16],introduct:[0,15],parse_auth:4,term:[15,4],name:[0,1,2,3,15,6,8,9,10,4,12,13,16],config:[4,12,16,9],drop:[5,3],separ:[0,15,8,9,4,12,16],did:15,rwxrwx:3,compil:[4,8,16],domain:[4,16],replac:[2,3,5,8,9,4,12,14,15],individu:[14,16],continu:[14,4,16,9],ensur:[4,12,16,9],backport:0,year:11,urlpars:4,happen:[14,4,12,16],urlpart:[4,3],shown:15,accomplish:5,profil:[11,16],correct:[8,16],earlier:8,get_head:4,ort:11,getcwd:4,ajax:[14,4,16],orm:[6,7],mime:[15,16],carl:3,org:[5,4,16,3],"byte":[14,15,4,16,3],card:3,care:16,reusabl:7,recod:4,setdefault:[8,3],synchron:[1,14],thing:[0,15,6,12,14,16],place:[15,3],router:[9,4,12,3],ture:4,jaimi:3,think:[15,9],frequent:[1,5,6,16],lambda:14,origin:[0,5,8,9,4,16],directli:[0,15,8,9,4,12,13,16],onc:[0,10,2,5,8,9,4,13,14,15,16],https_app:6,yourself:[5,15,16,3],websocketerror:14,strass:11,oppos:16,open:[0,10,4,15,11,14,16],predefin:[4,16],size:[14,15,4],cherrypyserv:15,ian:3,silent:3,caught:4,basetempl:[4,8],citi:16,necessarili:15,draft:9,circl:14,bottleexcept:[5,4],proposit:5,conveni:[1,4,16],friend:14,pocoo:4,especi:13,copi:[1,5,4,16],specifi:[8,9,4,12,13,16],blacklist:16,github:[0,10,11,2,16],enclos:[12,16],mostli:[4,12,3],holder:1,than:[1,5,9,4,12,13,14,15,16],png:[6,16],greenle:3,serv:[15,7,16,13],wide:[16,9],list_filt:12,configdict:[4,3],cool_featur:0,balanc:[4,6,13],were:[0,3,9,4,12,16],posit:[4,11,12],browser:[1,2,15,4,14,5,16],pre:[0,13],sai:[15,8],nicer:15,ani:[0,1,10,5,8,9,4,12,13,14,15,16],hello_templ:16,doctyp:14,ambigu:12,saw:15,engin:[1,10,15,3,8,4,12,13,16],techniqu:12,all_plugin:4,moreov:4,billma:3,note:[0,1,3,5,9,4,14,15,16],forc:[4,16,9],take:[5,9,4,13,15,16],noth:[8,16],channel:[0,14,16],santiago:3,sure:[0,5,9,4,13,15,16],"4kb":4,normal:[0,14,15,4,16],buffer:[14,4],price:12,compress:[1,5],sublicens:1,pair:[8,16],homepag:[1,13],misconfigur:16,icon:6,latex:0,renam:3,rescu:[1,14],later:[0,10,15,12,14,16],http_x_forwarded_host:6,"ausschlie\u00dflich":11,headerlist:[5,4],runtim:[1,9,13,16,3],pattern:[14,6],show:[10,5,8,9,12,14,15,16],german:11,cheap:[14,13],concurr:[14,13],permiss:[1,16],corner:5,xml:6,onli:[0,3,5,6,8,9,4,12,13,14,15,16],slow:[16,13],transact:10,activ:[0,16,9],jinja2_templ:4,dict:[10,4,8,16,3],hello_world:5,offici:0,variou:[15,16],get:[0,1,2,3,4,5,6,8,9,11,12,13,14,15,16],cannot:[0,14,9],requir:[0,1,2,10,4,5,11,14,16],mapper:7,yield:[14,5,4,16],todo_list:15,bad_html:3,aris:1,where:[10,15,12,16,9],summari:15,wiki:[4,16,9],cookie_decod:4,sean:3,urlarg:4,detect:[15,16],review:15,enough:[14,5,16,9],between:[15,8,9,4,12,13,14,16],freder:3,"import":[0,1,2,3,5,8,9,10,4,13,14,15,16],across:16,august:11,check_login:16,cycl:[10,4],base_templ:8,come:[8,16],quiet:[15,4],contract:1,tutori:[1,15,4,12,13,16],mani:[3,5,8,4,12,14,15,16],among:9,pop:[4,16],colon:[15,16],masklinn:3,poll:14,damag:1,better:[15,3],marc:[11,8,3],kontaktdaten:11,oder:11,mark:[0,15,8,3],cheetah_templ:4,thousand:14,rubi:11,bonjour:2,those:15,sound:12,form_new:12,patch_al:[14,5],mount:[4,16,3],trick:[16,13],cast:[15,4],invok:[14,4,16],advantag:13,wsgiheaderdict:[4,16],henc:16,marcel:[1,11,3],wsgiref:[4,16,13],myapp:[5,16,13],krampf:3,"__init__":[5,4,9],httpserver:13,sigurd:3,author:[1,11,7,8],branko:3,same:[10,3,5,8,9,4,12,13,15,16],epoch:4,html:[0,3,15,8,4,14,16],timestamp:[4,16],eventu:[12,16],mywebapp:5,exhaust:[14,4],finish:14,utf8:[4,8,16],nest:16,confidenti:16,noisefloor:15,driven:10,capabl:1,improv:[16,3],extern:[4,16,13],appropri:[16,9],cherri:0,markup:15,justifi:9,without:[0,1,5,4,13,14,15,16],simplecooki:4,serveradapt:4,manifold:16,execut:[10,15,8,9,4,5,16],when:[0,15,12,16,13],rest:[15,5,8,16],kill:16,touch:16,speed:[9,5,4,8,3],zajonc:3,except:[0,2,3,5,9,4,14,15,16],param:4,blog:[0,16],versa:4,stopwatch:9,vulner:16,earli:[14,16,13],around:[14,16],read:[0,2,3,15,9,4,14,16],web2pi:7,traffic:15,world:[1,5,8,13,14,16],mod:4,best_match:2,whitespac:8,johann:3,integ:[3,15,9,4,12,16],server:[10,2,1,5,3,4,13,14,15,16],benefit:14,either:[3,5,4,13,14,15,16],output:[15,4,8,16,3],manag:[14,15,4,16,13],parse_d:4,authent:[15,4,7],leftblock:8,easili:[5,15,16,3],definit:16,achiev:[15,9,16,3],evolv:9,exit:16,complic:[12,13],refer:[1,15,9,4,13,16],power:[2,5,8,12,13,16],inspect:[5,2,9],unsuccessfulli:5,broken:[4,9],hooksplugin:9,fulli:[4,12],"__name__":5,"throw":15,deflat:5,get_url:4,addition:[14,4,16,3],stand:8,act:[5,13],error404:16,effici:[16,9],status_cod:[4,3],strip:[5,4,15],your:[0,1,2,3,5,6,9,10,4,12,13,14,15,16],log:[5,16],start:[0,1,3,4,5,8,9,11,12,13,14,15,16],interfac:[0,3,15,9,4,13,16],low:[14,16],lot:[0,3,15,11,4,12,13,14,9,16],submiss:16,media:4,bottl:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],new_environ:5,tupl:[10,15,4],bundl:[9,3],mistake404:15,mistake403:15,cryptograph:[4,16],congratul:15,spice:15,pull:0,reappli:0,possibl:[0,3,5,6,8,4,12,14,15,16],"default":[10,2,3,15,8,9,4,12,13,16],start_respons:[4,5,6],stacktrac:15,embed:[1,5,8],routenam:4,connect:[1,10,5,9,4,13,14,15,16],rechtlichen:11,gone:[4,3],creat:[0,15,8,9,4,14,16],certain:[14,15,9],file:[0,1,3,5,7,9,4,13,15,16],fill:4,again:[0,5,9,4,13,15,16],googl:[0,1,13,3],collin:3,setup_rout:12,event:[1,16,14],field:[4,12,16],valid:[15,6,4,12,13,5,16],collis:9,you:[0,1,2,3,5,6,7,8,9,10,4,12,13,14,15,16],nichol:3,"8ccb2d":3,briefli:[14,9],bugfix_nam:0,pool:14,reduc:[0,3],directori:[1,15,6,4,13,16],descript:[9,16,13],tricki:[15,12,13],mimic:4,adam:3,potenti:13,escap:[12,15,8,3],cpu:[14,13],represent:8,myrout:15,forget:[14,4],forbidden:[15,4],lack:8,mainhandl:14,abil:[14,5,15,16],follow:[0,1,2,10,15,3,8,9,4,12,14,16],disk:5,yourapp:13,cachemod:4,hotqueu:7,script_nam:[5,4,3],articl:[1,16,14],tail:4,program:15,rstrip:5,introduc:[0,15,12,16,3],"case":[0,1,10,5,3,8,9,4,12,14,15,16],straightforward:5,fals:[5,4,2,16,8],util:[1,2,15,4,13,16],candid:0,mechan:[5,12],fall:16,veri:[0,10,5,8,9,13,14,15,16],bottleneck:[15,16,13],list:[0,1,3,15,7,8,9,4,12,13,16],sane:16,stderr:4,small:[0,3,5,6,11,14,15,16],status_lin:[4,3],vanilla:8,sierakowski:3,sync:0,past:[1,5,6,13,15,16],zero:4,design:[0,14,6,16,13],pass:[0,10,5,8,9,4,12,14,15,16],further:[0,15,16],haag:3,excit:15,what:[0,3,15,12,14,16],schertel:3,sqlite_plugin:16,sun:3,section:[15,5,12,16],split_com:8,abl:[0,3,15,9,4,16],brief:15,delet:[0,4,16,3],version:[0,10,2,3,15,9,4,13,16],"public":[0,15,6,16],full:[3,5,6,8,4,13,15,16],unmodifi:[1,4,9],behaviour:[0,5,12,3],unstabl:1,restricted_area:16,method:[3,5,7,8,9,4,12,15,16],modifi:[1,15,4,12,16],valu:[10,3,5,6,8,9,4,12,15,16],search:[0,6,9,4,12,16],ahead:16,memcach:7,prior:15,amount:14,pick:0,action:[1,15,8,12,5,16],via:[1,15,9,16,13],show_wiki_pag:16,castfilt:4,baserespons:[4,3],deprec:[4,12,16,3],json1:15,karg:4,select:[10,15,9,16,13],distinct:[4,16],stdout:4,regist:4,two:[0,10,5,8,4,12,15,16],app_reset:4,minor:0,more:[5,7,8,9,4,12,13,14,15,16],debuggedappl:[5,2],stick:16,particular:1,known:[1,15,8,16],cach:[10,3,5,8,9,4,15,16],none:[4,8,16,9],endpoint:14,damien:3,der:11,dev:0,histori:0,remain:4,rfc850:4,dem:11,ning:3,learn:[0,1,15,8,16],def:[10,2,1,5,6,8,9,4,12,14,15,16],cherrypi:[1,5,15,16,13],integrityerror:9,share:[0,14,5,9,13],accept:[0,15,6,9,4,14,16],login_submit:16,phrase:[4,3],accept_languag:2,cours:[1,15,16,9],goal:[1,15],secur:[0,4,2,16,3],rather:[14,5],anoth:[0,3,15,8,9,4,16],comfort:14,snippet:[5,6],mvc:6,simpl:[1,5,7,4,14,15,16],css:[5,16],resourc:[5,4,16],referenc:16,reflect:6,develop:[0,1,3,15,7,9,13,16],makotempl:4,associ:[1,15,16,9],"short":[0,15,8,16],footer:8,row_factori:9,onto:0,django:4,caus:[14,8,16,9],callback:[10,1,5,3,9,4,12,14,16],shade:15,alphabet:3,help:[0,3,15,6,7,8,9,4,14,16],max_ag:[4,16],soon:[0,4,9,11,14,16],through:[0,15,16,13],paramet:[3,15,8,9,4,12,13,16],style:[15,1,5,8],brows:5,pend:0,bypass:16,might:[0,6,9,4,12,14,16],tri:[5,15,13],good:[0,5,9,15,13],"return":[1,2,3,5,6,8,9,10,4,12,14,15,16],headerdict:4,framework:[1,3,5,6,7,13,14,15,16],detach:14,recode_unicod:4,document:[0,1,3,15,8,12,13,14,16],say_hello:2,dictrow:[10,9],refresh:4,micro:[1,5,6,16],contact_pag:16,compris:16,found:[10,3,6,8,9,4,12,16],unicod:[4,16,3],harm:8,do_upload:16,hard:[0,1,14],idea:[0,14,15,9,13],realli:[0,14,15,16],expect:[0,10,15,9,4,14],todo:[1,15],orient:16,"f\u00fcr":11,robert:3,publish:1,footnot:[1,5],print:8,labb:3,proxi:[4,6,16,13],advanc:[6,7,2,16,12],guess:[15,4,16],reason:[3,15,9,4,12,13,16],base:[0,1,3,5,7,8,9,4,13,14,15,16],put:[3,15,9,4,14,16],basi:[10,9],onopen:14,thread:[0,2,15,9,4,13,14,16],wtform:[4,16,3],perman:4,cookie_is_encod:4,lifetim:16,assign:[15,16,3],major:0,obviou:15,malici:[4,16],feel:[1,14],exchang:15,number:[0,5,4,12,13,14,15,16],placehold:6,roesslein:3,done:[0,15,6,12,9],construct:[15,8],stabl:[0,1,4,16,13],miss:[4,9,6,16,3],differ:[0,10,5,8,9,4,12,13,14,15,16],script:[1,5,4,13,14,15,16],interact:[15,2],least:[0,15,16],cheetahtempl:4,statement:[15,8],scheme:4,store:[15,4,16,9],option:[0,10,2,3,15,8,9,4,12,13,16],behind:[4,6,11],websockethandl:14,part:[0,10,3,15,7,9,4,12,13,16],bidirect:14,off:[0,5,4,12,16],wieland:3,kind:[1,2,16],whenev:[4,16],remot:0,remov:[3,15,8,9,4,16],voltron:3,stall:14,str:[15,4,12,16,9],balancermemb:13,comput:11,seth:3,load_app:4,packag:[0,15,7,4,13,14,16],form_edit:12,gala:3,before_request:4,breakthebottl:3,"null":15,karl:3,sell:1,built:[1,2,3,5,7,8,9,4,13,14,15,16],equival:0,remote_addr:[4,16,3],self:[10,5,9,4,14,16],showitem:10,also:[5,9,4,11,13,15,16,12],build:[0,1,6,9,4,13,16],brace:15,to_url:12,distribut:[0,1,15],exec:9,previou:[14,3],reach:14,most:[0,10,3,5,9,4,13,14,15,16],virus:16,path_info:[5,4],maco:15,charg:1,localrequest:4,exc:16,clear:[9,4,16,3],tpl:[15,8,16],cover:[1,12,16],ext:[10,4,2],clean:[0,1,8],pars:[4,12,16],latest:[0,1,2,16,10],awesom:14,wsgi:[1,2,3,5,6,4,13,14,15,16],alphanumer:[12,3],session:[1,5,4,16],worri:[8,16],font:0,fine:[0,15,16,13],find:[15,4,12,16,9],impact:14,access:[10,1,5,3,8,9,4,13,15,16],pretti:[14,15],my_ip:16,solut:[14,15,6,16],retun:4,show_ip:16,wsgidaemonprocess:[15,13],login_form:16,goldfaber3012:3,hit:[4,12,16],unus:4,"__file__":[15,4,13],express:[1,3,15,6,8,4,12,16],say_bar:5,autojson:4,nativ:[4,3],xb6ttingen:16,fastest:13,zombat:3,liabl:1,restart:[15,16,9],keyword:[10,8,9,4,12,16],rfc:[5,4],common:[1,3,5,6,8,4,12,13,14,15,16],send_stat:16,wrote:15,set:[0,10,2,3,15,6,7,8,9,4,13,16],sipo:3,mutabl:9,see:[0,3,5,8,9,4,14,15,16],arg:[4,8,9],close:[10,5,8,9,4,14,15,16],analog:8,someth:[4,15,11,8],topmost:3,greg:3,fcamel:3,hold:[15,4],experi:11,formsdict:[4,16,3],altern:[15,7,2,16],signatur:[4,16],tristan:3,numer:[4,3],javascript:[4,14,15,11,16],isol:16,lowercas:4,infastructur:5,solv:[0,16],session_opt:5,popul:16,both:[0,10,5,9,4,12,13,14,15,16],last:[0,10,15,9,4,16],delimit:12,alon:[8,16],context:[1,2,3,5,9,16],pdf:[0,16],whole:[0,14,9,16,3],load:[3,15,6,4,13,16],simpli:[0,15,16],point:[0,1,5,9,4,14,15,16],instanti:4,root_app:4,header:[1,3,5,6,8,9,4,16],littl:15,linux:[0,15],mistak:15,backend:[5,16,13],static_dir:13,due:[14,5,13],empti:[14,4,8,16],whom:1,secret:[4,16],unambigu:12,imag:[5,6,16,13],fapws3:[1,15,13],fritz:3,partli:13,func:4,demand:[9,4,16,3],repetit:[0,16],wsgiserv:[14,16,13],convers:4,remote_us:4,look:[5,7,9,4,13,14,15,16],frozen:0,straight:14,"while":[0,15,8,9,14,16],match:[3,15,6,4,12,16],behavior:[5,4,8,16,9],error:[10,2,3,15,6,9,4,12,16],anonym:3,everyon:[0,14],loop:14,expir:[4,16],propag:5,pound:13,readi:[0,6,16,13],rfc1123:4,itself:[2,15,8,9,5,16],"g\u00f6ttingen":[11,16],decor:[3,15,9,4,12,5,16],grant:1,webtest:5,decod:[4,16,3],sqlite3:[10,15,7,9],mod_wsgi:[15,6,13],conflict:[0,4,9],higher:[15,4],wsock:14,"\u00e4hnlichen":11,optim:[1,9,13,16,3],painless:16,alert:14,moment:4,temporari:[0,4],user:[1,5,9,4,13,15,16],robust:13,specialis:4,stack:[4,5,6,16],recent:[0,4,16],noninfring:1,task:[15,16,13],junod:3,kraken:3,pickl:[4,16,3],person:[0,1,15],expens:[14,13],explan:5,routereset:9,openli:0,wickman:3,morsel:4,recognis:8,mysql:10,cut:16,evalex:2,shortcut:[4,16],global_config:4,input:[15,4,8,16],subsequ:[4,9],pasteserv:15,marco:3,obsolet:3,format:[15,16],big:[5,4,16],api_vers:13,insert:[15,6,16],bit:[12,13],stranger:[8,16],signal:16,cur_data:15,httponli:[4,16],collect:[0,1,5,7,16],popular:[5,4],flup:[15,13],often:[5,16],some:[0,3,5,6,8,9,4,12,13,14,15,16],back:[0,10,14,16,13],sampl:5,virtualenv:[0,16],scale:15,shall:1,pep:[14,4],per:[10,9,4,16,14],larg:[15,4],slash:[1,5,6,4,12,15,16],nose:5,cgi:[13,4,16,3],run:[0,1,10,5,6,3,4,13,14,15,16],step:[0,15,12],prerequisit:0,"tom\u00e1":3,meantim:0,wget:16,unicodeerror:16,af93ec:3,prove:0,plai:16,degoi:3,wsgiapplicationgroup:[15,13],dialog:16,stuart:3,showpag:9,plan:[0,7],real:[15,6,8,9,4,11,14],add_path:4,within:[15,8,9,4,13,5,16],jinja2templ:4,contributor:[1,3],announc:0,occupi:14,span:8,question:[1,6,7,16,11],fast:[1,5,6,8,13,16],custom:[3,6,9,4,12,16],heroku:[1,5],includ:[0,1,2,15,8,4,12,14,16],forward:[14,15,4,16,13],properli:[15,9],verb:16,rackham:3,link:[1,16],newer:[4,16],line:[3,15,8,9,4,14,16],murphi:3,utc:4,utf:4,iuri:3,consist:[10,4,12,16],intim:5,test_functional_login_logout:5,highlight:15,similar:[0,3,8,9,4,12,13,14,16],debugplugin:16,constant:4,parser:[8,3],repres:4,"char":[15,16],incomplet:[13,16,3],chat:[0,14],titl:[8,16],codec:16,fixed_app:6,nice:[15,16],localrespons:4,is_ajax:[4,16],lend:5,mongodb:7,meaning:16,enctyp:16,algorithm:5,vice:4,mimetyp:[15,16],virtualhost:[15,13],far:[15,11],fresh:16,hello:[1,2,5,8,4,12,14,16],prototyp:[10,6],code:[0,1,3,4,5,8,9,11,12,15,16],partial:[4,3],edg:4,queri:[13,4,15,16,3],privat:0,follow_us:12,friendli:5,send:[0,14,15,16],snag:[14,16],getargspec:9,sent:[15,4,16,3],deactiv:16,rollback:9,splitresult:4,"h\u00f8gsbro":3,nabriski:3,chdir:[15,13],facebook:13,b14b9a:3,relev:4,recip:[1,5,16],notabl:4,button:0,michael:3,"try":[14,12,16,9],evt:14,pleas:[0,1,2,3,15,9,16],bottlepi:[0,16,3],impli:1,smaller:4,natur:14,crop:5,focu:15,video:5,virtaulli:9,download:[0,1,2,10,3,16],somewsgiappl:5,click:0,append:4,compat:[0,9,13,3],index:[10,1,5,3,4,12],compar:14,anton:3,m35:3,cell:15,progess:15,whatev:[15,16,9],pagenam:16,len:16,closur:9,logout:5,ubuntu:16,vukel:3,becom:[15,16,13],sinc:[10,14,16,3],convert:[15,12,16],mailinglist:[0,11],copyright:1,artifici:15,larger:[10,15],file_wrapp:16,chang:[0,10,3,5,9,4,12,13,15,16],chanc:16,danger:16,appli:[0,3,15,9,4,16],app:[1,2,3,5,6,7,9,10,4,12,13,14,16],gatewai:4,apt:[0,16],api:[0,1,3,15,8,9,4,13,14,16],regexp:[12,16],redi:7,cloud:5,from:[0,1,2,3,5,8,9,10,4,13,14,15,16],zip:0,commun:[0,14,13],doubl:[15,2,8,3],next:[0,3,15,6,9,4,12,14,16],websit:[15,11],few:[14,15],sort:[15,3],proxypass:13,benchmark:14,trail:[1,5],name2:16,rare:[0,9,16,3],alexei:3,account:[0,16],alik:16,retriev:[15,16],alia:4,alic:16,annoi:8,thin:16,meet:16,fetch:[0,14,5,4,16],aliv:[1,5],control:[3,5,9,4,12,13,16],sqlite:[10,15,7,16,9],quickstart:[1,5,16],tar:0,process:[15,9,4,13,14,16],lock:13,sudo:[0,16],high:[14,16,13],tag:[0,15],delai:16,filepath:[6,16],data_dir:5,narr:4,brian:3,subdirectori:16,instead:[0,3,15,6,8,9,4,13,14,16],overridden:16,stop:[14,15,8,16,12],xc3:16,geventwebsocket:14,debugger_class:2,bind:[14,15,4,16],counter:[5,16],correspond:[0,1,15,16,14],element:12,issu:[0,16,9],returend:4,allow:[0,1,2,3,5,6,8,4,12,13,14,15,16],fallback:16,furnish:1,move:[14,15,4],comma:[8,12],tort:1,werkzueg:2,georg:11,therefor:9,crash:[5,16],dal:7,auto:[3,5,4,13,15,16],databs:15,handi:16,auth:[4,16,3],onmessag:14,mention:[0,16],automat:[10,3,15,8,9,4,13,16],front:[5,4,8],align:8,anyth:[0,15,4,16,9],edit:[0,15,12,16],debuggingmiddlewar:5,nameerror:8,mode:[5,4,16,3],chunk:[14,16],getlist:4,new_id:15,meta:[4,7,16,9],"static":[3,5,7,9,12,13,15,16],our:[0,15,16],explicit:[1,12,16],special:[14,4,8,16,3],out:[1,5,6,8,11,4,13],variabl:[15,4,8,16,3],twice:16,req:2,texliv:0,suitabl:[15,6],rel:[14,4,16,13],enable_cor:5,dbfile:[10,16,9],insid:15,workflow:[0,1],kontaktaufnahm:11,frank:3,manipul:[4,16],undo:0,dictionari:[3,5,9,4,15,16],releas:[0,1,16,3],my_todo_list:15,greedi:[12,16],indent:[8,16],unwant:9,could:[5,16],learning_python:16,david:3,length:[4,16],outsid:13,waitress:[13,3],cookie_expir:5,softwar:[1,15,10],delete_cooki:4,date:0,owner:4,contextloc:16,prioriti:16,"long":[0,15,8,9,4,14,16],unknown:4,licens:1,perfectli:[15,16,13],system:[10,5,15,16],wrapper:[4,2,9],attach:[4,16,13],attack:[8,16],request_class:2,physic:13,termin:[14,4,16],"final":[1,3,15,9,14,16],gotcha:16,shallow:4,insbesonder:11,exactli:[14,15,4,16],bei:11,bother:15,bottle_sqlit:16,requesthandl:14,structur:[0,1,4,16,3],charact:[3,15,8,4,12,16],sens:15,exp:12,heuss:11,kellei:3,have:[0,1,2,3,5,6,7,8,9,10,4,13,14,15,16],tabl:15,need:[0,10,3,5,9,12,13,14,15,16],itamar:3,turn:[5,4,16],border:15,optimis:16,mako_view:4,rout:[3,10,2,1,5,6,9,4,12,14,15,16],pluginerror:9,mix:[14,15,4],my_bugfix:0,which:[0,2,5,9,4,12,14,15,16],mit:[1,11],singl:[1,3,15,8,9,4,13,16],uppercas:4,rfc3986:5,deploy:[1,16,13],borzenkov:3,who:3,callabl:[8,9,4,12,13,14,16],segment:[4,12,16],payment:4,latin1:[4,16],url:[0,1,3,5,6,9,4,12,13,14,15,16],request:[0,1,2,3,5,6,7,9,10,4,12,13,14,15,16],uri:4,deni:[15,16,13],snapshot:16,determin:12,skiplist:[4,9],fact:[0,8,12],text:[14,15,4,8,16],verbos:[16,3],bring:15,server_nam:[4,13],fear:9,input_encod:4,trivial:0,anywai:[0,5,15,13],redirect:[4,6,16,3],textual:16,locat:[6,16,3],your_github_account:0,should:[0,3,5,6,9,4,12,13,14,15,16],won:[15,6,8,16,9],suppos:15,add_filt:12,local:[0,10,2,6,8,9,4,13,16],hope:3,footer_templ:8,pypa:16,contribut:[0,1],pypi:[0,1,16],autom:[16,13],autor:11,increas:[0,16,13],milbi:3,lossless:4,httperror:[10,3,5,9,4,16],enabl:[15,2,16,9],approach:16,stuff:0,integr:[0,7,2,16],contain:[0,10,15,8,9,4,12,16],grab:[15,16],view:[4,15,6,8,16],conform:[14,9,4,13],legaci:[1,12],smooth:3,frame:8,knowledg:[1,15],accord:1,multipart:[5,4,16],mileston:0,statu:[5,4,15,16,3],wire:16,correctli:[4,16],edit_task:15,favor:9,state:[10,15,13],neither:[4,16],email:[0,16],verifi:4,kei:[2,3,15,8,4,5,16],apheag:3,entir:[0,16],gilmor:3,exclam:8,addit:[10,3,15,8,9,4,16],plugin:[10,2,1,5,3,7,9,4,16],admin:[9,5,4,13],equal:[4,9,6,12,3],someasyncwork:14,etc:[15,16],instanc:[10,2,3,9,4,12,13,16],sigterm:16,comment:[0,8],venv:0,rfc2617:4,arriv:12,distinguish:12,rpc:6,template_path:[6,16],quit:[15,16,9],silvio:3,platform:5,fix_environ_middlewar:6,sqliteplugin:[1,16,9],json:[15,4,16,3],treat:[5,16],immedi:[4,8,16,9],catchal:[5,4,16],soulier:3,assert:[5,16],decim:[12,16],togeth:[12,16],present:[0,3,15,8,9,4,16],multi:[15,8,9,4,13,14,16],plain:[15,4,16],fapwsserv:15,cursor:15,defin:[3,5,8,9,4,12,14,15,16],item_:15,rightblock:8,glossari:[1,16],fullpath:4,werb:11,layer:16,helper:[8,16,13],almost:[0,14],site:[0,14,5],path_shift:4,roll:10,archiv:0,duan:3,substanti:1,lightweight:1,revis:[0,15],scienc:11,simpletaltempl:3,let:[0,5,8,9,4,13,14,15,16],welcom:16,parti:[7,16],cross:[5,16],python:[0,1,2,3,4,5,8,10,11,12,13,14,15,16],httperf:14,multidict:[4,16,3],fetchon:[10,15,16,9],difficult:8,http:[0,1,5,6,9,4,13,14,15,16],hostnam:4,show_item:15,maxlength:15,upon:[5,7],effect:[14,15,16,9],column_nam:9,expand:3,default_app:[3,15,6,4,13,16],nevertheless:15,keyboardinterrupt:16,myclust:13,well:[14,15,4,16,13],theodor:11,set_cooki:[4,16,3],exampl:[0,1,2,5,6,8,9,4,12,13,14,15,16],command:[10,15,2,16,3],choos:[15,9,12,13],undefin:[8,3],piec:[15,16],usual:[15,8,9,4,5,16],test2:16,newest:[4,16],rocket:13,less:[14,16,9],obtain:1,static_fil:[15,9,16,3],web:[0,1,5,6,7,4,13,14,15,16],jinja:4,jeff:3,smith:[16,3],getal:[4,16],add:[0,10,2,3,5,6,7,8,9,4,12,13,14,15,16],listenhttp:13,buxton:3,lookup:[4,8,13],smart:16,branch:0,webseit:11,howto:1,show_json:15,cedar:5,know:[0,15,6,9,12,14],password:[15,4,16],recurs:9,mypag:15,xss:[8,16],like:[10,5,6,9,4,13,14,15,16],success:[15,16],incred:[14,16],necessari:15,async:5,page:[0,10,2,5,8,9,4,12,14,15,16],apexi200sx:3,revers:[4,6,16,13],twitter:[0,11],gevent:[14,5,13,3],flush:16,proper:[5,15],guarante:0,librari:[10,2,1,5,7,8,4,13,14,15,16],tmp:[10,16,9],guid:[0,1,3,5,7,9,16],lead:[4,8],avoid:[0,3,9,4,12,14,16],overlap:12,jeremi:3,speak:14,murdock:3,usag:[1,2,10,7,8,9,14,16],symlink:4,host:[0,1,5,6,4,13,14,15,16],obei:2,although:[15,6],simplet:3,stage:16,beaker:5,get_iso:16,about:[0,1,15,6,7,8,9,11,14,16],actual:[0,15,9,4,13,14],socket:[14,16],column:[15,8,9],disabl:[8,16,9],own:[0,15,4,12,13,5,16],easy_instal:[1,15,2,16,10],get_latin:16,warranti:1,pitfal:[1,6],merg:[0,1,4,16,3],before_callback:5,mod_python:6,new_item:15,trigger:[0,10,4,16],request_environ:4,"var":[14,15,4,13],"function":[1,3,5,7,8,9,4,12,13,14,15,16],check_user_credenti:16,brand:3,subscrib:0,alexi:3,bodi:[3,8,9,4,14,16],gain:15,uninstal:[4,16,9],display_forum:16,eas:16,inlin:8,bug:[0,1,3,15,8,9],count:16,made:[15,9,16,3],whether:[1,15,10],resourcemanag:[4,3],writeabl:4,displai:16,asynchron:[1,5,14,13],below:[5,9,4,13,15,16],limit:[1,9,4,13,14,16],otherwis:[1,15,4,8,12],problem:[1,9,6,16,14],evalu:[2,16],"int":[15,5,12,16,3],dure:[5,4,15,16],twist:[14,13],problemen:11,implement:[0,2,3,5,7,8,9,4,12,14,16],pip:[0,10,2,16],probabl:[0,14,16,9],vorgesehen:11,"2to3":3,detail:[3,5,9,4,12,14,15,16],virtual:[14,15,16,13],other:[0,1,3,5,6,7,8,9,4,12,15,16],bool:15,futur:[0,3,9,4,12,16],rememb:15,user_api:16,servernam:[15,13],"class":[10,2,1,5,3,8,9,4,14,16],debian:16,stai:[0,6,12],sphinx:[0,16],rule:[0,1,9,4,12,16],gsite:11,portion:[1,4],show_post:16,understand:[15,12,13]},objtypes:{"0":"py:module","1":"py:function","2":"py:method","3":"py:attribute","4":"py:class","5":"py:data","6":"py:exception","7":"py:classmethod"},titles:["Developer Notes","Bottle: Python Web Framework","Bottle-Werkzeug","Release Notes and Changelog","API Reference","Recipes","Frequently Asked Questions","List of available Plugins","SimpleTemplate Engine","Plugin Development Guide","Bottle-SQLite","Contact","Request Routing","Deployment","Primer to Asynchronous Applications","Tutorial: Todo-List Application","Tutorial"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","class","Python class"],"5":["py","data","Python data"],"6":["py","exception","Python exception"],"7":["py","classmethod","Python class method"]},filenames:["development","index","plugins/werkzeug","changelog","api","recipes","faq","plugins/index","stpl","plugindev","plugins/sqlite","contact","routing","deployment","async","tutorial_app","tutorial"]}) \ No newline at end of file diff --git a/html/stpl.html b/html/stpl.html new file mode 100644 index 0000000..9b683e6 --- /dev/null +++ b/html/stpl.html @@ -0,0 +1,427 @@ + + + + + + + + + + SimpleTemplate Engine — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

SimpleTemplate Engine¶

+

Bottle comes with a fast, powerful and easy to learn built-in template engine called SimpleTemplate or stpl for short. It is the default engine used by the view() and template() helpers but can be used as a stand-alone general purpose template engine too. This document explains the template syntax and shows examples for common use cases.

+

Basic API Usage:

+

SimpleTemplate implements the BaseTemplate API:

+
>>> from bottle import SimpleTemplate
+>>> tpl = SimpleTemplate('Hello {{name}}!')
+>>> tpl.render(name='World')
+u'Hello World!'
+
+
+

In this document we use the template() helper in examples for the sake of simplicity:

+
>>> from bottle import template
+>>> template('Hello {{name}}!', name='World')
+u'Hello World!'
+
+
+

Just keep in mind that compiling and rendering templates are two different actions, even if the template() helper hides this fact. Templates are usually compiled only once and cached internally, but rendered many times with different keyword arguments.

+
+

SimpleTemplate Syntax¶

+

Python is a very powerful language but its whitespace-aware syntax makes it difficult to use as a template language. SimpleTemplate removes some of these restrictions and allows you to write clean, readable and maintainable templates while preserving full access to the features, libraries and speed of the Python language.

+
+

Warning

+

The SimpleTemplate syntax compiles directly to python bytecode and is executed on each SimpleTemplate.render() call. Do not render untrusted templates! They may contain and execute harmful python code.

+
+
+

Inline Expressions¶

+

You already learned the use of the {{...}} syntax from the “Hello World!” example above, but there is more: any python expression is allowed within the curly brackets as long as it returns a string or something that has a string representation:

+
>>> template('Hello {{name}}!', name='World')
+u'Hello World!'
+>>> template('Hello {{name.title() if name else "stranger"}}!', name=None)
+u'Hello stranger!'
+>>> template('Hello {{name.title() if name else "stranger"}}!', name='mArC')
+u'Hello Marc!'
+
+
+

The contained python expression is executed at render-time and has access to all keyword arguments passed to the SimpleTemplate.render() method. HTML special characters are escaped automatically to prevent XSS attacks. You can start the expression with an exclamation mark to disable escaping for that expression:

+
>>> template('Hello {{name}}!', name='<b>World</b>')
+u'Hello &lt;b&gt;World&lt;/b&gt;!'
+>>> template('Hello {{!name}}!', name='<b>World</b>')
+u'Hello <b>World</b>!'
+
+
+
+
+

Embedded python code¶

+

The % character marks a line of python code. The only difference between this and real python code is that you have to explicitly close blocks with an %end statement. In return you can align the code with the surrounding template and don’t have to worry about correct indentation of blocks. The SimpleTemplate parser handles that for you. Lines not starting with a % are rendered as text as usual:

+
%if name:
+  Hi <b>{{name}}</b>
+%else:
+  <i>Hello stranger</i>
+%end
+
+
+

The % character is only recognised if it is the first non-whitespace character in a line. To escape a leading % you can add a second one. %% is replaced by a single % in the resulting template:

+
This line contains a % but no python code.
+%% This text-line starts with '%'
+%%% This text-line starts with '%%'
+
+
+
+
+

Suppressing line breaks¶

+

You can suppress the line break in front of a code-line by adding a double backslash at the end of the line:

+
<span>\\
+%if True:
+nobreak\\
+%end
+</span>
+
+
+

This template produces the following output:

+
<span>nobreak</span>
+
+
+
+
+

The %include Statement¶

+

You can include other templates using the %include sub_template [kwargs] statement. The sub_template parameter specifies the name or path of the template to be included. The rest of the line is interpreted as a comma-separated list of key=statement pairs similar to keyword arguments in function calls. They are passed to the sub-template analogous to a SimpleTemplate.render() call. The **kwargs syntax for passing a dict is allowed too:

+
%include header_template title='Hello World'
+<p>Hello World</p>
+%include footer_template
+
+
+
+
+

The %rebase Statement¶

+

The %rebase base_template [kwargs] statement causes base_template to be rendered instead of the original template. The base-template then includes the original template using an empty %include statement and has access to all variables specified by kwargs. This way it is possible to wrap a template with another template or to simulate the inheritance feature found in some other template engines.

+

Let’s say you have a content template and want to wrap it with a common HTML layout frame. Instead of including several header and footer templates, you can use a single base-template to render the layout frame.

+

Base-template named layout.tpl:

+
<html>
+<head>
+  <title>{{title or 'No title'}}</title>
+</head>
+<body>
+  %include
+</body>
+</html>
+
+
+

Main-template named content.tpl:

+
This is the page content: {{content}}
+%rebase layout title='Content Title'
+
+
+

Now you can render content.tpl:

+
>>> print template('content', content='Hello World!')
+
+
+
<html>
+<head>
+  <title>Content Title</title>
+</head>
+<body>
+  This is the page content: Hello World!
+</body>
+</html>
+
+
+

A more complex scenario involves chained rebases and multiple content blocks. The block_content.tpl template defines two functions and passes them to a columns.tpl base template:

+
%def leftblock():
+  Left block content.
+%end
+%def rightblock():
+  Right block content.
+%end
+%rebase columns leftblock=leftblock, rightblock=rightblock, title=title
+
+
+

The columns.tpl base-template uses the two callables to render the content of the left and right column. It then wraps itself with the layout.tpl template defined earlier:

+
%rebase layout title=title
+<div style="width: 50%; float:left">
+  %leftblock()
+</div>
+<div style="width: 50%; float:right">
+  %rightblock()
+</div>
+
+
+

Lets see how block_content.tpl renders:

+
>>> print template('block_content', title='Hello World!')
+
+
+
<html>
+<head>
+  <title>Hello World</title>
+</head>
+<body>
+<div style="width: 50%; float:left">
+  Left block content.
+</div>
+<div style="width: 50%; float:right">
+  Right block content.
+</div>
+</body>
+</html>
+
+
+
+
+

Namespace Functions¶

+

Accessing undefined variables in a template raises NameError and +stops rendering immediately. This is standard python behavior and nothing new, +but vanilla python lacks an easy way to check the availability of a variable. +This quickly gets annoying if you want to support flexible inputs or use the +same template in different situations. SimpleTemplate helps you out here: The +following three functions are defined in the default namespace and accessible +from anywhere within a template:

+
+
+defined(name)¶
+

Return True if the variable is defined in the current template namespace, +False otherwise.

+
+ +
+
+get(name, default=None)¶
+

Return the variable, or a default value.

+
+ +
+
+setdefault(name, default)¶
+

If the variable is not defined, create it with the given default value. +Return the variable.

+
+ +

Here is an example that uses all three functions to implement optional template +variables in different ways:

+
% setdefault('text', 'No Text')
+<h1>{{get('title', 'No Title')}}</h1>
+<p> {{ text }} </p>
+% if defined('author'):
+  <p>By {{ author }}</p>
+% end
+
+
+
+
+
+

SimpleTemplate API¶

+
+
+class SimpleTemplate(source=None, name=None, lookup=[], encoding='utf8', **settings)[source]¶
+
+
+classmethod split_comment(code)[source]¶
+

Removes comments (#...) from python code.

+
+ +
+
+render(*args, **kwargs)[source]¶
+

Render the template using keyword arguments as local variables.

+
+ +
+ +
+
+

Known bugs¶

+

Some syntax constructions allowed in python are problematic within a template. The following syntaxes won’t work with SimpleTemplate:

+
+
    +
  • Multi-line statements must end with a backslash (\) and a comment, if present, must not contain any additional # characters.
  • +
  • Multi-line strings are not supported yet.
  • +
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Request Routing

+

Next topic

+

API Reference

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/tutorial.html b/html/tutorial.html new file mode 100644 index 0000000..dc3207f --- /dev/null +++ b/html/tutorial.html @@ -0,0 +1,988 @@ + + + + + + + + + + Tutorial — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Tutorial¶

+

This tutorial introduces you to the concepts and features of the Bottle web framework and covers basic and advanced topics alike. You can read it from start to end, or use it as a reference later on. The automatically generated API Reference may be interesting for you, too. It covers more details, but explains less than this tutorial. Solutions for the most common questions can be found in our Recipes collection or on the Frequently Asked Questions page. If you need any help, join our mailing list or visit us in our IRC channel.

+
+

Installation¶

+

Bottle does not depend on any external libraries. You can just download bottle.py into your project directory and start coding:

+
$ wget http://bottlepy.org/bottle.py
+
+
+

This will get you the latest development snapshot that includes all the new features. If you prefer a more stable environment, you should stick with the stable releases. These are available on PyPi and can be installed via pip (recommended), easy_install or your package manager:

+
$ sudo pip install bottle              # recommended
+$ sudo easy_install bottle             # alternative without pip
+$ sudo apt-get install python-bottle   # works for debian, ubuntu, ...
+
+
+

Either way, you’ll need Python 2.5 or newer (including 3.x) to run bottle applications. If you do not have permissions to install packages system-wide or simply don’t want to, create a virtualenv first:

+
$ virtualenv develop              # Create virtual environment
+$ source develop/bin/activate     # Change default python to virtual one
+(develop)$ pip install -U bottle  # Install bottle to virtual environment
+
+
+

Or, if virtualenv is not installed on your system:

+
$ wget https://raw.github.com/pypa/virtualenv/master/virtualenv.py
+$ python virtualenv.py develop    # Create virtual environment
+$ source develop/bin/activate     # Change default python to virtual one
+(develop)$ pip install -U bottle  # Install bottle to virtual environment
+
+
+
+
+

Quickstart: “Hello World”¶

+

This tutorial assumes you have Bottle either installed or copied into your project directory. Let’s start with a very basic “Hello World” example:

+
from bottle import route, run
+
+@route('/hello')
+def hello():
+    return "Hello World!"
+
+run(host='localhost', port=8080, debug=True)
+
+
+

This is it. Run this script, visit http://localhost:8080/hello and you will see “Hello World!” in your browser. Here is how it works:

+

The route() decorator binds a piece of code to an URL path. In this case, we link the /hello URL to the hello() function. This is called a route (hence the decorator name) and is the most important concept of this framework. You can define as many routes as you want. Whenever a browser requests an URL, the associated function is called and the return value is sent back to the browser. Its as simple as that.

+

The run() call in the last line starts a built-in development server. It runs on localhost port 8080 and serves requests until you hit Control-c. You can switch the server backend later, but for now a development server is all we need. It requires no setup at all and is an incredibly painless way to get your application up and running for local tests.

+

The Debug Mode is very helpful during early development, but should be switched off for public applications. Keep that in mind.

+

Of course this is a very simple example, but it shows the basic concept of how applications are built with Bottle. Continue reading and you’ll see what else is possible.

+
+

The Default Application¶

+

For the sake of simplicity, most examples in this tutorial use a module-level route() decorator to define routes. This adds routes to a global “default application”, an instance of Bottle that is automatically created the first time you call route(). Several other module-level decorators and functions relate to this default application, but if you prefer a more object oriented approach and don’t mind the extra typing, you can create a separate application object and use that instead of the global one:

+
from bottle import Bottle, run, template
+
+app = Bottle()
+
+@app.route('/hello')
+def hello():
+    return "Hello World!"
+
+run(app, host='localhost', port=8080)
+
+
+

The object-oriented approach is further described in the Default Application section. Just keep in mind that you have a choice.

+
+
+
+

Request Routing¶

+

In the last chapter we built a very simple web application with only a single route. Here is the routing part of the “Hello World” example again:

+
@route('/hello')
+def hello():
+    return "Hello World!"
+
+
+

The route() decorator links an URL path to a callback function, and adds a new route to the default application. An application with just one route is kind of boring, though. Let’s add some more:

+
@route('/')
+@route('/hello/<name>')
+def greet(name='Stranger'):
+    return template('Hello {{name}}, how are you?', name=name)
+
+
+

This example demonstrates two things: You can bind more than one route to a single callback, and you can add wildcards to URLs and access them via keyword arguments.

+
+

Dynamic Routes¶

+

Routes that contain wildcards are called dynamic routes (as opposed to static routes) and match more than one URL at the same time. A simple wildcard consists of a name enclosed in angle brackets (e.g. <name>) and accepts one or more characters up to the next slash (/). For example, the route /hello/<name> accepts requests for /hello/alice as well as /hello/bob, but not for /hello, /hello/ or /hello/mr/smith.

+

Each wildcard passes the covered part of the URL as a keyword argument to the request callback. You can use them right away and implement RESTful, nice-looking and meaningful URLs with ease. Here are some other examples along with the URLs they’d match:

+
@route('/wiki/<pagename>')            # matches /wiki/Learning_Python
+def show_wiki_page(pagename):
+    ...
+
+@route('/<action>/<user>')            # matches /follow/defnull
+def user_api(action, user):
+    ...
+
+
+

+New in version 0.10.

+

Filters are used to define more specific wildcards, and/or transform the covered part of the URL before it is passed to the callback. A filtered wildcard is declared as <name:filter> or <name:filter:config>. The syntax for the optional config part depends on the filter used.

+

The following filters are implemented by default and more may be added:

+
    +
  • :int matches (signed) digits only and converts the value to integer.
  • +
  • :float similar to :int but for decimal numbers.
  • +
  • :path matches all characters including the slash character in a non-greedy way and can be used to match more than one path segment.
  • +
  • :re allows you to specify a custom regular expression in the config field. The matched value is not modified.
  • +
+

Let’s have a look at some practical examples:

+
@route('/object/<id:int>')
+def callback(id):
+    assert isinstance(id, int)
+
+@route('/show/<name:re:[a-z]+>')
+def callback(name):
+    assert name.isalpha()
+
+@route('/static/<path:path>')
+def callback(path):
+    return static_file(path, ...)
+
+
+

You can add your own filters as well. See Routing for details.

+

+Changed in version 0.10.

+

The new rule syntax was introduced in Bottle 0.10 to simplify some common use cases, but the old syntax still works and you can find a lot of code examples still using it. The differences are best described by example:

+ ++++ + + + + + + + + + + + + + + + + + + + +
Old SyntaxNew Syntax
:name<name>
:name#regexp#<name:re:regexp>
:#regexp#<:re:regexp>
:##<:re>
+

Try to avoid the old syntax in future projects if you can. It is not currently deprecated, but will be eventually.

+
+
+

HTTP Request Methods¶

+

The HTTP protocol defines several request methods (sometimes referred to as “verbs”) for different tasks. GET is the default for all routes with no other method specified. These routes will match GET requests only. To handle other methods such as POST, PUT or DELETE, add a method keyword argument to the route() decorator or use one of the four alternative decorators: get(), post(), put() or delete().

+

The POST method is commonly used for HTML form submission. This example shows how to handle a login form using POST:

+
from bottle import get, post, request
+
+@get('/login') # or @route('/login')
+def login_form():
+    return '''<form method="POST" action="/login">
+                <input name="name"     type="text" />
+                <input name="password" type="password" />
+                <input type="submit" />
+              </form>'''
+
+@post('/login') # or @route('/login', method='POST')
+def login_submit():
+    name     = request.forms.get('name')
+    password = request.forms.get('password')
+    if check_login(name, password):
+        return "<p>Your login was correct</p>"
+    else:
+        return "<p>Login failed</p>"
+
+
+

In this example the /login URL is linked to two distinct callbacks, one for GET requests and another for POST requests. The first one displays a HTML form to the user. The second callback is invoked on a form submission and checks the login credentials the user entered into the form. The use of Request.forms is further described in the Request Data section.

+

Special Methods: HEAD and ANY

+

The HEAD method is used to ask for the response identical to the one that would correspond to a GET request, but without the response body. This is useful for retrieving meta-information about a resource without having to download the entire document. Bottle handles these requests automatically by falling back to the corresponding GET route and cutting off the request body, if present. You don’t have to specify any HEAD routes yourself.

+

Additionally, the non-standard ANY method works as a low priority fallback: Routes that listen to ANY will match requests regardless of their HTTP method but only if no other more specific route is defined. This is helpful for proxy-routes that redirect requests to more specific sub-applications.

+

To sum it up: HEAD requests fall back to GET routes and all requests fall back to ANY routes, but only if there is no matching route for the original request method. It’s as simple as that.

+
+
+

Routing Static Files¶

+

Static files such as images or CSS files are not served automatically. You have to add a route and a callback to control which files get served and where to find them:

+
from bottle import static_file
+@route('/static/<filename>')
+def server_static(filename):
+    return static_file(filename, root='/path/to/your/static/files')
+
+
+

The static_file() function is a helper to serve files in a safe and convenient way (see Static Files). This example is limited to files directly within the /path/to/your/static/files directory because the <filename> wildcard won’t match a path with a slash in it. To serve files in subdirectories, change the wildcard to use the path filter:

+
@route('/static/<filepath:path>')
+def server_static(filepath):
+    return static_file(filepath, root='/path/to/your/static/files')
+
+
+

Be careful when specifying a relative root-path such as root='./static/files'. The working directory (./) and the project directory are not always the same.

+
+
+

Error Pages¶

+

If anything goes wrong, Bottle displays an informative but fairly plain error page. You can override the default for a specific HTTP status code with the error() decorator:

+
from bottle import error
+@error(404)
+def error404(error):
+    return 'Nothing here, sorry'
+
+
+

From now on, 404 File not Found errors will display a custom error page to the user. The only parameter passed to the error-handler is an instance of HTTPError. Apart from that, an error-handler is quite similar to a regular request callback. You can read from request, write to response and return any supported data-type except for HTTPError instances.

+

Error handlers are used only if your application returns or raises an HTTPError exception (abort() does just that). Changing Request.status or returning HTTPResponse won’t trigger the error handler.

+
+
+
+

Generating content¶

+

In pure WSGI, the range of types you may return from your application is very limited. Applications must return an iterable yielding byte strings. You may return a string (because strings are iterable) but this causes most servers to transmit your content char by char. Unicode strings are not allowed at all. This is not very practical.

+

Bottle is much more flexible and supports a wide range of types. It even adds a Content-Length header if possible and encodes unicode automatically, so you don’t have to. What follows is a list of data types you may return from your application callbacks and a short description of how these are handled by the framework:

+
+
Dictionaries
+
As mentioned above, Python dictionaries (or subclasses thereof) are automatically transformed into JSON strings and returned to the browser with the Content-Type header set to application/json. This makes it easy to implement json-based APIs. Data formats other than json are supported too. See the tutorial-output-filter to learn more.
+
Empty Strings, False, None or other non-true values:
+
These produce an empty output with the Content-Length header set to 0.
+
Unicode strings
+
Unicode strings (or iterables yielding unicode strings) are automatically encoded with the codec specified in the Content-Type header (utf8 by default) and then treated as normal byte strings (see below).
+
Byte strings
+
Bottle returns strings as a whole (instead of iterating over each char) and adds a Content-Length header based on the string length. Lists of byte strings are joined first. Other iterables yielding byte strings are not joined because they may grow too big to fit into memory. The Content-Length header is not set in this case.
+
Instances of HTTPError or HTTPResponse
+
Returning these has the same effect as when raising them as an exception. In case of an HTTPError, the error handler is applied. See Error Pages for details.
+
File objects
+
Everything that has a .read() method is treated as a file or file-like object and passed to the wsgi.file_wrapper callable defined by the WSGI server framework. Some WSGI server implementations can make use of optimized system calls (sendfile) to transmit files more efficiently. In other cases this just iterates over chunks that fit into memory. Optional headers such as Content-Length or Content-Type are not set automatically. Use send_file() if possible. See Static Files for details.
+
Iterables and generators
+
You are allowed to use yield within your callbacks or return an iterable, as long as the iterable yields byte strings, unicode strings, HTTPError or HTTPResponse instances. Nested iterables are not supported, sorry. Please note that the HTTP status code and the headers are sent to the browser as soon as the iterable yields its first non-empty value. Changing these later has no effect.
+
+

The ordering of this list is significant. You may for example return a subclass of str with a read() method. It is still treated as a string instead of a file, because strings are handled first.

+

Changing the Default Encoding

+

Bottle uses the charset parameter of the Content-Type header to decide how to encode unicode strings. This header defaults to text/html; charset=UTF8 and can be changed using the Response.content_type attribute or by setting the Response.charset attribute directly. (The Response object is described in the section The Response Object.)

+
from bottle import response
+@route('/iso')
+def get_iso():
+    response.charset = 'ISO-8859-15'
+    return u'This will be sent with ISO-8859-15 encoding.'
+
+@route('/latin9')
+def get_latin():
+    response.content_type = 'text/html; charset=latin9'
+    return u'ISO-8859-15 is also known as latin9.'
+
+
+

In some rare cases the Python encoding names differ from the names supported by the HTTP specification. Then, you have to do both: first set the Response.content_type header (which is sent to the client unchanged) and then set the Response.charset attribute (which is used to encode unicode).

+
+

Static Files¶

+

You can directly return file objects, but static_file() is the recommended way to serve static files. It automatically guesses a mime-type, adds a Last-Modified header, restricts paths to a root directory for security reasons and generates appropriate error responses (401 on permission errors, 404 on missing files). It even supports the If-Modified-Since header and eventually generates a 304 Not Modified response. You can pass a custom MIME type to disable guessing.

+
from bottle import static_file
+@route('/images/<filename:re:.*\.png>#')
+def send_image(filename):
+    return static_file(filename, root='/path/to/image/files', mimetype='image/png')
+
+@route('/static/<filename:path>')
+def send_static(filename):
+    return static_file(filename, root='/path/to/static/files')
+
+
+

You can raise the return value of static_file() as an exception if you really need to.

+

Forced Download

+

Most browsers try to open downloaded files if the MIME type is known and assigned to an application (e.g. PDF files). If this is not what you want, you can force a download dialog and even suggest a filename to the user:

+
@route('/download/<filename:path>')
+def download(filename):
+    return static_file(filename, root='/path/to/static/files', download=filename)
+
+
+

If the download parameter is just True, the original filename is used.

+
+
+

HTTP Errors and Redirects¶

+

The abort() function is a shortcut for generating HTTP error pages.

+
from bottle import route, abort
+@route('/restricted')
+def restricted():
+    abort(401, "Sorry, access denied.")
+
+
+

To redirect a client to a different URL, you can send a 303 See Other response with the Location header set to the new URL. redirect() does that for you:

+
from bottle import redirect
+@route('/wrong/url')
+def wrong():
+    redirect("/right/url")
+
+
+

You may provide a different HTTP status code as a second parameter.

+
+

Note

+

Both functions will interrupt your callback code by raising an HTTPError exception.

+
+

Other Exceptions

+

All exceptions other than HTTPResponse or HTTPError will result in a 500 Internal Server Error response, so they won’t crash your WSGI server. You can turn off this behavior to handle exceptions in your middleware by setting bottle.app().catchall to False.

+
+
+

The Response Object¶

+

Response metadata such as the HTTP status code, response headers and cookies are stored in an object called response up to the point where they are transmitted to the browser. You can manipulate these metadata directly or use the predefined helper methods to do so. The full API and feature list is described in the API section (see Response), but the most common use cases and features are covered here, too.

+

Status Code

+

The HTTP status code controls the behavior of the browser and defaults to 200 OK. In most scenarios you won’t need to set the Response.status attribute manually, but use the abort() helper or return an HTTPResponse instance with the appropriate status code. Any integer is allowed, but codes other than the ones defined by the HTTP specification will only confuse the browser and break standards.

+

Response Header

+

Response headers such as Cache-Control or Location are defined via Response.set_header(). This method takes two parameters, a header name and a value. The name part is case-insensitive:

+
@route('/wiki/<page>')
+def wiki(page):
+    response.set_header('Content-Language', 'en')
+    ...
+
+
+

Most headers are unique, meaning that only one header per name is send to the client. Some special headers however are allowed to appear more than once in a response. To add an additional header, use Response.add_header() instead of Response.set_header():

+
response.set_header('Set-Cookie', 'name=value')
+response.add_header('Set-Cookie', 'name2=value2')
+
+
+

Please note that this is just an example. If you want to work with cookies, read ahead.

+
+
+

Cookies¶

+

A cookie is a named piece of text stored in the user’s browser profile. You can access previously defined cookies via Request.get_cookie() and set new cookies with Response.set_cookie():

+
@route('/hello')
+def hello_again():
+    if request.get_cookie("visited"):
+        return "Welcome back! Nice to see you again"
+    else:
+        response.set_cookie("visited", "yes")
+        return "Hello there! Nice to meet you"
+
+
+

The Response.set_cookie() method accepts a number of additional keyword arguments that control the cookies lifetime and behavior. Some of the most common settings are described here:

+
    +
  • max_age: Maximum age in seconds. (default: None)
  • +
  • expires: A datetime object or UNIX timestamp. (default: None)
  • +
  • domain: The domain that is allowed to read the cookie. (default: current domain)
  • +
  • path: Limit the cookie to a given path (default: /)
  • +
  • secure: Limit the cookie to HTTPS connections (default: off).
  • +
  • httponly: Prevent client-side javascript to read this cookie (default: off, requires Python 2.6 or newer).
  • +
+

If neither expires nor max_age is set, the cookie expires at the end of the browser session or as soon as the browser window is closed. There are some other gotchas you should consider when using cookies:

+
    +
  • Cookies are limited to 4 KB of text in most browsers.
  • +
  • Some users configure their browsers to not accept cookies at all. Most search engines ignore cookies too. Make sure that your application still works without cookies.
  • +
  • Cookies are stored at client side and are not encrypted in any way. Whatever you store in a cookie, the user can read it. Worse than that, an attacker might be able to steal a user’s cookies through XSS vulnerabilities on your side. Some viruses are known to read the browser cookies, too. Thus, never store confidential information in cookies.
  • +
  • Cookies are easily forged by malicious clients. Do not trust cookies.
  • +
+

Signed Cookies

+

As mentioned above, cookies are easily forged by malicious clients. Bottle can cryptographically sign your cookies to prevent this kind of manipulation. All you have to do is to provide a signature key via the secret keyword argument whenever you read or set a cookie and keep that key a secret. As a result, Request.get_cookie() will return None if the cookie is not signed or the signature keys don’t match:

+
@route('/login')
+def login():
+    username = request.forms.get('username')
+    password = request.forms.get('password')
+    if check_user_credentials(username, password):
+        response.set_cookie("account", username, secret='some-secret-key')
+        return "Welcome %s! You are now logged in." % username
+    else:
+        return "Login failed."
+
+@route('/restricted')
+def restricted_area():
+    username = request.get_cookie("account", secret='some-secret-key')
+    if username:
+        return "Hello %s. Welcome back." % username
+    else:
+        return "You are not logged in. Access denied."
+
+
+

In addition, Bottle automatically pickles and unpickles any data stored to signed cookies. This allows you to store any pickle-able object (not only strings) to cookies, as long as the pickled data does not exceed the 4 KB limit.

+
+

Warning

+

Signed cookies are not encrypted (the client can still see the content) and not copy-protected (the client can restore an old cookie). The main intention is to make pickling and unpickling safe and prevent manipulation, not to store secret information at client side.

+
+
+
+
+

Request Data¶

+

Bottle provides access to HTTP-related metadata such as cookies, headers and POST form data through a global request object. This object always contains information about the current request, as long as it is accessed from within a callback function. This works even in multi-threaded environments where multiple requests are handled at the same time. For details on how a global object can be thread-safe, see contextlocal.

+
+

Note

+

Bottle stores most of the parsed HTTP metadata in FormsDict instances. These behave like normal dictionaries, but have some additional features: All values in the dictionary are available as attributes. These virtual attributes always return a unicode string, even if the value is missing. In that case, the string is empty.

+

FormsDict is a subclass of MultiDict and can store more than one value per key. The standard dictionary access methods will only return a single value, but the MultiDict.getall() method returns a (possibly empty) list of all values for a specific key.

+
+

The full API and feature list is described in the API section (see Request), but the most common use cases and features are covered here, too.

+
+

Cookies¶

+

Cookies are stored in BaseRequest.cookies as a FormsDict. The BaseRequest.get_cookie() method allows access to signed cookies as described in a separate section. This example shows a simple cookie-based view counter:

+
from bottle import route, request, response
+@route('/counter')
+def counter():
+    count = int( request.cookies.get('counter', '0') )
+    count += 1
+    response.set_cookie('counter', str(count))
+    return 'You visited this page %d times' % count
+
+
+
+
+

HTTP Headers¶

+

All HTTP headers sent by the client (e.g. Referer, Agent or Accept-Language) are stored in a WSGIHeaderDict and accessible through BaseRequest.headers. A WSGIHeaderDict is basically a dictionary with case-insensitive keys:

+
from bottle import route, request
+@route('/is_ajax')
+def is_ajax():
+    if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
+        return 'This is an AJAX request'
+    else:
+        return 'This is a normal request'
+
+
+
+
+

Query Variables¶

+

The query string (as in /forum?id=1&page=5) is commonly used to transmit a small number of key/value pairs to the server. You can use the BaseRequest.query (a FormsDict) to access these values and the BaseRequest.query_string attribute to get the whole string.

+
from bottle import route, request, response
+@route('/forum')
+def display_forum():
+    forum_id = request.query.id
+    page = request.query.page or '1'
+    return 'Forum ID: %s (page %s)' % (forum_id, page)
+
+
+
+
+

POST Form Data and File Uploads¶

+

The request body of POST and PUT requests may contain form data encoded in various formats. The BaseRequest.forms dictionary contains parsed textual form fields, BaseRequest.files stores file uploads and BaseRequest.POST combines both dictionaries into one. All three are FormsDict instances and are created on demand. File uploads are saved as special cgi.FieldStorage objects along with some metadata. Finally, you can access the raw body data as a file-like object via BaseRequest.body.

+

Here is an example for a simple file upload form:

+
<form action="/upload" method="post" enctype="multipart/form-data">
+  <input type="text" name="name" />
+  <input type="file" name="data" />
+</form>
+
+
+
from bottle import route, request
+@route('/upload', method='POST')
+def do_upload():
+    name = request.forms.name
+    data = request.files.data
+    if name and data and data.file:
+        raw = data.file.read() # This is dangerous for big files
+        filename = data.filename
+        return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))
+    return "You missed a field."
+
+
+
+
+

Unicode issues¶

+

In Python 2 all keys and values are byte-strings. If you need unicode, you can call FormsDict.getunicode() or fetch values via attribute access. Both methods try to decode the string (default: utf8) and return an empty string if that fails. No need to catch UnicodeError:

+
>>> request.query['city']
+'G\xc3\xb6ttingen'  # A utf8 byte string
+>>> request.query.city
+u'Göttingen'        # The same string as unicode
+
+
+

In Python 3 all strings are unicode, but HTTP is a byte-based wire protocol. The server has to decode the byte strings somehow before they are passed to the application. To be on the safe side, WSGI suggests ISO-8859-1 (aka latin1), a reversible single-byte codec that can be re-encoded with a different encoding later. Bottle does that for FormsDict.getunicode() and attribute access, but not for the dict-access methods. These return the unchanged values as provided by the server implementation, which is probably not what you want.

+
>>> request.query['city']
+'Göttingen' # An utf8 string provisionally decoded as ISO-8859-1 by the server
+>>> request.query.city
+'Göttingen'  # The same string correctly re-encoded as utf8 by bottle
+
+
+

If you need the whole dictionary with correctly decoded values (e.g. for WTForms), you can call FormsDict.decode() to get a re-encoded copy.

+
+
+

WSGI Environment¶

+

Each BaseRequest instance wraps a WSGI environment dictionary. The original is stored in BaseRequest.environ, but the request object itself behaves like a dictionary, too. Most of the interesting data is exposed through special methods or attributes, but if you want to access WSGI environ variables directly, you can do so:

+
@route('/my_ip')
+def show_ip():
+    ip = request.environ.get('REMOTE_ADDR')
+    # or ip = request.get('REMOTE_ADDR')
+    # or ip = request['REMOTE_ADDR']
+    return "Your IP is: %s" % ip
+
+
+
+
+
+

Templates¶

+

Bottle comes with a fast and powerful built-in template engine called SimpleTemplate Engine. To render a template you can use the template() function or the view() decorator. All you have to do is to provide the name of the template and the variables you want to pass to the template as keyword arguments. Here’s a simple example of how to render a template:

+
@route('/hello')
+@route('/hello/<name>')
+def hello(name='World'):
+    return template('hello_template', name=name)
+
+
+

This will load the template file hello_template.tpl and render it with the name variable set. Bottle will look for templates in the ./views/ folder or any folder specified in the bottle.TEMPLATE_PATH list.

+

The view() decorator allows you to return a dictionary with the template variables instead of calling template():

+
@route('/hello')
+@route('/hello/<name>')
+@view('hello_template')
+def hello(name='World'):
+    return dict(name=name)
+
+
+

Syntax

+

The template syntax is a very thin layer around the Python language. Its main purpose is to ensure correct indentation of blocks, so you can format your template without worrying about indentation. Follow the link for a full syntax description: SimpleTemplate Engine

+

Here is an example template:

+
%if name == 'World':
+    <h1>Hello {{name}}!</h1>
+    <p>This is a test.</p>
+%else:
+    <h1>Hello {{name.title()}}!</h1>
+    <p>How are you?</p>
+%end
+
+
+

Caching

+

Templates are cached in memory after compilation. Modifications made to the template files will have no affect until you clear the template cache. Call bottle.TEMPLATES.clear() to do so. Caching is disabled in debug mode.

+
+
+

Plugins¶

+

+New in version 0.9.

+

Bottle’s core features cover most common use-cases, but as a micro-framework it has its limits. This is where “Plugins” come into play. Plugins add missing functionality to the framework, integrate third party libraries, or just automate some repetitive work.

+

We have a growing List of available Plugins and most plugins are designed to be portable and re-usable across applications. The chances are high that your problem has already been solved and a ready-to-use plugin exists. If not, the Plugin Development Guide may help you.

+

The effects and APIs of plugins are manifold and depend on the specific plugin. The SQLitePlugin plugin for example detects callbacks that require a db keyword argument and creates a fresh database connection object every time the callback is called. This makes it very convenient to use a database:

+
from bottle import route, install, template
+from bottle_sqlite import SQLitePlugin
+
+install(SQLitePlugin(dbfile='/tmp/test.db'))
+
+@route('/show/<post_id:int>')
+def show(db, post_id):
+    c = db.execute('SELECT title, content FROM posts WHERE id = ?', (post_id,))
+    row = c.fetchone()
+    return template('show_post', title=row['title'], text=row['content'])
+
+@route('/contact')
+def contact_page():
+    ''' This callback does not need a db connection. Because the 'db'
+        keyword argument is missing, the sqlite plugin ignores this callback
+        completely. '''
+    return template('contact')
+
+
+

Other plugin may populate the thread-safe local object, change details of the request object, filter the data returned by the callback or bypass the callback completely. An “auth” plugin for example could check for a valid session and return a login page instead of calling the original callback. What happens exactly depends on the plugin.

+
+

Application-wide Installation¶

+

Plugins can be installed application-wide or just to some specific routes that need additional functionality. Most plugins can safely be installed to all routes and are smart enough to not add overhead to callbacks that do not need their functionality.

+

Let us take the SQLitePlugin plugin for example. It only affects route callbacks that need a database connection. Other routes are left alone. Because of this, we can install the plugin application-wide with no additional overhead.

+

To install a plugin, just call install() with the plugin as first argument:

+
from bottle_sqlite import SQLitePlugin
+install(SQLitePlugin(dbfile='/tmp/test.db'))
+
+
+

The plugin is not applied to the route callbacks yet. This is delayed to make sure no routes are missed. You can install plugins first and add routes later, if you want to. The order of installed plugins is significant, though. If a plugin requires a database connection, you need to install the database plugin first.

+

Uninstall Plugins

+

You can use a name, class or instance to uninstall() a previously installed plugin:

+
sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
+install(sqlite_plugin)
+
+uninstall(sqlite_plugin) # uninstall a specific plugin
+uninstall(SQLitePlugin)  # uninstall all plugins of that type
+uninstall('sqlite')      # uninstall all plugins with that name
+uninstall(True)          # uninstall all plugins at once
+
+
+

Plugins can be installed and removed at any time, even at runtime while serving requests. This enables some neat tricks (installing slow debugging or profiling plugins only when needed) but should not be overused. Each time the list of plugins changes, the route cache is flushed and all plugins are re-applied.

+
+

Note

+

The module-level install() and uninstall() functions affect the Default Application. To manage plugins for a specific application, use the corresponding methods on the Bottle application object.

+
+
+
+

Route-specific Installation¶

+

The apply parameter of the route() decorator comes in handy if you want to install plugins to only a small number of routes:

+
sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
+
+@route('/create', apply=[sqlite_plugin])
+def create(db):
+    db.execute('INSERT INTO ...')
+
+
+
+
+

Blacklisting Plugins¶

+

You may want to explicitly disable a plugin for a number of routes. The route() decorator has a skip parameter for this purpose:

+
sqlite_plugin = SQLitePlugin(dbfile='/tmp/test.db')
+install(sqlite_plugin)
+
+@route('/open/<db>', skip=[sqlite_plugin])
+def open_db(db):
+    # The 'db' keyword argument is not touched by the plugin this time.
+    if db in ('test', 'test2'):
+        # The plugin handle can be used for runtime configuration, too.
+        sqlite_plugin.dbfile = '/tmp/%s.db' % db
+        return "Database File switched to: /tmp/%s.db" % db
+    abort(404, "No such database.")
+
+
+

The skip parameter accepts a single value or a list of values. You can use a name, class or instance to identify the plugin that is to be skipped. Set skip=True to skip all plugins at once.

+
+
+

Plugins and Sub-Applications¶

+

Most plugins are specific to the application they were installed to. Consequently, they should not affect sub-applications mounted with Bottle.mount(). Here is an example:

+
root = Bottle()
+root.mount('/blog', apps.blog)
+
+@root.route('/contact', template='contact')
+def contact():
+    return {'email': 'contact@example.com'}
+
+root.install(plugins.WTForms())
+
+
+

Whenever you mount an application, Bottle creates a proxy-route on the main-application that forwards all requests to the sub-application. Plugins are disabled for this kind of proxy-route by default. As a result, our (fictional) WTForms plugin affects the /contact route, but does not affect the routes of the /blog sub-application.

+

This behavior is intended as a sane default, but can be overridden. The following example re-activates all plugins for a specific proxy-route:

+
root.mount('/blog', apps.blog, skip=None)
+
+
+

But there is a snag: The plugin sees the whole sub-application as a single route, namely the proxy-route mentioned above. In order to affect each individual route of the sub-application, you have to install the plugin to the mounted application explicitly.

+
+
+
+

Development¶

+

So you have learned the basics and want to write your own application? Here are +some tips that might help you to be more productive.

+
+

Default Application¶

+

Bottle maintains a global stack of Bottle instances and uses the top of the stack as a default for some of the module-level functions and decorators. The route() decorator, for example, is a shortcut for calling Bottle.route() on the default application:

+
@route('/')
+def hello():
+    return 'Hello World'
+
+
+

This is very convenient for small applications and saves you some typing, but also means that, as soon as your module is imported, routes are installed to the global application. To avoid this kind of import side-effects, Bottle offers a second, more explicit way to build applications:

+
app = Bottle()
+
+@app.route('/')
+def hello():
+    return 'Hello World'
+
+
+

Separating the application object improves re-usability a lot, too. Other developers can safely import the app object from your module and use Bottle.mount() to merge applications together.

+

As an alternative, you can make use of the application stack to isolate your routes while still using the convenient shortcuts:

+
default_app.push()
+
+@route('/')
+def hello():
+    return 'Hello World'
+
+app = default_app.pop()
+
+
+

Both app() and default_app() are instance of AppStack and implement a stack-like API. You can push and pop applications from and to the stack as needed. This also helps if you want to import a third party module that does not offer a separate application object:

+
default_app.push()
+
+import some.module
+
+app = default_app.pop()
+
+
+
+
+

Debug Mode¶

+

During early development, the debug mode can be very helpful.

+
bottle.debug(True)
+
+
+

In this mode, Bottle is much more verbose and provides helpful debugging information whenever an error occurs. It also disables some optimisations that might get in your way and adds some checks that warn you about possible misconfiguration.

+

Here is an incomplete list of things that change in debug mode:

+
    +
  • The default error page shows a traceback.
  • +
  • Templates are not cached.
  • +
  • Plugins are applied immediately.
  • +
+

Just make sure not to use the debug mode on a production server.

+
+
+

Auto Reloading¶

+

During development, you have to restart the server a lot to test your +recent changes. The auto reloader can do this for you. Every time you +edit a module file, the reloader restarts the server process and loads +the newest version of your code.

+
from bottle import run
+run(reloader=True)
+
+
+

How it works: the main process will not start a server, but spawn a new +child process using the same command line arguments used to start the +main process. All module-level code is executed at least twice! Be +careful.

+

The child process will have os.environ['BOTTLE_CHILD'] set to True +and start as a normal non-reloading app server. As soon as any of the +loaded modules changes, the child process is terminated and re-spawned by +the main process. Changes in template files will not trigger a reload. +Please use debug mode to deactivate template caching.

+

The reloading depends on the ability to stop the child process. If you are +running on Windows or any other operating system not supporting +signal.SIGINT (which raises KeyboardInterrupt in Python), +signal.SIGTERM is used to kill the child. Note that exit handlers and +finally clauses, etc., are not executed after a SIGTERM.

+
+
+

Command Line Interface¶

+

Starting with version 0.10 you can use bottle as a command-line tool:

+
$ python -m bottle
+
+Usage: bottle.py [options] package.module:app
+
+Options:
+  -h, --help            show this help message and exit
+  --version             show version number.
+  -b ADDRESS, --bind=ADDRESS
+                        bind socket to ADDRESS.
+  -s SERVER, --server=SERVER
+                        use SERVER as backend.
+  -p PLUGIN, --plugin=PLUGIN
+                        install additional plugin/s.
+  --debug               start server in debug mode.
+  --reload              auto-reload on file changes.
+
+
+

The ADDRESS field takes an IP address or an IP:PORT pair and defaults to localhost:8080. The other parameters should be self-explanatory.

+

Both plugins and applications are specified via import expressions. These consist of an import path (e.g. package.module) and an expression to be evaluated in the namespace of that module, separated by a colon. See load() for details. Here are some examples:

+
# Grab the 'app' object from the 'myapp.controller' module and
+# start a paste server on port 80 on all interfaces.
+python -m bottle -server paste -bind 0.0.0.0:80 myapp.controller:app
+
+# Start a self-reloading development server and serve the global
+# default application. The routes are defined in 'test.py'
+python -m bottle --debug --reload test
+
+# Install a custom debug plugin with some parameters
+python -m bottle --debug --reload --plugin 'utils:DebugPlugin(exc=True)'' test
+
+# Serve an application that is created with 'myapp.controller.make_app()'
+# on demand.
+python -m bottle 'myapp.controller:make_app()''
+
+
+
+
+
+

Deployment¶

+

Bottle runs on the built-in wsgiref WSGIServer by default. This non-threading HTTP server is perfectly fine for development and early production, but may become a performance bottleneck when server load increases.

+

The easiest way to increase performance is to install a multi-threaded server library like paste or cherrypy and tell Bottle to use that instead of the single-threaded server:

+
bottle.run(server='paste')
+
+
+

This, and many other deployment options are described in a separate article: Deployment

+
+
+

Glossary¶

+
+
callback
+
Programmer code that is to be called when some external action happens. +In the context of web frameworks, the mapping between URL paths and +application code is often achieved by specifying a callback function +for each URL.
+
decorator
+
A function returning another function, usually applied as a function transformation using the @decorator syntax. See python documentation for function definition for more about decorators.
+
environ
+
A structure where information about all documents under the root is +saved, and used for cross-referencing. The environment is pickled +after the parsing stage, so that successive runs only need to read +and parse new and changed documents.
+
handler function
+
A function to handle some specific event or situation. In a web +framework, the application is developed by attaching a handler function +as callback for each specific URL comprising the application.
+
source directory
+
The directory which, including its subdirectories, contains all +source files for one Sphinx project.
+
+
+
+ + + +
+
+
+ +
+
+ +
+ + + + + \ No newline at end of file diff --git a/html/tutorial_app.html b/html/tutorial_app.html new file mode 100644 index 0000000..7521e10 --- /dev/null +++ b/html/tutorial_app.html @@ -0,0 +1,772 @@ + + + + + + + + + + Tutorial: Todo-List Application — Bottle 0.12-dev documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +

Warning: This is a preview for Bottle-0.12-dev, which is + not released yet. Switch to the latest stable release?

+ + +
+

Tutorial: Todo-List Application¶

+
+

Note

+

This tutorial is a work in progess and written by noisefloor.

+
+

This tutorial should give a brief introduction to the Bottle WSGI Framework. The main goal is to be able, after reading through this tutorial, to create a project using Bottle. Within this document, not all abilities will be shown, but at least the main and important ones like routing, utilizing the Bottle template abilities to format output and handling GET / POST parameters.

+

To understand the content here, it is not necessary to have a basic knowledge of WSGI, as Bottle tries to keep WSGI away from the user anyway. You should have a fair understanding of the Python programming language. Furthermore, the example used in the tutorial retrieves and stores data in a SQL databse, so a basic idea about SQL helps, but is not a must to understand the concepts of Bottle. Right here, SQLite is used. The output of Bottle sent to the browser is formatted in some examples by the help of HTML. Thus, a basic idea about the common HTML tags does help as well.

+

For the sake of introducing Bottle, the Python code “in between” is kept short, in order to keep the focus. Also all code within the tutorial is working fine, but you may not necessarily use it “in the wild”, e.g. on a public web server. In order to do so, you may add e.g. more error handling, protect the database with a password, test and escape the input etc.

+ +
+

Goals¶

+

At the end of this tutorial, we will have a simple, web-based ToDo list. The list contains a text (with max 100 characters) and a status (0 for closed, 1 for open) for each item. Through the web-based user interface, open items can be view and edited and new items can be added.

+

During development, all pages will be available on localhost only, but later on it will be shown how to adapt the application for a “real” server, including how to use with Apache’s mod_wsgi.

+

Bottle will do the routing and format the output, with the help of templates. The items of the list will be stored inside a SQLite database. Reading and writing the database will be done by Python code.

+

We will end up with an application with the following pages and functionality:

+
+
    +
  • start page http://localhost:8080/todo
  • +
  • adding new items to the list: http://localhost:8080/new
  • +
  • page for editing items: http://localhost:8080/edit/:no
  • +
  • validating data assigned by dynamic routes with the @validate decorator
  • +
  • catching errors
  • +
+
+
+
+

Before We Start...¶

+

Install Bottle

+

Assuming that you have a fairly new installation of Python (version 2.5 or higher), you only need to install Bottle in addition to that. Bottle has no other dependencies than Python itself.

+

You can either manually install Bottle or use Python’s easy_install: easy_install bottle

+

Further Software Necessities

+

As we use SQLite3 as a database, make sure it is installed. On Linux systems, most distributions have SQLite3 installed by default. SQLite is available for Windows and MacOS X as well and the sqlite3 module is part of the python standard library.

+

Create An SQL Database

+

First, we need to create the database we use later on. To do so, save the following script in your project directory and run it with python. You can use the interactive interpreter too:

+
import sqlite3
+con = sqlite3.connect('todo.db') # Warning: This file is created in the current directory
+con.execute("CREATE TABLE todo (id INTEGER PRIMARY KEY, task char(100) NOT NULL, status bool NOT NULL)")
+con.execute("INSERT INTO todo (task,status) VALUES ('Read A-byte-of-python to get a good introduction into Python',0)")
+con.execute("INSERT INTO todo (task,status) VALUES ('Visit the Python website',1)")
+con.execute("INSERT INTO todo (task,status) VALUES ('Test various editors for and check the syntax highlighting',1)")
+con.execute("INSERT INTO todo (task,status) VALUES ('Choose your favorite WSGI-Framework',0)")
+con.commit()
+
+
+

This generates a database-file todo.db with tables called todo and three columns id, task, and status. id is a unique id for each row, which is used later on to reference the rows. The column task holds the text which describes the task, it can be max 100 characters long. Finally, the column status is used to mark a task as open (value 1) or closed (value 0).

+
+
+

Using Bottle for a Web-Based ToDo List¶

+

Now it is time to introduce Bottle in order to create a web-based application. But first, we need to look into a basic concept of Bottle: routes.

+

Understanding routes

+

Basically, each page visible in the browser is dynamically generated when the page address is called. Thus, there is no static content. That is exactly what is called a “route” within Bottle: a certain address on the server. So, for example, when the page http://localhost:8080/todo is called from the browser, Bottle “grabs” the call and checks if there is any (Python) function defined for the route “todo”. If so, Bottle will execute the corresponding Python code and return its result.

+

First Step - Showing All Open Items

+

So, after understanding the concept of routes, let’s create the first one. The goal is to see all open items from the ToDo list:

+
import sqlite3
+from bottle import route, run
+
+@route('/todo')
+def todo_list():
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+    c.execute("SELECT id, task FROM todo WHERE status LIKE '1'")
+    result = c.fetchall()
+    return str(result)
+
+run()
+
+
+

Save the code a todo.py, preferably in the same directory as the file todo.db. Otherwise, you need to add the path to todo.db in the sqlite3.connect() statement.

+

Let’s have a look what we just did: We imported the necessary module sqlite3 to access to SQLite database and from Bottle we imported route and run. The run() statement simply starts the web server included in Bottle. By default, the web server serves the pages on localhost and port 8080. Furthermore, we imported route, which is the function responsible for Bottle’s routing. As you can see, we defined one function, todo_list(), with a few lines of code reading from the database. The important point is the decorator statement @route('/todo') right before the def todo_list() statement. By doing this, we bind this function to the route /todo, so every time the browsers calls http://localhost:8080/todo, Bottle returns the result of the function todo_list(). That is how routing within bottle works.

+

Actually you can bind more than one route to a function. So the following code:

+
@route('/todo')
+@route('/my_todo_list')
+def todo_list():
+    ...
+
+
+

will work fine, too. What will not work is to bind one route to more than one function.

+

What you will see in the browser is what is returned, thus the value given by the return statement. In this example, we need to convert result in to a string by str(), as Bottle expects a string or a list of strings from the return statement. But here, the result of the database query is a list of tuples, which is the standard defined by the Python DB API.

+

Now, after understanding the little script above, it is time to execute it and watch the result yourself. Remember that on Linux- / Unix-based systems the file todo.py needs to be executable first. Then, just run python todo.py and call the page http://localhost:8080/todo in your browser. In case you made no mistake writing the script, the output should look like this:

+
[(2, u'Visit the Python website'), (3, u'Test various editors for and check the syntax highlighting')]
+
+
+

If so - congratulations! You are now a successful user of Bottle. In case it did not work and you need to make some changes to the script, remember to stop Bottle serving the page, otherwise the revised version will not be loaded.

+

Actually, the output is not really exciting nor nice to read. It is the raw result returned from the SQL query.

+

So, in the next step we format the output in a nicer way. But before we do that, we make our life easier.

+

Debugging and Auto-Reload

+

Maybe you already noticed that Bottle sends a short error message to the browser in case something within the script is wrong, e.g. the connection to the database is not working. For debugging purposes it is quite helpful to get more details. This can be easily achieved by adding the following statement to the script:

+
from bottle import run, route, debug
+...
+#add this at the very end:
+debug(True)
+run()
+
+
+

By enabling “debug”, you will get a full stacktrace of the Python interpreter, which usually contains useful information for finding bugs. Furthermore, templates (see below) are not cached, thus changes to templates will take effect without stopping the server.

+
+

Warning

+

That debug(True) is supposed to be used for development only, it should not be used in production environments.

+
+

A further quiet nice feature is auto-reloading, which is enabled by modifying the run() statement to

+
run(reloader=True)
+
+
+

This will automatically detect changes to the script and reload the new version once it is called again, without the need to stop and start the server.

+

Again, the feature is mainly supposed to be used while development, not on productive systems.

+

Bottle Template To Format The Output

+

Now let’s have a look at casting the output of the script into a proper format.

+

Actually Bottle expects to receive a string or a list of strings from a function and returns them by the help of the built-in server to the browser. Bottle does not bother about the content of the string itself, so it can be text formatted with HTML markup, too.

+

Bottle brings its own easy-to-use template engine with it. Templates are stored as separate files having a .tpl extension. The template can be called then from within a function. Templates can contain any type of text (which will be most likely HTML-markup mixed with Python statements). Furthermore, templates can take arguments, e.g. the result set of a database query, which will be then formatted nicely within the template.

+

Right here, we are going to cast the result of our query showing the open ToDo items into a simple table with two columns: the first column will contain the ID of the item, the second column the text. The result set is, as seen above, a list of tuples, each tuple contains one set of results.

+

To include the template in our example, just add the following lines:

+
from bottle import route, run, debug, template
+...
+result = c.fetchall()
+c.close()
+output = template('make_table', rows=result)
+return output
+...
+
+
+

So we do here two things: first, we import template from Bottle in order to be able to use templates. Second, we assign the output of the template make_table to the variable output, which is then returned. In addition to calling the template, we assign result, which we received from the database query, to the variable rows, which is later on used within the template. If necessary, you can assign more than one variable / value to a template.

+

Templates always return a list of strings, thus there is no need to convert anything. Of course, we can save one line of code by writing return template('make_table', rows=result), which gives exactly the same result as above.

+

Now it is time to write the corresponding template, which looks like this:

+
%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
+<p>The open items are as follows:</p>
+<table border="1">
+%for row in rows:
+  <tr>
+  %for col in row:
+    <td>{{col}}</td>
+  %end
+  </tr>
+%end
+</table>
+
+

Save the code as make_table.tpl in the same directory where todo.py is stored.

+

Let’s have a look at the code: every line starting with % is interpreted as Python code. Please note that, of course, only valid Python statements are allowed, otherwise the template will raise an exception, just as any other Python code. The other lines are plain HTML markup.

+

As you can see, we use Python’s for statement two times, in order to go through rows. As seen above, rows is a variable which holds the result of the database query, so it is a list of tuples. The first for statement accesses the tuples within the list, the second one the items within the tuple, which are put each into a cell of the table. It is important that you close all for, if, while etc. statements with %end, otherwise the output may not be what you expect.

+

If you need to access a variable within a non-Python code line inside the template, you need to put it into double curly braces. This tells the template to insert the actual value of the variable right in place.

+

Run the script again and look at the output. Still not really nice, but at least more readable than the list of tuples. Of course, you can spice-up the very simple HTML markup above, e.g. by using in-line styles to get a better looking output.

+

Using GET and POST Values

+

As we can review all open items properly, we move to the next step, which is adding new items to the ToDo list. The new item should be received from a regular HTML-based form, which sends its data by the GET method.

+

To do so, we first add a new route to our script and tell the route that it should get GET data:

+
from bottle import route, run, debug, template, request
+...
+return template('make_table', rows=result)
+...
+
+@route('/new', method='GET')
+def new_item():
+
+    new = request.GET.get('task', '').strip()
+
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+
+    c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1))
+    new_id = c.lastrowid
+
+    conn.commit()
+    c.close()
+
+    return '<p>The new task was inserted into the database, the ID is %s</p>' % new_id
+
+
+

To access GET (or POST) data, we need to import request from Bottle. To assign the actual data to a variable, we use the statement request.GET.get('task','').strip() statement, where task is the name of the GET data we want to access. That’s all. If your GET data has more than one variable, multiple request.GET.get() statements can be used and assigned to other variables.

+

The rest of this piece of code is just processing of the gained data: writing to the database, retrieve the corresponding id from the database and generate the output.

+

But where do we get the GET data from? Well, we can use a static HTML page holding the form. Or, what we do right now, is to use a template which is output when the route /new is called without GET data.

+

The code needs to be extended to:

+
...
+@route('/new', method='GET')
+def new_item():
+
+    if request.GET.get('save','').strip():
+
+        new = request.GET.get('task', '').strip()
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+
+        c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1))
+        new_id = c.lastrowid
+
+        conn.commit()
+        c.close()
+
+        return '<p>The new task was inserted into the database, the ID is %s</p>' % new_id
+    else:
+        return template('new_task.tpl')
+
+
+

new_task.tpl looks like this:

+
<p>Add a new task to the ToDo list:</p>
+<form action="/new" method="GET">
+<input type="text" size="100" maxlength="100" name="task">
+<input type="submit" name="save" value="save">
+</form>
+
+

That’s all. As you can see, the template is plain HTML this time.

+

Now we are able to extend our to do list.

+

By the way, if you prefer to use POST data: this works exactly the same way, just use request.POST.get() instead.

+

Editing Existing Items

+

The last point to do is to enable editing of existing items.

+

By using only the routes we know so far it is possible, but may be quite tricky. But Bottle knows something called “dynamic routes”, which makes this task quite easy.

+

The basic statement for a dynamic route looks like this:

+
@route('/myroute/:something')
+
+

The key point here is the colon. This tells Bottle to accept for :something any string up to the next slash. Furthermore, the value of something will be passed to the function assigned to that route, so the data can be processed within the function.

+

For our ToDo list, we will create a route @route('/edit/:no), where no is the id of the item to edit.

+

The code looks like this:

+
@route('/edit/:no', method='GET')
+def edit_item(no):
+
+    if request.GET.get('save','').strip():
+        edit = request.GET.get('task','').strip()
+        status = request.GET.get('status','').strip()
+
+        if status == 'open':
+            status = 1
+        else:
+            status = 0
+
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+        c.execute("UPDATE todo SET task = ?, status = ? WHERE id LIKE ?", (edit, status, no))
+        conn.commit()
+
+        return '<p>The item number %s was successfully updated</p>' % no
+    else:
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+        c.execute("SELECT task FROM todo WHERE id LIKE ?", (str(no)))
+        cur_data = c.fetchone()
+
+        return template('edit_task', old=cur_data, no=no)
+
+
+

It is basically pretty much the same what we already did above when adding new items, like using GET data etc. The main addition here is using the dynamic route :no, which here passes the number to the corresponding function. As you can see, no is used within the function to access the right row of data within the database.

+

The template edit_task.tpl called within the function looks like this:

+
%#template for editing a task
+%#the template expects to receive a value for "no" as well a "old", the text of the selected ToDo item
+<p>Edit the task with ID = {{no}}</p>
+<form action="/edit/{{no}}" method="get">
+<input type="text" name="task" value="{{old[0]}}" size="100" maxlength="100">
+<select name="status">
+<option>open</option>
+<option>closed</option>
+</select>
+<br/>
+<input type="submit" name="save" value="save">
+</form>
+
+

Again, this template is a mix of Python statements and HTML, as already explained above.

+

A last word on dynamic routes: you can even use a regular expression for a dynamic route, as demonstrated later.

+

Validating Dynamic Routes

+

Using dynamic routes is fine, but for many cases it makes sense to validate the dynamic part of the route. For example, we expect an integer number in our route for editing above. But if a float, characters or so are received, the Python interpreter throws an exception, which is not what we want.

+

For those cases, Bottle offers the @validate decorator, which validates the “input” prior to passing it to the function. In order to apply the validator, extend the code as follows:

+
from bottle import route, run, debug, template, request, validate
+...
+@route('/edit/:no', method='GET')
+@validate(no=int)
+def edit_item(no):
+...
+
+

At first, we imported validate from the Bottle framework, than we apply the @validate-decorator. Right here, we validate if no is an integer. Basically, the validation works with all types of data like floats, lists etc.

+

Save the code and call the page again using a “403 forbidden” value for :no, e.g. a float. You will receive not an exception, but a “403 - Forbidden” error, saying that an integer was expected.

+

Dynamic Routes Using Regular Expressions

+

Bottle can also handle dynamic routes, where the “dynamic part” of the route can be a regular expression.

+

So, just to demonstrate that, let’s assume that all single items in our ToDo list should be accessible by their plain number, by a term like e.g. “item1”. For obvious reasons, you do not want to create a route for every item. Furthermore, the simple dynamic routes do not work either, as part of the route, the term “item” is static.

+

As said above, the solution is a regular expression:

+
@route('/item:item#[1-9]+#')
+def show_item(item):
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+    c.execute("SELECT task FROM todo WHERE id LIKE ?", (item))
+    result = c.fetchall()
+    c.close()
+    if not result:
+        return 'This item number does not exist!'
+    else:
+        return 'Task: %s' %result[0]
+
+
+

Of course, this example is somehow artificially constructed - it would be easier to use a plain dynamic route only combined with a validation. Nevertheless, we want to see how regular expression routes work: the line @route(/item:item_#[1-9]+#) starts like a normal route, but the part surrounded by # is interpreted as a regular expression, which is the dynamic part of the route. So in this case, we want to match any digit between 0 and 9. The following function “show_item” just checks whether the given item is present in the database or not. In case it is present, the corresponding text of the task is returned. As you can see, only the regular expression part of the route is passed forward. Furthermore, it is always forwarded as a string, even if it is a plain integer number, like in this case.

+

Returning Static Files

+

Sometimes it may become necessary to associate a route not to a Python function, but just return a static file. So if you have for example a help page for your application, you may want to return this page as plain HTML. This works as follows:

+
from bottle import route, run, debug, template, request, validate, static_file
+
+@route('/help')
+def help():
+    return static_file('help.html', root='/path/to/file')
+
+
+

At first, we need to import the static_file function from Bottle. As you can see, the return static_file statement replaces the return statement. It takes at least two arguments: the name of the file to be returned and the path to the file. Even if the file is in the same directory as your application, the path needs to be stated. But in this case, you can use '.' as a path, too. Bottle guesses the MIME-type of the file automatically, but in case you like to state it explicitly, add a third argument to static_file, which would be here mimetype='text/html'. static_file works with any type of route, including the dynamic ones.

+

Returning JSON Data

+

There may be cases where you do not want your application to generate the output directly, but return data to be processed further on, e.g. by JavaScript. For those cases, Bottle offers the possibility to return JSON objects, which is sort of standard for exchanging data between web applications. Furthermore, JSON can be processed by many programming languages, including Python

+

So, let’s assume we want to return the data generated in the regular expression route example as a JSON object. The code looks like this:

+
@route('/json:json#[1-9]+#')
+def show_json(json):
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+    c.execute("SELECT task FROM todo WHERE id LIKE ?", (json))
+    result = c.fetchall()
+    c.close()
+
+    if not result:
+        return {'task':'This item number does not exist!'}
+    else:
+        return {'Task': result[0]}
+
+
+

As you can, that is fairly simple: just return a regular Python dictionary and Bottle will convert it automatically into a JSON object prior to sending. So if you e.g. call “http://localhost/json1” Bottle should in this case return the JSON object {"Task": ["Read A-byte-of-python to get a good introduction into Python"]}.

+

Catching Errors

+

The next step may is to catch the error with Bottle itself, to keep away any type of error message from the user of your application. To do that, Bottle has an “error-route”, which can be a assigned to a HTML-error.

+

In our case, we want to catch a 403 error. The code is as follows:

+
from bottle import error
+
+@error(403)
+def mistake(code):
+    return 'The parameter you passed has the wrong format!'
+
+
+

So, at first we need to import error from Bottle and define a route by error(403), which catches all “403 forbidden” errors. The function “mistake” is assigned to that. Please note that error() always passes the error-code to the function - even if you do not need it. Thus, the function always needs to accept one argument, otherwise it will not work.

+

Again, you can assign more than one error-route to a function, or catch various errors with one function each. So this code:

+
@error(404)
+@error(403)
+def mistake(code):
+    return 'There is something wrong!'
+
+
+

works fine, the following one as well:

+
@error(403)
+def mistake403(code):
+    return 'The parameter you passed has the wrong format!'
+
+@error(404)
+def mistake404(code):
+    return 'Sorry, this page does not exist!'
+
+
+

Summary

+

After going through all the sections above, you should have a brief understanding how the Bottle WSGI framework works. Furthermore you have all the knowledge necessary to use Bottle for your applications.

+

The following chapter give a short introduction how to adapt Bottle for larger projects. Furthermore, we will show how to operate Bottle with web servers which perform better on a higher load / more web traffic than the one we used so far.

+
+
+

Server Setup¶

+

So far, we used the standard server used by Bottle, which is the WSGI reference Server shipped along with Python. Although this server is perfectly suitable for development purposes, it is not really suitable for larger applications. But before we have a look at the alternatives, let’s have a look how to tweak the settings of the standard server first.

+

Running Bottle on a different port and IP

+

As standard, Bottle serves the pages on the IP adress 127.0.0.1, also known as localhost, and on port 8080. To modify the setting is pretty simple, as additional parameters can be passed to Bottle’s run() function to change the port and the address.

+

To change the port, just add port=portnumber to the run command. So, for example:

+
run(port=80)
+
+
+

would make Bottle listen to port 80.

+

To change the IP address where Bottle is listening:

+
run(host='123.45.67.89')
+
+
+

Of course, both parameters can be combined, like:

+
run(port=80, host='123.45.67.89')
+
+
+

The port and host parameter can also be applied when Bottle is running with a different server, as shown in the following section.

+

Running Bottle with a different server

+

As said above, the standard server is perfectly suitable for development, personal use or a small group of people only using your application based on Bottle. For larger tasks, the standard server may become a bottleneck, as it is single-threaded, thus it can only serve one request at a time.

+

But Bottle has already various adapters to multi-threaded servers on board, which perform better on higher load. Bottle supports Cherrypy, Fapws3, Flup and Paste.

+

If you want to run for example Bottle with the Paste server, use the following code:

+
from bottle import PasteServer
+...
+run(server=PasteServer)
+
+
+

This works exactly the same way with FlupServer, CherryPyServer and FapwsServer.

+

Running Bottle on Apache with mod_wsgi

+

Maybe you already have an Apache or you want to run a Bottle-based application large scale - then it is time to think about Apache with mod_wsgi.

+

We assume that your Apache server is up and running and mod_wsgi is working fine as well. On a lot of Linux distributions, mod_wsgi can be easily installed via whatever package management system is in use.

+

Bottle brings an adapter for mod_wsgi with it, so serving your application is an easy task.

+

In the following example, we assume that you want to make your application “ToDo list” accessible through http://www.mypage.com/todo and your code, templates and SQLite database are stored in the path /var/www/todo.

+

When you run your application via mod_wsgi, it is imperative to remove the run() statement from your code, otherwise it won’t work here.

+

After that, create a file called adapter.wsgi with the following content:

+
import sys, os, bottle
+
+sys.path = ['/var/www/todo/'] + sys.path
+os.chdir(os.path.dirname(__file__))
+
+import todo # This loads your application
+
+application = bottle.default_app()
+
+
+

and save it in the same path, /var/www/todo. Actually the name of the file can be anything, as long as the extension is .wsgi. The name is only used to reference the file from your virtual host.

+

Finally, we need to add a virtual host to the Apache configuration, which looks like this:

+
<VirtualHost *>
+    ServerName mypage.com
+
+    WSGIDaemonProcess todo user=www-data group=www-data processes=1 threads=5
+    WSGIScriptAlias / /var/www/todo/adapter.wsgi
+
+    <Directory /var/www/todo>
+        WSGIProcessGroup todo
+        WSGIApplicationGroup %{GLOBAL}
+        Order deny,allow
+        Allow from all
+    </Directory>
+</VirtualHost>
+
+

After restarting the server, your ToDo list should be accessible at http://www.mypage.com/todo

+
+
+

Final Words¶

+

Now we are at the end of this introduction and tutorial to Bottle. We learned about the basic concepts of Bottle and wrote a first application using the Bottle framework. In addition to that, we saw how to adapt Bottle for large tasks and serve Bottle through an Apache web server with mod_wsgi.

+

As said in the introduction, this tutorial is not showing all shades and possibilities of Bottle. What we skipped here is e.g. receiving file objects and streams and how to handle authentication data. Furthermore, we did not show how templates can be called from within another template. For an introduction into those points, please refer to the full Bottle documentation .

+
+
+

Complete Example Listing¶

+

As the ToDo list example was developed piece by piece, here is the complete listing:

+

Main code for the application todo.py:

+
import sqlite3
+from bottle import route, run, debug, template, request, validate, static_file, error
+
+# only needed when you run Bottle on mod_wsgi
+from bottle import default_app
+
+@route('/todo')
+def todo_list():
+
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+    c.execute("SELECT id, task FROM todo WHERE status LIKE '1';")
+    result = c.fetchall()
+    c.close()
+
+    output = template('make_table', rows=result)
+    return output
+
+@route('/new', method='GET')
+def new_item():
+
+    if request.GET.get('save','').strip():
+
+        new = request.GET.get('task', '').strip()
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+
+        c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new,1))
+        new_id = c.lastrowid
+
+        conn.commit()
+        c.close()
+
+        return '<p>The new task was inserted into the database, the ID is %s</p>' % new_id
+
+    else:
+        return template('new_task.tpl')
+
+@route('/edit/:no', method='GET')
+@validate(no=int)
+def edit_item(no):
+
+    if request.GET.get('save','').strip():
+        edit = request.GET.get('task','').strip()
+        status = request.GET.get('status','').strip()
+
+        if status == 'open':
+            status = 1
+        else:
+            status = 0
+
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+        c.execute("UPDATE todo SET task = ?, status = ? WHERE id LIKE ?", (edit,status,no))
+        conn.commit()
+
+        return '<p>The item number %s was successfully updated</p>' %no
+
+    else:
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+        c.execute("SELECT task FROM todo WHERE id LIKE ?", (str(no)))
+        cur_data = c.fetchone()
+
+        return template('edit_task', old = cur_data, no = no)
+
+@route('/item:item#[1-9]+#')
+def show_item(item):
+
+        conn = sqlite3.connect('todo.db')
+        c = conn.cursor()
+        c.execute("SELECT task FROM todo WHERE id LIKE ?", (item))
+        result = c.fetchall()
+        c.close()
+
+        if not result:
+            return 'This item number does not exist!'
+        else:
+            return 'Task: %s' %result[0]
+
+@route('/help')
+def help():
+
+    static_file('help.html', root='.')
+
+@route('/json:json#[1-9]+#')
+def show_json(json):
+
+    conn = sqlite3.connect('todo.db')
+    c = conn.cursor()
+    c.execute("SELECT task FROM todo WHERE id LIKE ?", (json))
+    result = c.fetchall()
+    c.close()
+
+    if not result:
+        return {'task':'This item number does not exist!'}
+    else:
+        return {'Task': result[0]}
+
+
+@error(403)
+def mistake403(code):
+    return 'There is a mistake in your url!'
+
+@error(404)
+def mistake404(code):
+    return 'Sorry, this page does not exist!'
+
+
+debug(True)
+run(reloader=True)
+#remember to remove reloader=True and debug(True) when you move your application from development to a productive environment
+
+
+

Template make_table.tpl:

+
%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...)
+<p>The open items are as follows:</p>
+<table border="1">
+%for row in rows:
+  <tr>
+  %for col in row:
+    <td>{{col}}</td>
+  %end
+  </tr>
+%end
+</table>
+
+

Template edit_task.tpl:

+
%#template for editing a task
+%#the template expects to receive a value for "no" as well a "old", the text of the selected ToDo item
+<p>Edit the task with ID = {{no}}</p>
+<form action="/edit/{{no}}" method="get">
+<input type="text" name="task" value="{{old[0]}}" size="100" maxlength="100">
+<select name="status">
+<option>open</option>
+<option>closed</option>
+</select>
+<br/>
+<input type="submit" name="save" value="save">
+</form>
+
+

Template new_task.tpl:

+
%#template for the form for a new task
+<p>Add a new task to the ToDo list:</p>
+<form action="/new" method="GET">
+<input type="text" size="100" maxlength="100" name="task">
+<input type="submit" name="save" value="save">
+</form>
+
+
+
+ + + +
+
+
+
+
+ +

Table Of Contents

+ + +

Previous topic

+

Bottle-Werkzeug

+

Next topic

+

Primer to Asynchronous Applications

+ + +

This Page

+ + + +

Like it?

+
    +
  • +
    + + + Flattr this + + + + + + + + +
    + +
  • +
+ + +
+
+
+
+ +
+ + + + + \ No newline at end of file -- 2.11.0

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 E1Fd|#*Z=?k literal 0 HcmV?d00001 diff --git a/html/.doctrees/index.doctree b/html/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bf931f1fb282a6647c1aa172dd7f1b2488ceb86f GIT binary patch literal 27727 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]NdIjCd6X6&HNEXwOX48%0Ae*HK@XahKyZ13F z8=6Hi*$MX}g@Walg3yw??m9{;KTQuZSU}5C+3=Gj+?FQX!&o{jxvwDF=}fpcsq-rd z&4JHRc)$f~BnA`iLMsftvD|Eqds9!-&5RelUq~#o{JRZVUtrFOi6js~i$?_7{=vFs<3e%mf zS}pLWhT%_}0-i;Y1*bEltvUk_m@}2^>KyV*a%|aV4fEgx7lTk&eU{{nleT7HBk`Wi z%<3Elc+No_m^y&KH|Gj;Z_y%W@l#l<^CbUT&97WpCol1$`--ks=ObNeb%DTMsIcjE zk(TcqK`fPW=dA3uki$T&S)}gl7)~rLPvGMPU3Qf!tnO-rNMD#Q7fESx;w)d*OJXMd zgoi_lNdXHuc`*XtTp}oYA0A4`m%OqjgP-HUmU)YKN|SLJGFZT{$+(6olMPZn8V#AFO3B5E?o5n>-<*wJL2$NA1*bNG+jiV$las6wVjB%zrlTjAxO2VIE&Cw8yJzd3=o|W@Kt;8!Bd=0ys$GS_Hm%svyz% zrENe0TFG5&V6GEX*IQIm8knacg9Qv5m>UT9FbvF%L^~Y=GeK>6I-zM`Zo&h$u#*@V z7@-vg<`#Ju37BWd^JI|)MhwiYh=>{(a)j7#W7yHa+>R7T;SL12!wbL8z>toZfq5cS z_tDio^DHIj*+R~9l$`XVUv8jBQy4}r`OTDdJaeb;g%PtFvLJ7sD=}_k)$@e(=UdXR z!C>=DjMFD7P4~&?+7k9x3}Z*Zgq)q2YEx7)G2nSsj&;ThWo*gf z=c8lop14XCOrNRaVGl#=y)yMYMojoTg4fvOc^EI@i;>o4!Dk;Egv^#UWhXeLJ65T{ zs^mOeTO;SK5rvz)YE2BJc%ptY<{y?PFe4GFn|wHdu=WDoh@FAQLraz5rzKG`{2$)- z+0coOdX*QR^W?QXw8#C(F#EU|Cwz9BUR2&IRpkqmxGcDk<1`6B#Es1c@GCLHRu3xY zDrQ~)X+XrS?HGDJ&I?6I?Pkq)JI3yk47%B_O^W74NJZ0mF#@c)NLJnK*OnD!Q!T8S zdZ_@s%mRp+;+8ji7qL?ab2lNWDNX6hb!o-DFJXQoK0xfc;pGewRN`)e6y(%f?$u7!CW;=$?H zBk;`|@av2esfZb=-O=KOx)GH+B4zDYRvX60adJFCXMHoFtFRd-b4KH=G0EYDB~C+2cq9zqJGIPr zNty4~GSiO`@_=FJJ7o{{d!&^2YANuQBZgOQNO_;6g_vgEkC=RSme-?vfRDTJI@W<} zoFV?80B~#dhw$W^56io*^_`Z_mdDrwh`SuU)?K%7n2!);Uy+1aQ!0C{KPp&4WZ1pd zL9ri`40^F`q!{yYq(F$DK;WBCO154(FB{GFDWsra5^atDrv>6O7NWyO;?K4~!e;+- zglL(4O!aT={nMW(!s!_NtEsu!JRbt zIyaI`Wdocw8N|sBBzq=SH{??Hv*HzT#nCec{w54t9lK5B8XepRA#DTK&X@%KHZ~Oc znk8>MX}+&~3AGK`DEI^6NqgJ4)-}l=N(S9b7h;*0W&?J72BnuL55)Tq$T20~?L^z!$aV>TBmxN}M_!S;}^J|iUCLvU!N&H6M zwMqO|o+pbeFxn)3hnQ%SARCDO_YA{L;tz-bNB@WbOP=_3O@igen#9-GB>sYtSl ze-S?XRr!$qKV0FUl{jnlH>vsGZOvZ=NB8Wqnkqw!G?J}*xT`8(*~G8mVQALC5OFNu zz<5YLQ-@V!?pNn%ZrFI)4LWS(X0l{r^=Jde0V6q>F|3rykj@!4+Q;{i zvIQ)}^?RE~>=5Qc51(wtWmqtjy6DEYPV^Ν6<-O7r1H?q_!(ef*^IItzmXtRL}#+Ku`(j3bt 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 literal 0 HcmV?d00001 diff --git a/html/.doctrees/plugins/index.doctree b/html/.doctrees/plugins/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..92e6d0f20fcd6c69ad3981e86f20e16f77c66c5a GIT binary patch literal 23900 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 C&fWn4 literal 0 HcmV?d00001 diff --git a/html/.doctrees/plugins/sqlite.doctree b/html/.doctrees/plugins/sqlite.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0bad36f3e09830e45e70a9a78ed55532c39503d4 GIT binary patch literal 14884 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 TmkRMppZXh5_&YwMLhgS7-rY*O=hN-I**!}F zZ-9hm(tARBPe>)b_uhLWz4zYh_n&#Y*L1RFAYaJ$`~357_x8Pc^XARWn>TOXJl(J$ zm-lj&z%BZzl9#vr1b?m0ib}(JGeYGf5ZOQbCdGqFFy&x#s z{gXEByVkCZtHmSfWhiz_eqa@gR^WOiwPYl{8f6vVEsYz2V;gxpTNxj>Nwtrp+fh?( z-7!2r-6o*cxUCW+>E-yyd8ILTyh0k;(vkEA6lxTV&?=XUZcZwFW6}*Aql#|X@cfFo z%CBVozzr}wuawE#W4>A*s!p@BY>{tgCT!nFXTDl7s#Z3$!Jqa6dm@HOs8wLb>QEg8 zW{@@Mdlkyrs>_^bCafSJH(LpSXicb&PMYocN|_nvt7AsZwxYe?E)LH(7rJ?09Xo2a zXRX{mVp@(HRmXGjX0_Hb7i*NwWRP8^O3BSZGzqmXeLBWJ5KNQ@D&@Qt*ck}R&uBrU z#@%3`T&#>k00S`}1}@*eb=#%e)d@G>s7?&kNm+AAu4wr_Xfr^Yrt;)bb5YSP*~1IX zMJ!}<(XNplm#Os?b1@hNRZ!i{WEEXM$hcroLTvzJHiqf}NvA9QO^~-~lfB<6+Ebf0 z4I0}^R<>x1;O(iLU1m8LTwM{N8Dq8;RLC}xZYi+I$_4KJSVbV;-js2rO8sLV?PKZtHtn~`uu6FYKo-7p6>@`VgIs@K%Gh1BE#F3CD{t)GCThp6w$7?E z#+I0CgQ8;R?aic&B(%n=6oWxyhgJ0LUe)8wU`Do5EZRYad6G~`u%kCro4^ip-b`2! z$xKM7QvlZ&s{RPh;qO$a2IB7pu|}vI`#5^RztEa!wvq4|En=6)k3U76jcMPjhv)v%qZ6Ic_lzQLA%C)nKw&+L%H` zsNaJ?;+9aI%aUdTFr*E@p4b4K=X5(M2jn`N%{FPH&Sx4gXrK|)R2-1tpkoK!ZEf!D zN_z@?9BSFch0x<|q1p}-9PVyQC2Li(%^0Ay);L*ZC!uzL=AEIsh-rQ$Xx>Sl+JGV^c25V6S4tVX z0>drkiWOK;Xe53&>vN>3k;eCzVFc{FsJ86~qQubfvRCr$gqJNqOZ-$FJ3FdFQoER? z7q?<*Tg=ko84`rOu_4|Zq<9H9a%reWm?Oy};0SknS<+m@YAB{V=A^k8*fI0e?)34% zH#=L^gQ23Vs9IxL54xS5tOJ)jLk%d^6_E3lp)x@v&m!ki$QfGIQ5}c6YNpr&i^grJ z&K`^~9jb@$2u}b-hZHpr>!Hbb3=Wg1t~T2tcfG1zW7SivMx72TCL07T)_tmnRk9eu zP28E-qW`Sos0`S*H&hmL;Qm4s%es=a!6=@S*-+(}x&`y+%@ZT9S1y@2n7UX@jX_zd z2KUCINKIl&mu>P>mt#S|tl7)cCUGb*J)r<6lhP_;QkJmtV37$tS(UOCw;1%hrGz_C zF52w&Xm6s=u=07|@GIrAM*+`tV{pRD*AY`)&wL>RGr3%}av&RCP9j<~44Vio%WyKZ zdoqhD>`eZ#xNHI|jNo3**!n#6KP?hZ%ebI7lRmS>%@;w=|W)fVBfy zwo7@el$j|^wuEvatU{>vF|PIK^HA*8Qc*=l9IXS(>anQ_o^7S1xdf=$(-4nO#4JUV z7L}BDP^Nh_vC8S=(CMryAfS0~!g5RL1pq8hE2WK$xs+|i6g!A+aIk7}WTIp3Q)I4e zc9xWHwwI^%097zzcHjd-uN0wfBfMsHu&vtPyxL$*fbUXFs7bJDDpb>8l~d%AUK@!~ zT?f0#>{JIFC5Em%-7mvdp{-YLSrxmT0{8H6i1(1AR@XzoH-zd&^d#nSN}I~s zvMd4(d(<*Z)FaX4rcm9?a;%nW4RBb-w}k3euIoOGjH4-~ZmS8|5wRX@C055f=#*ty zXeC08tAz}2KcoyDa(pKkaq5KfD2JK<=uka|nSUEI|FJRiAD46vIJY;l{qc=#zlGWU z1n`R&u-Pe9PXrU66sjl3e1Ej?-KnyByRiE{FgEHb=;^7UdK!!5KEqlk?x%<98H}3; zJiBF6cQi}+nRQZLh_;v?TE<7!bFO9_TL|}AM=IQBi*TP4s^_wB?_l9RFBb0eS-8(i zFGlZ}Q=mq@pi#6>XVJb8qMe06^&)Wk#i4phEYs&S$#e*)BmeAPSa|hPbn~)My_}hT z-=NgeANr&D2 zyF&FkrkFSOyXrUguSf59Y8&r}lmCW>ZXzeYitddNzziI30!!W;s<)s6hwh!~|Rce{fK}y^bzfO5f3nuA|~%z7uqv za%6p|cY*A8hw42{-x0P2ac`AD&a#GNvPCbqFQMKG7Q8Q1@8>SIfV>Sx*)792lE{kD zw8KkmFtF2|&dgF>V~DvtS|4;b>H|EJK8S$E)I@R6$Bx8SAHoWVeF*QY)ra*wtuCFc zAIHRu`v@3!Zz)qB1t&iis*husvW&g2rU0J^)hA;GfD4uPCQC&RJ9&;FA-2SOCT#wF zjwg(fH(?<7;Z(9vfKS!Nt9_|Yw^D#(<8gc@Qh+1qLwy!xe=by?j}_nu+Jd-G=s~iG zzYwY~GLkV7F@|8|imc%Hg^j5mQVPmF0DrQCAj3c{(gUIA@{uOYi29(iEc;T#M1o2= zRi2J@r;a%y{Vye*4>_#_y)I_Zm%*U_J^IvFz}v5e>T9t|d_lMs8@anf_4T->!N`51 zLCETxW?O|rd+J+a-M;N4#JZgv59&MGx_viP-(&u>KV%C0_rajM>&@B^8W2Zjt%~P| zU{0;^k3jp6L-iA&bQsZhYwG;dQ2mU1x((Z%%dicP<$(|Yb|Tmo)P*wppyb#@MjN8$ zeaKw)JJ`Jxiw1&Z*uubA&c42jYgi_4zbkPIbj;zhei$LEs7Yj68O7oEVu52J2I41l zWHPVKwQc2`ILN`#JUbqi7%O2!;M>J9Oz;XKh47s4zZ%6&Xz$z50g*n#_l#+;0@zYd zU^tfE#$o5iTeR3~1KA9OxL_^NmohFw^drGLbA%tKEZ*x44%UfUR*Iju5_Na1GQZ$W z*ZEMCdnrEkOK8cjLiKA_hx-5@M)6a)0PMp5CRD#=taEkYf5&YjWfvFz_jS%4tF;LI z9=h;c|E<$LC9(-OukLAP176i3(8*Hbj13yAaFd#!_dR znxuXgOZ~rXt)UHigd1gq56~k_|5px0&jNPH;K5Rl3@8~5=>2#{%dz%U6A7%s#<`K7 zn$ibG$=*bDv94C(%qJC>rgqCICg9LI6>V#hacyrRfdfGxm4b>rp5pUC-Vk&fJK&1z z9m2KKsYK!eZciSLW|KVwj*ac&z#t!A^z?Fs*6^+AjFcw1uy-(F;NLjeb^z?x_1LAJ z!Jdn_RZpMMlehT`ewBQU5x$1JQURVuPbdwGR%yJ#k=}FJ;YnFJKJU!LrG6?45;GH4 zkaLpKM{1uv?I(MCrLjAPU5#$9$zW0l&O4Q=o(;m@I$)OU+2|V^{gZo)jfTc`b=-Kg z&ycZbtTs+8>(E&)&O>81rfM;o)QA^s6>|BsHrWdi$38G`5~x?i+j^hS7x_oD2|$?W z|E~i7Cscq=fjD83`|t{>Ulc(6r2@}*+1EsSGD-=^Kn)~51D5a;ohlXj#81wsX){X9 z)shm@kIC8}r-aaHsNnq?osJ()yKLFci}mXa!Go9-orzx|Jy5>8B)!C}rkCh*ejK}; z#VEQ9OkCY|j?R`=b<{*Vx@tG)aD$=QunwXYTzL>)A#D*{U4^JCCQBH@=Ua5HfSjj6 z(oAgqVNLyE5mI6#!=Tk+k(J+XVUv`vrp@4>d5pI=3BCKlerm7Iw%A+ErLZOEBHt%l zrAZeXK^%(m#;5*F8i_T&Cz%;mkYJ-W=?gqIqp-JS96yU4)#q0L4q%^oXT`=fOMtei zA;ThZPctlxtc}ApTRPX2qYvyNqjPecjMdAK_i1##Fm^^10)1OvVpuaJhNxi$#gk@#rl3d#AX(L$F<74TfoPFtMp^Pf>r zx)j7<03 Qzv-GVc$BRVC{nGlO;uc@K`rJDbIJ4|A7T%$GBsC}o3F=jMXS*`4kL zXzVBGTqwE%m}bO-Yx;5}R}V>g-dy@16YvnmRd|K82hZ5!=kaTg9|<1L9&jWrFb~l% z=~b*r&52q()Q2)aoW@az$fc`MYHrBK*j8}mzGtPz#7ZTY#%=)uS&0}mf)(Jy_7|Xxx67= zl5!}MS7lVB3cZ@T7=WNE3pltDw6mFeSAWv?L&&29Zb^hY#xyed=;U4Nr0leMI+=g(vwM zyi`RoR2{seGH}(6L>3bz_-Bq}IA#=aBOUp>xBdG-g|P>Cg;bG_y9%190*_XYy|*fC zb7@^>A?*hQEBYiiG#BeCn!*>)ka?SC%+9lhFO3H=&25~G4stc=TKo>_Iw|Q&Z{?<& zq8(I57{!U3+q6%DY!+`0v0pj>Y~XCK))BL#njT6a*MRDWOMf%?JQ7oQJ;Sl%bOU~b zbfbWG6*S@k(;VraNbM0)JpEh{#w(;-1WlJ1l^IN6 zs&5s5=6<>hOeA-88^5)hH?WWnq5`769j}lcg=cKvxMQ(zNbeMq=+ROFENpcfIZuy4 z9nd@$uaF*xCtHx2aIhCl5sU=F!1Q>5enJF2$Kccx0Un`=7|ju3dJ0=1%4w zpAu<4h1+m^>Z$k<($knA#HWN_5cqWY775Wanmvv^qq6vRUxL~gh>xHmd2+_rtl+_{&J0s|bDBP^n4YWiZ( zBzuAq4tvTtXX2xDYYfRu#yv6&W@OIayYvl(;Lw)!dGvE-o)r;H9~CQVrMlqEAkf6@;7sDbGJq! z-nVcYwnlHokC5KRl))Ma;Sl88l{r z09wfNBiybg&qZj?t@S}8X9?9Ct`>s(D5E_>!F`O|u;4z9A0d5$Nr2#lLJ01Y@~s8; zDfxY%z}=*mfE*;2F@5xD6g0|>`M`4f48L`TQ$6kUS(HOUpTjGp&*K?Oh^c6jPzQRd z8fp51Zuv!N`6b;l-2hURh+cH6USrh)e_2}1uv1kF{1w!T1^%jZ@-^Lwg9|S36!mUH zoUOZC@zo9G)L>m1700^uOii)xbnF82TMbowZTCfqsv#Ip1xhKLFa|J70W*=A2Q8PY0}L z-d3YO0u+P&6J8*P9>}*DGy0|_EkOB*iIc#br!Sb&LMd5oRRV9!^MaCx z8*n2B5Yv>e6Au;9v74Py{|E2MTM*LF2E<&dpUs{~**19afdguVzvM@eZHp1f5z zm&Huv3!}6K#UtkG>R96IvOXOx&5pq{>EP-t9gANf9Vg!$H--isFCTSRWTQ1bx(SPG zgrefn-PAUHH`Q4$tXzw>qM7Ri?+NvIPmJ(ZZ$-*H=`Jt{EQXW#J(NyCIWNK;6v9aM z#X7k@cDvT|JuWB!4q@ZzogxD*p@S#m71DYzs_dTc9^op)vA}@-f$u zU(hh}2cWHtyhrdR>+$wRc$-JgB=E>L@q0)%eltftr+L_lE2jV}xYCCgjtcRNxxy5- z;EK)q%sG3|{1iY&%yu^)&9eb~4=*s6*Q>8jr=oO}HsgsHXQY{0XHP>}NT+knN~AmD zmT)e}X#3*R8Pe=bu56EXzdk(>pLNk8BoE_o3)jf5!lh)~ey6ig@6p+KhI9_Ynycd( zmf@S*tSvqbq6YThDD>x19#_lxniK9;)@GHNM#`vzd=0u3GWl~ALe^N5 zU~ema#Ko%^b(^_Z$Mb2ApcI)yyZ5`k8+b%~-)+QPgN$)&U&h7_xMBt|93=1Kaz8x; zmA9EEV5k$-1)`=#8Ag~-9(dWeD|w7^qDa?B@k*@R9uzqa7Wp(P z<*S){h*{}lKh4623C^W@iN%%p(mu)va3{})sxkFxuavH6k{DSiM)Gzr)_*o-`FA2h z#j_}TW?s1iBo+AglGuaT$6se2Dp1}4mxQ)ftVkwtUFk*I!M%MW6Nh$7DmTM-a%m`14Z(mPNBI{qSrt^jN zyuE(_!2SR!hFaIi!A#>cB!CoTdUUcG&eT}ubK?bWo&x^SiNV#2zJkJo=2|`VZGD^8 z2WtaI$2*~x`vHQ96v;#;h) zcWO7TPu#ddnteHQb;I8k(Vp4E1?Ba4!tpAtX!S)mUoV3fegtuGrT5oRP?cSYPT+UD0wdtzud-DQses^}! zoH=vG99yaB>a@3DaJOs%0TWjitK-E|%~sw*1RaQ=Ew)`PmM5&5%8zZaD&v-K`+l)f z_Ps?z*`ok3UN4W;5RflfHQTQdcC=Efm24|tt(J;oc}Du);-T!`23=piRNQJ?%J%9= z;CqRo?4F1MF_kTK%c~d1w)nNYs(DL5!ve%i*jvGlw+BA=$7gY(Tv0YDDwdd?U&{Lq z7+X4&-4D@qU+8sg%c)eh_*S)4pD32SWkcCzh@Dc!nr%&2>WcJv%MIs~l|rsMU2`gB zZ-wF9o*cCc1>&mIK$|t?PZXKP_x2phE+i^@lpK3|A;E6=J_b*cs~Pe3#wVpbWveY$ z+Vu%<9|VxVP)xN-rQ}=V6^+{4*T9n$=H=~&01NQ-aH{fDv#0gk0-ja4SA zN*9q;ESsY64j2;3s?#Nw#eqP4G!xi0DKC+>U9hH#HOJCYuqtIs^U*(M7xKzG2x;ac zO*QY=Z0}%vEx}hTH}4RHk^NCSzXb|(C_WFsr!Eddw&Y;sbC{N*vd4;4%fpAV^8jA1 z__k*uZ4W*Q_Goa z4Ek%6)&6?5kgwS})NDVeMVXo?*82I~Zv>c9P{m`fyVg4{@QxqNEUe`xSm(VHG7Ei8 znRj9)k+0QMakLI?@=gl8le;sE3iT@CeD9Ru%)&8LB~);4U^ugA6ct`khNli^b}tru z@3diWO=e+OUZ>|X^L4^AhP^YL!}ImbJXA;9TRXS{SWO$`o#o8UEE;o)r2?epojvTW z>uzNlB~}8v>mjCd0`FXiNvhXIqZk_?!j!YxInFsDGhbl6^BfR=ez$YVuro01oI32B zHtd`+Tz8PQgA5&HGuWETW_uf2#B>wt3m~qcz`GDxI?U#r`e?pB+L{sto}WKDf$-vWFBhv-yN1|u!LqmIC#xk}*LPH#NmQ`9 zZ(Cz|$UEh2iZQu3%Fx?PMl+ol-794D@lN{TCFK$bB^!88pioHG#Ud2Z;!6YXG6aiO zn<8;eB#D54=%ImwnG* zYu~de?0d#Q*QHt~98rcs69GmUBHT7)v}1(hV0t3(95PMhPy_sPSl-3Jb4gJWZTx1m zT{a86T(L&$=qdZq#`^VYwW4a$l80PcqxM*y<;$)kOwpr?6Hcwin#xaGwTe}!SjC#v z4Gei}vN)zH*0@4VoT{iT$&|IuuG(eY{gkDzEGnD5x>2X{)}pGE8NkjA3Rf=`M4@!^ zn*+wMZPblt-Wo6J=AIQBs4a9nMe3v=0VV7deY-TCvNjl+^W{))g*lBnvH%)*OLpHV z^tfOd)B^+FmRJdi7MD7e(EefRPj;h-PL~?hkk_tD*ejzPD}h&Kf&J&`z(cXUJ+LRM zPTnv23D1LisKE1?8!ZA;z^oCqc6Nb`EmIwwvL_W~@V0{BsleL?6jH4e6b}vEqA(M0 z8fuu%UV#MvUA^(H1SMAm-V@2pe?Pm7s-G~L!S{$YGuBGsw+?|=nzA0{xJSDRLP<2)Gwu`mo)N0j%{(g-%HK8h%twlRk zQ4{^%b?i^jtLW~99Se%>sVIe*dGj<#>-xaEAuPA6b%T-4Ud@tvL@S^7bkO#UztGS^sFB`o~uGNCCBg}Mf;E{t~UuHNRjF$^1ucFx{bMU(3T z>bTXbTR>oq<#UCiB8pT$zgm&x>$M7EH>jqDVX=&T}EVvZzM;O%en;BFp~Nj zO1^tnC#|EcV+fJ*^IPq10xP>#S7obfGcso{Q%0E$SVtDRtRowU5{Zz6dbu0Stik^z z%H4F)nWard?LCKe^trICw@sD?{AwPS_46`|IBc=iR@-}iTlHHzcwpF3ya3hkG3|Kt zYlrtjG*T}LycdTJ=#A2VqL~m&^QORiNf^^)X}+|nU-e#=Nk+rLK8`N?WRTd`2y8SK z-pyip-r^h~mS-wdsh4ZZ^A&;jO13>5c&=+6cy7`I&qipYq492op5GKVMPJoKp)p0H z%x;7J?qUwFhNNB-c&`O<4s&}&!#2G=@Lorne+Qb+(z7m@aKXF|ti)2uTEA_~uFCw2 zg~<{cXfQUzxeq-^fgOs9$N3cZNXW{2BMR|Nf%j&X)+0gzBy~Ib zV84pO+?L803VO283^H=tU>qg9x1bNcGw|L@Dwje|O-1azjX2Cme2;iS@9k{S-_gz4 zfpK=NGL=L1kPuAJl)bxd5Hk%Ed+3+EcZvxtsw2UL%4EJ+&dx=in2&sy?g27OXxDAy zEMl>CLu8JLA%_VD@9xHI#69RgrUzvD!h82nW-&gXkoA)7y+>PZQaQZ$a>%)w=G^;Q zNBO3UN_g*w3_cKe_p-XZjeLF3=#=*%n3a^1cc1evvG=RfePq(R-;PZ}^f-4igAYU1 zI3^GtyOZ8Wpa35YypI8`82TU3hWUA3T1(jr z&>Z}9;C+VFd<`OLHV3sqWvmV{pJ-#Hr14|Rx5hdrU&8Qv)lg*$!i4P-Ykx3-2fL=v zG>PmrqM6cEVscvJjvD($TTjy_X|395S4*&2bZaCtnjF7Jqisz8NE18eREmJ=_HDG8 zcBwLzY_*akE80n6{~?CaXSa@>;80oh+!ld_GcjYzCmg1a%xcc0BRW<{BH){w}@i}C}@a83(0$sfX2L$R{qR)`?cC>lN7{C@!XU!?QF9~wO=9>l1lvTH_Y(;1r-An~V3cO~d(sR$QR~YdsMqp- z4zOPY-Y+Q^9TXGTuLAGajNpP+Ltv2(c@MS9>^C#XY!4%|Fl`61{dSkd_B#>V?*s1- z6x%}-+aE)*{fT1xZCq@BZWi0GD7L>qY^|hue}zc?7I=RTCHMOl$#G6gs)+XwK>joE z{zVx@p$++|IT+msYB&56f=gnZYn+-3kQQ00-I=UmXf&zda-eFdw(SyC^N3YucxEs# zI_RRB&qPp1wE!=HT1YCKq$?Dj6sSe=EfYp+vAo~sGM|{FRRZ5l!geVL$XhMpGo9@~ zzS;v(*IlcY;t{B2_%-5pNk>Zwa9lC_R!S|`s8o6H`EE>w2cm?>9#38uXb zCI?T-5sW__gs)%t4`f$g>2&1Z}lQHg?wyG5*8n2gP;{q9%GTk7gugfyHUf1ndqN8yxU(X20xLu^uFy0@hctb}p+x7-*qWvaw!ohbyhJR%DD2 zb|D&itb&=AZ8b~^Rji&KAS_pEGQSUyNe<(x3ihq6IQI0U)IJb43L`Wm*y*T!r6AhZ z$OcTmqxKVkv>59wDYZWWplk==5vT(tHW|e_JuV9vWsRv>b&$XuY+%^Nh6RvwWMWo; zof8~R$f`pKXXa$%YvSrqL^#{CCnCL>kPXqKsufJc$%JgUm?*9U{RMj~{$pV{<M&wxpRZMiGd$h20c^oA` zT?U8~#acl+2&0=oMi|kOy5jN@Bymhb5_%+6*DMJh z)r$Z~pbw8grSKa{fb@qF7z7OuV+~dPI@8sX=`lLf?8BT%Lpx#8sADCo<4jicbqFhZ zq+T;O6Y6-RGx%bbk2-HvF5=vJp8q`5<)+=zY+pXu!Ecv7bW8cKBr9)UU& zzoAl*xRyRj>;d|`sI@xPS(55(ol4g(MmNfnt<5?CT5o`M*4msyxDKt2v)!GkwKx|^ zT3d?^2m@Q^;Ss3wiBsE*E~yFYN@U-tK@FZ3@C!6}r`Ce{IV37cV4neVRZ>?S6n&Ths_pfV&9Ix9RtXCE)$T4yhj z_xoJt)2y@fv})E_%91+!1U}Q^GqWq)sY{U##e5kafw~;OVKI};8MSv4_yPjJjg3d3#)-`+Er|$~)`kZBPb?QTp~;~w z7^tEqC;LCkK59f-C;R*woF^s{$^}JG$Sp!%$&hyhq_b0#i&o8~Bxp6Tw3$SWEF&I; zb13lb(124F0HV;Ucm&E5tTH-vNtmc0T*icCr6dGc@tl)FA|Ee-s^J$UtwSTWVVIi* z6;&6otr|>5zVT%hH6;--R@63xWURRFVV|CE>%%NqKefjqtvXhM43K` z3DUF6<66K%hEK*LP)`xeN!Mgdl68gQ*k-$cT&F>@^^gHBoRR^oOVs^3MgSPRVCYg& zlUVY=0tbcxH4C1%PNm>uG&2qdxyB+497y9%vN8a|TCW8cz%r5MEgAKg^<28?q|{SE zL9C%rN;WvN)i2CVx1nL<=ZqhZ}P`C|IKT|-Sr9rZ1L)2?6 zUp$pCbP_K*$eQvQ8G^H@b($GCC_7)k;D|nv;i$pyr#tECBe{VAbtCX~5ZtpRn|8sS z6$qg?> z3GPA*G(qY%M4}9ITRH%~UX6f2y#~KwTRIRGm06QeuN9cv4NM8tH?K^zxosGijbgcA zZ__>-4X=s~#Ur{BiQ>4G%h6vcm$TNavAS|OE{5fDU3BoUBKHpXR$#Fp-XLAYmHF4W@J0|<=%ugO(!K)w*{9e4!ljY6sJ*(k+wln0I|NHoW<29i$dGhtDzO};?h^2K z8t|b;(N9jJDMz=Mh@5kBIw03n>h!IKM^gx$GLcf|)P!aZrEuRRnRPDQ3qvmN1`xP> z_z6rVH+{VJW=fh)QG99P zexSlxv4Yj7mvTbkpl4+#YZp@L{m7tMMxq5DkbK*X2#-MB zC)6ZeLo7ujf@1s8OWziCzrcN1!?l}YACZU{JL;nd$s8E%N9mLOD1F=`LR-vNA49y@ zU?0bev!~c#)sXp52s+wepTt|BJ|*AU!Fqkm78fx$V1)VV)5O%{lGM2I^%+SVqspzS5OmbdXnU(y8jNn!cG<@yA?QY(`-l^pdx)bVcm7lv-94dDI(zUOPss#MRa zu3poGujyKwP8%bK^+qXan8#?DgLD<#bg(QYl0j6`U zY=_H*GV8`?t?u_?J6yhCt5VUg8Ky{Y2$j-MAhKAlnItJ60`(I2a87BKN+z=t1;G+i(&CC zQJv0)MJ;Sq9t03tmB-X;eb-~^71iK2^-|x4o}f|w4jzH}u4tAv6WL5Pdh_o|{P%Ty z_C@Hc)^diV7acjQJpAk2sl!85M*p%;sZqOqc%;^tN<4pLn^m~!YBFEuJWK_fo6!Ak z!ITTDo#et*SRjOrFopfWQ=uU+nXkgmtjL5*O8o#NHrE;Hg?}iNxA($N4(rR0m@fVQ zGiN^rg(#_?;1Q^w3O`BLu*>3!OjR1HKNF~*Yp8ZZ^%oKm6NmaGLNfd7{n_04C;PMe z%>HckE5wSK`fI#6OT|omYACvg1R2fL-{37!zm;!2i*jD)4d3c_#M9%F%(#*Idr2Cj z%NVIqUVmT$J)<)d>OTSma{3bx`Ou8mN64+4czX-@*HAwbZQ0jA_YkIKLYmJQb zn=#Oc_AP4!^fQF}*r%`+usALopD_2w4%)XaJ7zeC8Ttx#x!Z7ZfQ9K;nT=`aC~RII zQw5Q8GYs>! zX#Ryqpyt5x;9Lp4h2l`ik%GaPhYLQt0V+^)W3UY|jEry+V|R&bB}XISMASUQqsZtx z5DHYyM;HiMfCn6M1c7dKm>miT&IfSoLaN3Z-6EZ2u_Q_8B#r21qL&EJ9tMcs&<&zd zcBFc#M9xh0GQ=Z)u2+Us_p9Xy1lcR_2-Kc}L6gl4<79JB|I8Yq_R@Iv7CifCJhHQG z<}?w5t?MDR{1xl3Neu960gP-$@)J@~oz%s^!+FtGH)d5IB867Ao zPa9ST;e{K?k5vcbt!bJrGavaD3yOvYL5@?0;*Hzx)M0pm2$9d6V<5G|@fj!!zv0Xy z>C?3_olOC1*J_PA0?C1QrQltq@%|flBFT!rKTfb6X|N?gRik!NCPzuk%zD#>creYC zLS3mf694aC|oaIajc)tNZGa{t1 z4J{fUaCWA@d0!fASG{X&6OZON1O56LoZN~v)MA6K7WAEM(5Hv(&@ljlEFKOL)Um(? zDISMMppKW^wG_#&RwAzToFMTh>iFz>Fpn0U?W|dlX^i609HVu{(p-_|L(73AdZK_c z32eF16rTi)&0>(I_+-hbRU6h0-WZDD6sAjO*F8*xr~%-E7*53_P^U@m$%hR)7^M8P zG&yU!MzT5GWHSdfS-elIO_bV27)@Rf`ObG&MmZ>z@fAm6In19HYq=bJ=u6|hTq`p} zFWIKf`Ia>d#K=uU%kVRVwlQQg;Pz!*%>%#Y03MwITA0A|_6Y9a40D>MoCcnLl9?{U*Q~xtT zhD6ChHI6jwdBNOD{Mx}=NcpHl>QTrH<)_8~1AQsr5hz;{=n>Hj2|xpRg3(K-xp7H0 zVUls3HFUAvfkG$;@GSBo(?yG|658rus&gYVE)%6?Eq69~Yymj=^gmf#sS2d0A=}5SN+M!KqI`s8_U3Ul`dqTU@LV!g zLyV|&9WPEo)cMv>owo`ij#sDf7N~9Vt@niR+?tj{&eSw<^tdE1K32U_lEvsTW7R01 ztC%1yTTMEleIlYEp8$_QT`kCxuE~ppb!<^+=_k}Rhz9vjlBCz_q}gMkB^<|L;e=-Y@v?gtd)~_8fX#CXY-<3176T)Bf4V$2l2T7b@+R)MAdiy*p2Bb_({@4M#^z8c z&Fct9)9a~t3DnaBJn0&=B+&>>>eclU-G*)OHB`kLBr=^na<-hPry~Vq_zXM(^-M{g zoPBbzO`@T$bnJYVAi2>Xp)np8lzKKIOaj9Y_f)Cp5WeBBxjT|Uyz04xzUzAIt>Oq) zWF7OxgmUl91CzU5MJUfBCXU3PkC#Bbfce4oQpiF6FO+W)sCtpS-{&&(W=Bi%MhU-| zPd%y@n$%4QfB;{DN1$Gc->^C}H(i~h{Z$;u(QWNz0(`RumKvRkB#G*rhdikdw+PtF z4cLBoZsKY&4jWuqt^3YOtU-)n`(4qW^x?6-#kR5=Hd>SQQmu$Xv}$_iIj2nWqnL}T z$+1iN1i)~1-QwXLk>}M|sS=$Yh#eSZbD|e!>G9>7lMeMp6}|YV*Hz3MzP0k~D9r$7 z`NLLVWlB486)Kq7;T)%pTK>%X25tyUXa@Ha4A&o3EVcOV4i z`bIng^(Op=O*rY)&9Oe8?LTW()SGoaZ;^cN)cMFkZT}hGX4$?~u)ob<-?41pPN+87 z!sC7>*}Ve^nq_wvLLj?$;t{BK5udSUNk=HVeNb*qO{Qr~)!jPvJ(Bv}I(2p?=w?3O zBWd1i(zNX>h^x^12xQo#F(FOr4)ztiAMmD+7f|&91c1qV@d(rhiOn!cB0?t5Z)Ng7 z>KD|9be{J~p7-lKvkz|`4S~`+`mp5m5t9?QcQ-mAT~W{r(O~D$!D5d}eh0*^p_Qt;@JDl>;5qg4w|wX+{opVBElEh#>uQ^>AN#x^tXS%LYS zf!V8xfv^`P{ht?znd$!m;z2(TOb+SS$<-GT1M(lhBT!!wG@5*79VcHVqCsHTVXH6e zlwXmQU)3q~M05Cz&9!Qw-5lv9>gP1-zGMr;3Ohc zaIQZYYiK}yN2mC%r1+jrAuCiNM8r%utNwif{ec199VUl(?P%5FA~z4b!^yC4^ElN! zQ}DMLb8?tP?#2|P0jU)yZF3@Cv%?P;58>ofFUS3NxP&-qCg?HIiI30?dAexh)X=U? zo7ZmKtes_uIpvpNx^^F@T}%wj1?R0>mtNlnbV3u*`k{4jXGZqj4vt(|)3rJ!f8i=b z&eoi~`sCFdJ@Rm=$k?NEN^Ddt3j;qC33Z+geSK)T{RluP!N;VCeIZ>*^<#(w`uh_+ zu(B@#)D@FTr}dWus-H>x&vktEP0(i?>qW20QB|4Zd9^gWjX8mH8S^EU!Aj`EvNED*+g?P zbOYlo?34i&L=2EgImiqND>xN2nNq(1<;@x+Qv$yfhFTl6wS#wu+VU#_NXtp{Z5*p# zBNoDY2#-MhMnIFDL6J8_2rG^q#&0FT?@R&<(%hNw*!uon;9H5+h}nDm0rAl6Lx65a zC87QZI8gm3Jm91tNOh5utaw}eL|}SEOYJY3(!UC&f76s^A8D$hqKr)+{#_{iho-Q7 z`tY9;5i2?MFN9KJuqGBL_-A=9OIhJ6vBpjM0V2vkCF zCS8*y$&|*#y#|@11}qV%Jv5ZuDxjwiqnX1((I2bJl@WU4Feas(T8eZ{jJQuBPpBiy z1Y;X7(Tw48reuS*0x$5R5b&gH5R$6+jNx7q-G*)O{j6?#OJq8GIBLmGh*$dn7P8qF zk3j7w36rx)2qsCW8T{=p$qz8eX(`2}Vn%?34@ZCp64Y2XE%z>{g9x`>M9ILB;1ieklsHc!t2^;OYb8lFQAIEg*M-7`tf?Sm3QFsKZOPEW#hIbZR z!&c}Pkfa95-hyJ>qzi|FYb~G9e=|>ah&&IvN4etU#{y5P!Q3Uf_zGM-3vhZyDd(+n z9h*;-zAQnN@g_GR=qX8@g$>+Ss=r;!(Q!SYRs#x+<}rfd zSdD?*T&yq2EQzI1#{q`z@$rPsEYMNv1boS)eNS5xvUc$PP_8F3O)EL1BZrzhnNTMo z9>koC2aYfyFgyv9P_wg5uLq+~CZoqOSx$>`)V9Vk`Hb_GsDXYZr3R1+)RQ0G-e(p^ z8K_ek3ffN-)NKk7^(AWv$G+rryaehD0Z+OHH_40lC1*->8#b_wzGN+d)4RyTSxAIp zJsXcetrPT7?j%Wy6)PgH5!iYGJVyg&kAuM0>GPq&hESSRZO|*ajKX{_RLWiOR5Fcg z5j)AxMfxVuxuLu^2?fWwi2!96aii_0r5(QViUKTLUDK;ZPh z&BG9qLvk155vYqKqlgX?*DAS-1#qJVl&$4$l4I|nMMme`P@>$;U*ZmP>@h1&@)jZN z;3yXCijOhLCgAHV$<2~e8}E@MGfYWIJ{~WDx=})|Gw$zQi1Z76BNS|+g4@X)EM<02(D-MQ2m7srW3r)TTY#&xz)F%!8;g;^CYh1~ zE8`_l6#-AW1|cbp3#=;9ZP*4sMuB+*PCqRCD4>EweLQe}iDVklL_%97S{J~r8Zg_> zZX%D9&La_Wmq(-W>h{j8FjmHEb~&Y{khZe~w+YrZo+AlPGbJT>C0+t`m4GK*gOHTP zCHO>%Zo@YCaY`^CaQfe(|7s+K#IC_3P*0LfA{t0otHiDqz$a_K>?y31b|3bg6?vJM zbgW|{L7YFp*%@q$<;t%XqLv(5z4A0R)~3``fTgqSwhR6?ZX?-U$CQ-aQ}F`d4gpWP z1|eyT%kFxKZo@YC3CivU0;m5&PM!`Vkm57&fV+oe7g0kJTc!9c0lZNIX1gK93vdew zx>D}lp#F&rqqTjUZcYPtv^bGc&qkuoLVJ#&YhyDK+H;wbLVF%waHfcW!(oHLJuXR# z3+)9G-G*)OlN8zu37pbBE z%ol=^uA!Gg3QL*G7u3bq2;gfqV0JE+FG4>=-E?63m;<)(qOxA&zQRfpZPVA|HPh6X zQGd7>Sq#-qkvgpdZR}2Oc=tMVLuGTA4xlQMb+P+?#}@Hyf6? zc`MQxGc`xxaBA)?gfmlfTpkQz)tv;|F2_K{+%v*xI%uf35~RZ%+}jwgce{n~>g@=F zyx)OGpzgwNH~~j;rKTbU=LTbXt=_2aPEtI>*Lllk&|Qmie&X^qQOxCd}udz z-mR%VBPnB4nPr72tIsk)S{#vP!2CHtptwGd2Tptud^qui$$H#R;-O27easgH%8}b=E4W7XU5E=6;Sssf%=}uL92_u?X(CKRCd5wT ziP}h}_oksWM@K@l1bva5;(|?DjVp&juLa5nhdP=4v@#;|v9}FlGdUxM_gz}y4cG%b zEG#BG=?A_foU{w?fv}vu3;+o44UZ~L)mK0@3iPXZ1nO(TWAahP0}6}Erd5v{)xIvw ze8VuaJoL`cD<`3M1{I?HK$XOq4DasBW1y+9iB{G&jLU^x&ckar2Nm)|zl+fMIHiyE zz=eEk$Hs8CZ6ExHam;6_Z!PuOXtX}5qz8@_(Uwc>&k6lG^3yqdH4y84mk8p)a#4cO zyox2jS4)Dcx}pma;h>A#Os3(p(S@~m))-!L$m7X^X7v_Njc;TiN1(nV!qiLnRK`ZD_+5$ro{rBBqpf%XTsGL1;g+L@kJZS?sEy_h z%7%uGZIkw-mVp&v<+=b^vxG^|kA6C8yx=vCJ9C&0C#^LXw6tU2m%Q8Cu^)wn`~v|< zXZM|nIQ2t7fY%@45vU&vcyeZN&_J$@qs31o(N9ex?U~ocD?6*72}moQ8W)FFKSw-u z5mdIMSHD0M==&uef%=u;(PhERQ5KPB9?$D$@3YHtRln9*JS18CMrV=zx6wr+idh)H z71Y1esM{@!-%CVHJn9b!$sC|94Bgb}dlccFQ`u5ie?+v{7=OZxbC}o|KM%|N&w`CM z#$WIjsK3g0GJ607q%8q6!joIFHfW50BcdLcgvPCmzf0N}WyZ>gGW!P;q<4(_pMXIT z{tFMBO#u%|n1!y%kR�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