Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/app/static/doc/flask-docs/_sources
diff options
context:
space:
mode:
Diffstat (limited to 'app/static/doc/flask-docs/_sources')
-rw-r--r--app/static/doc/flask-docs/_sources/api.txt624
-rw-r--r--app/static/doc/flask-docs/_sources/becomingbig.txt88
-rw-r--r--app/static/doc/flask-docs/_sources/blueprints.txt203
-rw-r--r--app/static/doc/flask-docs/_sources/changelog.txt1
-rw-r--r--app/static/doc/flask-docs/_sources/config.txt384
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/cgi.txt46
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/fastcgi.txt164
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/index.txt23
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/mod_wsgi.txt167
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/others.txt102
-rw-r--r--app/static/doc/flask-docs/_sources/deploying/uwsgi.txt68
-rw-r--r--app/static/doc/flask-docs/_sources/design.txt191
-rw-r--r--app/static/doc/flask-docs/_sources/errorhandling.txt237
-rw-r--r--app/static/doc/flask-docs/_sources/extensiondev.txt387
-rw-r--r--app/static/doc/flask-docs/_sources/extensions.txt48
-rw-r--r--app/static/doc/flask-docs/_sources/foreword.txt100
-rw-r--r--app/static/doc/flask-docs/_sources/htmlfaq.txt207
-rw-r--r--app/static/doc/flask-docs/_sources/index.txt30
-rw-r--r--app/static/doc/flask-docs/_sources/installation.txt175
-rw-r--r--app/static/doc/flask-docs/_sources/latexindex.txt6
-rw-r--r--app/static/doc/flask-docs/_sources/license.txt48
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/appdispatch.txt170
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/appfactories.txt75
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/caching.txt69
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/deferredcallbacks.txt73
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/distribute.txt166
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/errorpages.txt77
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/fabric.txt196
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/favicon.txt53
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/fileuploads.txt181
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/flashing.txt119
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/index.txt39
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/jquery.txt167
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/lazyloading.txt104
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/mongokit.txt144
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/packages.txt115
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/sqlalchemy.txt214
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/sqlite3.txt119
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/streaming.txt61
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/templateinheritance.txt69
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/urlprocessors.txt126
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/viewdecorators.txt168
-rw-r--r--app/static/doc/flask-docs/_sources/patterns/wtforms.txt124
-rw-r--r--app/static/doc/flask-docs/_sources/quickstart.txt824
-rw-r--r--app/static/doc/flask-docs/_sources/reqcontext.txt239
-rw-r--r--app/static/doc/flask-docs/_sources/security.txt175
-rw-r--r--app/static/doc/flask-docs/_sources/shell.txt93
-rw-r--r--app/static/doc/flask-docs/_sources/signals.txt255
-rw-r--r--app/static/doc/flask-docs/_sources/styleguide.txt200
-rw-r--r--app/static/doc/flask-docs/_sources/templating.txt188
-rw-r--r--app/static/doc/flask-docs/_sources/testing.txt307
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/css.txt31
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/dbcon.txt57
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/dbinit.txt67
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/folders.txt23
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/index.txt32
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/introduction.txt33
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/schema.txt25
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/setup.txt90
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/templates.txt111
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/testing.txt10
-rw-r--r--app/static/doc/flask-docs/_sources/tutorial/views.txt98
-rw-r--r--app/static/doc/flask-docs/_sources/unicode.txt107
-rw-r--r--app/static/doc/flask-docs/_sources/upgrading.txt324
-rw-r--r--app/static/doc/flask-docs/_sources/views.txt227
65 files changed, 9444 insertions, 0 deletions
diff --git a/app/static/doc/flask-docs/_sources/api.txt b/app/static/doc/flask-docs/_sources/api.txt
new file mode 100644
index 0000000..7695788
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/api.txt
@@ -0,0 +1,624 @@
+.. _api:
+
+API
+===
+
+.. module:: flask
+
+This part of the documentation covers all the interfaces of Flask. For
+parts where Flask depends on external libraries, we document the most
+important right here and provide links to the canonical documentation.
+
+
+Application Object
+------------------
+
+.. autoclass:: Flask
+ :members:
+ :inherited-members:
+
+
+Blueprint Objects
+-----------------
+
+.. autoclass:: Blueprint
+ :members:
+ :inherited-members:
+
+Incoming Request Data
+---------------------
+
+.. autoclass:: Request
+ :members:
+
+ .. attribute:: form
+
+ A :class:`~werkzeug.datastructures.MultiDict` with the parsed form data from `POST`
+ or `PUT` requests. Please keep in mind that file uploads will not
+ end up here, but instead in the :attr:`files` attribute.
+
+ .. attribute:: args
+
+ A :class:`~werkzeug.datastructures.MultiDict` with the parsed contents of the query
+ string. (The part in the URL after the question mark).
+
+ .. attribute:: values
+
+ A :class:`~werkzeug.datastructures.CombinedMultiDict` with the contents of both
+ :attr:`form` and :attr:`args`.
+
+ .. attribute:: cookies
+
+ A :class:`dict` with the contents of all cookies transmitted with
+ the request.
+
+ .. attribute:: stream
+
+ If the incoming form data was not encoded with a known mimetype
+ the data is stored unmodified in this stream for consumption. Most
+ of the time it is a better idea to use :attr:`data` which will give
+ you that data as a string. The stream only returns the data once.
+
+ .. attribute:: headers
+
+ The incoming request headers as a dictionary like object.
+
+ .. attribute:: data
+
+ Contains the incoming request data as string in case it came with
+ a mimetype Flask does not handle.
+
+ .. attribute:: files
+
+ A :class:`~werkzeug.datastructures.MultiDict` with files uploaded as part of a
+ `POST` or `PUT` request. Each file is stored as
+ :class:`~werkzeug.datastructures.FileStorage` object. It basically behaves like a
+ standard file object you know from Python, with the difference that
+ it also has a :meth:`~werkzeug.datastructures.FileStorage.save` function that can
+ store the file on the filesystem.
+
+ .. attribute:: environ
+
+ The underlying WSGI environment.
+
+ .. attribute:: method
+
+ The current request method (``POST``, ``GET`` etc.)
+
+ .. attribute:: path
+ .. attribute:: script_root
+ .. attribute:: url
+ .. attribute:: base_url
+ .. attribute:: url_root
+
+ Provides different ways to look at the current URL. Imagine your
+ application is listening on the following URL::
+
+ http://www.example.com/myapplication
+
+ And a user requests the following URL::
+
+ http://www.example.com/myapplication/page.html?x=y
+
+ In this case the values of the above mentioned attributes would be
+ the following:
+
+ ============= ======================================================
+ `path` ``/page.html``
+ `script_root` ``/myapplication``
+ `base_url` ``http://www.example.com/myapplication/page.html``
+ `url` ``http://www.example.com/myapplication/page.html?x=y``
+ `url_root` ``http://www.example.com/myapplication/``
+ ============= ======================================================
+
+ .. attribute:: is_xhr
+
+ `True` if the request was triggered via a JavaScript
+ `XMLHttpRequest`. This only works with libraries that support the
+ ``X-Requested-With`` header and set it to `XMLHttpRequest`.
+ Libraries that do that are prototype, jQuery and Mochikit and
+ probably some more.
+
+.. class:: request
+
+ To access incoming request data, you can use the global `request`
+ object. Flask parses incoming request data for you and gives you
+ access to it through that global object. Internally Flask makes
+ sure that you always get the correct data for the active thread if you
+ are in a multithreaded environment.
+
+ This is a proxy. See :ref:`notes-on-proxies` for more information.
+
+ The request object is an instance of a :class:`~werkzeug.wrappers.Request`
+ subclass and provides all of the attributes Werkzeug defines. This
+ just shows a quick overview of the most important ones.
+
+
+Response Objects
+----------------
+
+.. autoclass:: flask.Response
+ :members: set_cookie, data, mimetype
+
+ .. attribute:: headers
+
+ A :class:`Headers` object representing the response headers.
+
+ .. attribute:: status_code
+
+ The response status as integer.
+
+
+Sessions
+--------
+
+If you have the :attr:`Flask.secret_key` set you can use sessions in Flask
+applications. A session basically makes it possible to remember
+information from one request to another. The way Flask does this is by
+using a signed cookie. So the user can look at the session contents, but
+not modify it unless they know the secret key, so make sure to set that
+to something complex and unguessable.
+
+To access the current session you can use the :class:`session` object:
+
+.. class:: session
+
+ The session object works pretty much like an ordinary dict, with the
+ difference that it keeps track on modifications.
+
+ This is a proxy. See :ref:`notes-on-proxies` for more information.
+
+ The following attributes are interesting:
+
+ .. attribute:: new
+
+ `True` if the session is new, `False` otherwise.
+
+ .. attribute:: modified
+
+ `True` if the session object detected a modification. Be advised
+ that modifications on mutable structures are not picked up
+ automatically, in that situation you have to explicitly set the
+ attribute to `True` yourself. Here an example::
+
+ # this change is not picked up because a mutable object (here
+ # a list) is changed.
+ session['objects'].append(42)
+ # so mark it as modified yourself
+ session.modified = True
+
+ .. attribute:: permanent
+
+ If set to `True` the session lives for
+ :attr:`~flask.Flask.permanent_session_lifetime` seconds. The
+ default is 31 days. If set to `False` (which is the default) the
+ session will be deleted when the user closes the browser.
+
+
+Session Interface
+-----------------
+
+.. versionadded:: 0.8
+
+The session interface provides a simple way to replace the session
+implementation that Flask is using.
+
+.. currentmodule:: flask.sessions
+
+.. autoclass:: SessionInterface
+ :members:
+
+.. autoclass:: SecureCookieSessionInterface
+ :members:
+
+.. autoclass:: NullSession
+ :members:
+
+.. autoclass:: SessionMixin
+ :members:
+
+.. admonition:: Notice
+
+ The ``PERMANENT_SESSION_LIFETIME`` config key can also be an integer
+ starting with Flask 0.8. Either catch this down yourself or use
+ the :attr:`~flask.Flask.permanent_session_lifetime` attribute on the
+ app which converts the result to an integer automatically.
+
+
+Test Client
+-----------
+
+.. currentmodule:: flask.testing
+
+.. autoclass:: FlaskClient
+ :members:
+
+
+Application Globals
+-------------------
+
+.. currentmodule:: flask
+
+To share data that is valid for one request only from one function to
+another, a global variable is not good enough because it would break in
+threaded environments. Flask provides you with a special object that
+ensures it is only valid for the active request and that will return
+different values for each request. In a nutshell: it does the right
+thing, like it does for :class:`request` and :class:`session`.
+
+.. data:: g
+
+ Just store on this whatever you want. For example a database
+ connection or the user that is currently logged in.
+
+ This is a proxy. See :ref:`notes-on-proxies` for more information.
+
+
+Useful Functions and Classes
+----------------------------
+
+.. data:: current_app
+
+ Points to the application handling the request. This is useful for
+ extensions that want to support multiple applications running side
+ by side.
+
+ This is a proxy. See :ref:`notes-on-proxies` for more information.
+
+.. autofunction:: has_request_context
+
+.. autofunction:: url_for
+
+.. function:: abort(code)
+
+ Raises an :exc:`~werkzeug.exceptions.HTTPException` for the given
+ status code. For example to abort request handling with a page not
+ found exception, you would call ``abort(404)``.
+
+ :param code: the HTTP error code.
+
+.. autofunction:: redirect
+
+.. autofunction:: make_response
+
+.. autofunction:: send_file
+
+.. autofunction:: send_from_directory
+
+.. autofunction:: safe_join
+
+.. autofunction:: escape
+
+.. autoclass:: Markup
+ :members: escape, unescape, striptags
+
+Message Flashing
+----------------
+
+.. autofunction:: flash
+
+.. autofunction:: get_flashed_messages
+
+Returning JSON
+--------------
+
+.. autofunction:: jsonify
+
+.. data:: json
+
+ If JSON support is picked up, this will be the module that Flask is
+ using to parse and serialize JSON. So instead of doing this yourself::
+
+ try:
+ import simplejson as json
+ except ImportError:
+ import json
+
+ You can instead just do this::
+
+ from flask import json
+
+ For usage examples, read the :mod:`json` documentation.
+
+ The :func:`~json.dumps` function of this json module is also available
+ as filter called ``|tojson`` in Jinja2. Note that inside `script`
+ tags no escaping must take place, so make sure to disable escaping
+ with ``|safe`` if you intend to use it inside `script` tags:
+
+ .. sourcecode:: html+jinja
+
+ <script type=text/javascript>
+ doSomethingWith({{ user.username|tojson|safe }});
+ </script>
+
+ Note that the ``|tojson`` filter escapes forward slashes properly.
+
+Template Rendering
+------------------
+
+.. autofunction:: render_template
+
+.. autofunction:: render_template_string
+
+.. autofunction:: get_template_attribute
+
+Configuration
+-------------
+
+.. autoclass:: Config
+ :members:
+
+Extensions
+----------
+
+.. data:: flask.ext
+
+ This module acts as redirect import module to Flask extensions. It was
+ added in 0.8 as the canonical way to import Flask extensions and makes
+ it possible for us to have more flexibility in how we distribute
+ extensions.
+
+ If you want to use an extension named “Flask-Foo” you would import it
+ from :data:`~flask.ext` as follows::
+
+ from flask.ext import foo
+
+ .. versionadded:: 0.8
+
+Useful Internals
+----------------
+
+.. autoclass:: flask.ctx.RequestContext
+ :members:
+
+.. data:: _request_ctx_stack
+
+ The internal :class:`~werkzeug.local.LocalStack` that is used to implement
+ all the context local objects used in Flask. This is a documented
+ instance and can be used by extensions and application code but the
+ use is discouraged in general.
+
+ The following attributes are always present on each layer of the
+ stack:
+
+ `app`
+ the active Flask application.
+
+ `url_adapter`
+ the URL adapter that was used to match the request.
+
+ `request`
+ the current request object.
+
+ `session`
+ the active session object.
+
+ `g`
+ an object with all the attributes of the :data:`flask.g` object.
+
+ `flashes`
+ an internal cache for the flashed messages.
+
+ Example usage::
+
+ from flask import _request_ctx_stack
+
+ def get_session():
+ ctx = _request_ctx_stack.top
+ if ctx is not None:
+ return ctx.session
+
+.. autoclass:: flask.blueprints.BlueprintSetupState
+ :members:
+
+Signals
+-------
+
+.. when modifying this list, also update the one in signals.rst
+
+.. versionadded:: 0.6
+
+.. data:: signals_available
+
+ `True` if the signalling system is available. This is the case
+ when `blinker`_ is installed.
+
+.. data:: template_rendered
+
+ This signal is sent when a template was successfully rendered. The
+ signal is invoked with the instance of the template as `template`
+ and the context as dictionary (named `context`).
+
+.. data:: request_started
+
+ This signal is sent before any request processing started but when the
+ request context was set up. Because the request context is already
+ bound, the subscriber can access the request with the standard global
+ proxies such as :class:`~flask.request`.
+
+.. data:: request_finished
+
+ This signal is sent right before the response is sent to the client.
+ It is passed the response to be sent named `response`.
+
+.. data:: got_request_exception
+
+ This signal is sent when an exception happens during request processing.
+ It is sent *before* the standard exception handling kicks in and even
+ in debug mode, where no exception handling happens. The exception
+ itself is passed to the subscriber as `exception`.
+
+.. data:: request_tearing_down
+
+ This signal is sent when the application is tearing down the request.
+ This is always called, even if an error happened. No arguments are
+ provided.
+
+.. currentmodule:: None
+
+.. class:: flask.signals.Namespace
+
+ An alias for :class:`blinker.base.Namespace` if blinker is available,
+ otherwise a dummy class that creates fake signals. This class is
+ available for Flask extensions that want to provide the same fallback
+ system as Flask itself.
+
+ .. method:: signal(name, doc=None)
+
+ Creates a new signal for this namespace if blinker is available,
+ otherwise returns a fake signal that has a send method that will
+ do nothing but will fail with a :exc:`RuntimeError` for all other
+ operations, including connecting.
+
+.. _blinker: http://pypi.python.org/pypi/blinker
+
+Class Based Views
+-----------------
+
+.. versionadded:: 0.7
+
+.. currentmodule:: None
+
+.. autoclass:: flask.views.View
+ :members:
+
+.. autoclass:: flask.views.MethodView
+ :members:
+
+.. _url-route-registrations:
+
+URL Route Registrations
+-----------------------
+
+Generally there are three ways to define rules for the routing system:
+
+1. You can use the :meth:`flask.Flask.route` decorator.
+2. You can use the :meth:`flask.Flask.add_url_rule` function.
+3. You can directly access the underlying Werkzeug routing system
+ which is exposed as :attr:`flask.Flask.url_map`.
+
+Variable parts in the route can be specified with angular brackets
+(``/user/<username>``). By default a variable part in the URL accepts any
+string without a slash however a different converter can be specified as
+well by using ``<converter:name>``.
+
+Variable parts are passed to the view function as keyword arguments.
+
+The following converters are available:
+
+=========== ===============================================
+`unicode` accepts any text without a slash (the default)
+`int` accepts integers
+`float` like `int` but for floating point values
+`path` like the default but also accepts slashes
+=========== ===============================================
+
+Here are some examples::
+
+ @app.route('/')
+ def index():
+ pass
+
+ @app.route('/<username>')
+ def show_user(username):
+ pass
+
+ @app.route('/post/<int:post_id>')
+ def show_post(post_id):
+ pass
+
+An important detail to keep in mind is how Flask deals with trailing
+slashes. The idea is to keep each URL unique so the following rules
+apply:
+
+1. If a rule ends with a slash and is requested without a slash by the
+ user, the user is automatically redirected to the same page with a
+ trailing slash attached.
+2. If a rule does not end with a trailing slash and the user requests the
+ page with a trailing slash, a 404 not found is raised.
+
+This is consistent with how web servers deal with static files. This
+also makes it possible to use relative link targets safely.
+
+You can also define multiple rules for the same function. They have to be
+unique however. Defaults can also be specified. Here for example is a
+definition for a URL that accepts an optional page::
+
+ @app.route('/users/', defaults={'page': 1})
+ @app.route('/users/page/<int:page>')
+ def show_users(page):
+ pass
+
+This specifies that ``/users/`` will be the URL for page one and
+``/users/page/N`` will be the URL for page `N`.
+
+Here are the parameters that :meth:`~flask.Flask.route` and
+:meth:`~flask.Flask.add_url_rule` accept. The only difference is that
+with the route parameter the view function is defined with the decorator
+instead of the `view_func` parameter.
+
+=============== ==========================================================
+`rule` the URL roule as string
+`endpoint` the endpoint for the registered URL rule. Flask itself
+ assumes that the name of the view function is the name
+ of the endpoint if not explicitly stated.
+`view_func` the function to call when serving a request to the
+ provided endpoint. If this is not provided one can
+ specify the function later by storing it in the
+ :attr:`~flask.Flask.view_functions` dictionary with the
+ endpoint as key.
+`defaults` A dictionary with defaults for this rule. See the
+ example above for how defaults work.
+`subdomain` specifies the rule for the subdomain in case subdomain
+ matching is in use. If not specified the default
+ subdomain is assumed.
+`**options` the options to be forwarded to the underlying
+ :class:`~werkzeug.routing.Rule` object. A change to
+ Werkzeug is handling of method options. methods is a list
+ of methods this rule should be limited to (`GET`, `POST`
+ etc.). By default a rule just listens for `GET` (and
+ implicitly `HEAD`). Starting with Flask 0.6, `OPTIONS` is
+ implicitly added and handled by the standard request
+ handling. They have to be specified as keyword arguments.
+=============== ==========================================================
+
+.. _view-func-options:
+
+View Function Options
+---------------------
+
+For internal usage the view functions can have some attributes attached to
+customize behavior the view function would normally not have control over.
+The following attributes can be provided optionally to either override
+some defaults to :meth:`~flask.Flask.add_url_rule` or general behavior:
+
+- `__name__`: The name of a function is by default used as endpoint. If
+ endpoint is provided explicitly this value is used. Additionally this
+ will be prefixed with the name of the blueprint by default which
+ cannot be customized from the function itself.
+
+- `methods`: If methods are not provided when the URL rule is added,
+ Flask will look on the view function object itself is an `methods`
+ attribute exists. If it does, it will pull the information for the
+ methods from there.
+
+- `provide_automatic_options`: if this attribute is set Flask will
+ either force enable or disable the automatic implementation of the
+ HTTP `OPTIONS` response. This can be useful when working with
+ decorators that want to customize the `OPTIONS` response on a per-view
+ basis.
+
+Full example::
+
+ def index():
+ if request.method == 'OPTIONS':
+ # custom options handling here
+ ...
+ return 'Hello World!'
+ index.provide_automatic_options = False
+ index.methods = ['GET', 'OPTIONS']
+
+ app.add_url_rule('/', index)
+
+.. versionadded:: 0.8
+ The `provide_automatic_options` functionality was added.
diff --git a/app/static/doc/flask-docs/_sources/becomingbig.txt b/app/static/doc/flask-docs/_sources/becomingbig.txt
new file mode 100644
index 0000000..20a0186
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/becomingbig.txt
@@ -0,0 +1,88 @@
+.. _becomingbig:
+
+Becoming Big
+============
+
+Your application is becoming more and more complex? If you suddenly
+realize that Flask does things in a way that does not work out for your
+application there are ways to deal with that.
+
+Flask is powered by Werkzeug and Jinja2, two libraries that are in use at
+a number of large websites out there and all Flask does is bring those
+two together. Being a microframework Flask does not do much more than
+combining existing libraries - there is not a lot of code involved.
+What that means for large applications is that it's very easy to take the
+code from Flask and put it into a new module within the applications and
+expand on that.
+
+Flask is designed to be extended and modified in a couple of different
+ways:
+
+- Flask extensions. For a lot of reusable functionality you can create
+ extensions. For extensions a number of hooks exist throughout Flask
+ with signals and callback functions.
+
+- Subclassing. The majority of functionality can be changed by creating
+ a new subclass of the :class:`~flask.Flask` class and overriding
+ methods provided for this exact purpose.
+
+- Forking. If nothing else works out you can just take the Flask
+ codebase at a given point and copy/paste it into your application
+ and change it. Flask is designed with that in mind and makes this
+ incredible easy. You just have to take the package and copy it
+ into your application's code and rename it (for example to
+ `framework`). Then you can start modifying the code in there.
+
+Why consider Forking?
+---------------------
+
+The majority of code of Flask is within Werkzeug and Jinja2. These
+libraries do the majority of the work. Flask is just the paste that glues
+those together. For every project there is the point where the underlying
+framework gets in the way (due to assumptions the original developers
+had). This is natural because if this would not be the case, the
+framework would be a very complex system to begin with which causes a
+steep learning curve and a lot of user frustration.
+
+This is not unique to Flask. Many people use patched and modified
+versions of their framework to counter shortcomings. This idea is also
+reflected in the license of Flask. You don't have to contribute any
+changes back if you decide to modify the framework.
+
+The downside of forking is of course that Flask extensions will most
+likely break because the new framework has a different import name.
+Furthermore integrating upstream changes can be a complex process,
+depending on the number of changes. Because of that, forking should be
+the very last resort.
+
+Scaling like a Pro
+------------------
+
+For many web applications the complexity of the code is less an issue than
+the scaling for the number of users or data entries expected. Flask by
+itself is only limited in terms of scaling by your application code, the
+data store you want to use and the Python implementation and webserver you
+are running on.
+
+Scaling well means for example that if you double the amount of servers
+you get about twice the performance. Scaling bad means that if you add a
+new server the application won't perform any better or would not even
+support a second server.
+
+There is only one limiting factor regarding scaling in Flask which are
+the context local proxies. They depend on context which in Flask is
+defined as being either a thread, process or greenlet. If your server
+uses some kind of concurrency that is not based on threads or greenlets,
+Flask will no longer be able to support these global proxies. However the
+majority of servers are using either threads, greenlets or separate
+processes to achieve concurrency which are all methods well supported by
+the underlying Werkzeug library.
+
+Dialogue with the Community
+---------------------------
+
+The Flask developers are very interested to keep everybody happy, so as
+soon as you find an obstacle in your way, caused by Flask, don't hesitate
+to contact the developers on the mailinglist or IRC channel. The best way
+for the Flask and Flask-extension developers to improve it for larger
+applications is getting feedback from users.
diff --git a/app/static/doc/flask-docs/_sources/blueprints.txt b/app/static/doc/flask-docs/_sources/blueprints.txt
new file mode 100644
index 0000000..9422fd0
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/blueprints.txt
@@ -0,0 +1,203 @@
+.. _blueprints:
+
+Modular Applications with Blueprints
+====================================
+
+.. versionadded:: 0.7
+
+Flask uses a concept of *blueprints* for making application components and
+supporting common patterns within an application or across applications.
+Blueprints can greatly simplify how large applications work and provide a
+central means for Flask extensions to register operations on applications.
+A :class:`Blueprint` object works similarly to a :class:`Flask`
+application object, but it is not actually an application. Rather it is a
+*blueprint* of how to construct or extend an application.
+
+Why Blueprints?
+---------------
+
+Blueprints in Flask are intended for these cases:
+
+* Factor an application into a set of blueprints. This is ideal for
+ larger applications; a project could instantiate an application object,
+ initialize several extensions, and register a collection of blueprints.
+* Register a blueprint on an application at a URL prefix and/or subdomain.
+ Parameters in the URL prefix/subdomain become common view arguments
+ (with defaults) across all view functions in the blueprint.
+* Register a blueprint multiple times on an application with different URL
+ rules.
+* Provide template filters, static files, templates, and other utilities
+ through blueprints. A blueprint does not have to implement applications
+ or view functions.
+* Register a blueprint on an application for any of these cases when
+ initializing a Flask extension.
+
+A blueprint in Flask is not a pluggable app because it is not actually an
+application -- it's a set of operations which can be registered on an
+application, even multiple times. Why not have multiple application
+objects? You can do that (see :ref:`app-dispatch`), but your applications
+will have separate configs and will be managed at the WSGI layer.
+
+Blueprints instead provide separation at the Flask level, share
+application config, and can change an application object as necessary with
+being registered. The downside is that you cannot unregister a blueprint
+once an application was created without having to destroy the whole
+application object.
+
+The Concept of Blueprints
+-------------------------
+
+The basic concept of blueprints is that they record operations to execute
+when registered on an application. Flask associates view functions with
+blueprints when dispatching requests and generating URLs from one endpoint
+to another.
+
+My First Blueprint
+------------------
+
+This is what a very basic blueprint looks like. In this case we want to
+implement a blueprint that does simple rendering of static templates::
+
+ from flask import Blueprint, render_template, abort
+ from jinja2 import TemplateNotFound
+
+ simple_page = Blueprint('simple_page', __name__)
+
+ @simple_page.route('/', defaults={'page': 'index'})
+ @simple_page.route('/<page>')
+ def show(page):
+ try:
+ return render_template('pages/%s.html' % page)
+ except TemplateNotFound:
+ abort(404)
+
+When you bind a function with the help of the ``@simple_page.route``
+decorator the blueprint will record the intention of registering the
+function `show` on the application when it's later registered.
+Additionally it will prefix the endpoint of the function with the
+name of the blueprint which was given to the :class:`Blueprint`
+constructor (in this case also ``simple_page``).
+
+Registering Blueprints
+----------------------
+
+So how do you register that blueprint? Like this::
+
+ from flask import Flask
+ from yourapplication.simple_page import simple_page
+
+ app = Flask(__name__)
+ app.register_blueprint(simple_page)
+
+If you check the rules registered on the application, you will find
+these::
+
+ [<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
+ <Rule '/<page>' (HEAD, OPTIONS, GET) -> simple_page.show>,
+ <Rule '/' (HEAD, OPTIONS, GET) -> simple_page.show>]
+
+The first one is obviously from the application ifself for the static
+files. The other two are for the `show` function of the ``simple_page``
+blueprint. As you can see, they are also prefixed with the name of the
+blueprint and separated by a dot (``.``).
+
+Blueprints however can also be mounted at different locations::
+
+ app.register_blueprint(simple_page, url_prefix='/pages')
+
+And sure enough, these are the generated rules::
+
+ [<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
+ <Rule '/pages/<page>' (HEAD, OPTIONS, GET) -> simple_page.show>,
+ <Rule '/pages/' (HEAD, OPTIONS, GET) -> simple_page.show>]
+
+On top of that you can register blueprints multiple times though not every
+blueprint might respond properly to that. In fact it depends on how the
+blueprint is implemented if it can be mounted more than once.
+
+Blueprint Resources
+-------------------
+
+Blueprints can provide resources as well. Sometimes you might want to
+introduce a blueprint only for the resources it provides.
+
+Blueprint Resource Folder
+`````````````````````````
+
+Like for regular applications, blueprints are considered to be contained
+in a folder. While multiple blueprints can originate from the same folder,
+it does not have to be the case and it's usually not recommended.
+
+The folder is inferred from the second argument to :class:`Blueprint` which
+is usually `__name__`. This argument specifies what logical Python
+module or package corresponds to the blueprint. If it points to an actual
+Python package that package (which is a folder on the filesystem) is the
+resource folder. If it's a module, the package the module is contained in
+will be the resource folder. You can access the
+:attr:`Blueprint.root_path` property to see what the resource folder is::
+
+ >>> simple_page.root_path
+ '/Users/username/TestProject/yourapplication'
+
+To quickly open sources from this folder you can use the
+:meth:`~Blueprint.open_resource` function::
+
+ with simple_page.open_resource('static/style.css') as f:
+ code = f.read()
+
+Static Files
+````````````
+
+A blueprint can expose a folder with static files by providing a path to a
+folder on the filesystem via the `static_folder` keyword argument. It can
+either be an absolute path or one relative to the folder of the
+blueprint::
+
+ admin = Blueprint('admin', __name__, static_folder='static')
+
+By default the rightmost part of the path is where it is exposed on the
+web. Because the folder is called ``static`` here it will be available at
+the location of the blueprint + ``/static``. Say the blueprint is
+registered for ``/admin`` the static folder will be at ``/admin/static``.
+
+The endpoint is named `blueprint_name.static` so you can generate URLs to
+it like you would do to the static folder of the application::
+
+ url_for('admin.static', filename='style.css')
+
+Templates
+`````````
+
+If you want the blueprint to expose templates you can do that by providing
+the `template_folder` parameter to the :class:`Blueprint` constructor::
+
+ admin = Blueprint('admin', __name__, template_folder='templates')
+
+As for static files, the path can be absolute or relative to the blueprint
+resource folder. The template folder is added to the searchpath of
+templates but with a lower priority than the actual application's template
+folder. That way you can easily override templates that a blueprint
+provides in the actual application.
+
+So if you have a blueprint in the folder ``yourapplication/admin`` and you
+want to render the template ``'admin/index.html'`` and you have provided
+``templates`` as a `template_folder` you will have to create a file like
+this: ``yourapplication/admin/templates/admin/index.html``.
+
+Building URLs
+-------------
+
+If you want to link from one page to another you can use the
+:func:`url_for` function just like you normally would do just that you
+prefix the URL endpoint with the name of the blueprint and a dot (``.``)::
+
+ url_for('admin.index')
+
+Additionally if you are in a view function of a blueprint or a rendered
+template and you want to link to another endpoint of the same blueprint,
+you can use relative redirects by prefixing the endpoint with a dot only::
+
+ url_for('.index')
+
+This will link to ``admin.index`` for instance in case the current request
+was dispatched to any other admin blueprint endpoint.
diff --git a/app/static/doc/flask-docs/_sources/changelog.txt b/app/static/doc/flask-docs/_sources/changelog.txt
new file mode 100644
index 0000000..d6c5f48
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/changelog.txt
@@ -0,0 +1 @@
+.. include:: ../CHANGES
diff --git a/app/static/doc/flask-docs/_sources/config.txt b/app/static/doc/flask-docs/_sources/config.txt
new file mode 100644
index 0000000..ca724dc
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/config.txt
@@ -0,0 +1,384 @@
+.. _config:
+
+Configuration Handling
+======================
+
+.. versionadded:: 0.3
+
+Applications need some kind of configuration. There are different settings
+you might want to change depending on the application environment like
+toggling the debug mode, setting the secret key, and other such
+environment-specific things.
+
+The way Flask is designed usually requires the configuration to be
+available when the application starts up. You can hardcode the
+configuration in the code, which for many small applications is not
+actually that bad, but there are better ways.
+
+Independent of how you load your config, there is a config object
+available which holds the loaded configuration values:
+The :attr:`~flask.Flask.config` attribute of the :class:`~flask.Flask`
+object. This is the place where Flask itself puts certain configuration
+values and also where extensions can put their configuration values. But
+this is also where you can have your own configuration.
+
+Configuration Basics
+--------------------
+
+The :attr:`~flask.Flask.config` is actually a subclass of a dictionary and
+can be modified just like any dictionary::
+
+ app = Flask(__name__)
+ app.config['DEBUG'] = True
+
+Certain configuration values are also forwarded to the
+:attr:`~flask.Flask` object so you can read and write them from there::
+
+ app.debug = True
+
+To update multiple keys at once you can use the :meth:`dict.update`
+method::
+
+ app.config.update(
+ DEBUG=True,
+ SECRET_KEY='...'
+ )
+
+Builtin Configuration Values
+----------------------------
+
+The following configuration values are used internally by Flask:
+
+.. tabularcolumns:: |p{6.5cm}|p{8.5cm}|
+
+================================= =========================================
+``DEBUG`` enable/disable debug mode
+``TESTING`` enable/disable testing mode
+``PROPAGATE_EXCEPTIONS`` explicitly enable or disable the
+ propagation of exceptions. If not set or
+ explicitly set to `None` this is
+ implicitly true if either `TESTING` or
+ `DEBUG` is true.
+``PRESERVE_CONTEXT_ON_EXCEPTION`` By default if the application is in
+ debug mode the request context is not
+ popped on exceptions to enable debuggers
+ to introspect the data. This can be
+ disabled by this key. You can also use
+ this setting to force-enable it for non
+ debug execution which might be useful to
+ debug production applications (but also
+ very risky).
+``SECRET_KEY`` the secret key
+``SESSION_COOKIE_NAME`` the name of the session cookie
+``SESSION_COOKIE_DOMAIN`` the domain for the session cookie. If
+ this is not set, the cookie will be
+ valid for all subdomains of
+ ``SERVER_NAME``.
+``SESSION_COOKIE_PATH`` the path for the session cookie. If
+ this is not set the cookie will be valid
+ for all of ``APPLICATION_ROOT`` or if
+ that is not set for ``'/'``.
+``SESSION_COOKIE_HTTPONLY`` controls if the cookie should be set
+ with the httponly flag. Defaults to
+ `True`.
+``SESSION_COOKIE_SECURE`` controls if the cookie should be set
+ with the secure flag. Defaults to
+ `False`.
+``PERMANENT_SESSION_LIFETIME`` the lifetime of a permanent session as
+ :class:`datetime.timedelta` object.
+ Starting with Flask 0.8 this can also be
+ an integer representing seconds.
+``USE_X_SENDFILE`` enable/disable x-sendfile
+``LOGGER_NAME`` the name of the logger
+``SERVER_NAME`` the name and port number of the server.
+ Required for subdomain support (e.g.:
+ ``'myapp.dev:5000'``) Note that
+ localhost does not support subdomains so
+ setting this to “localhost” does not
+ help.
+``APPLICATION_ROOT`` If the application does not occupy
+ a whole domain or subdomain this can
+ be set to the path where the application
+ is configured to live. This is for
+ session cookie as path value. If
+ domains are used, this should be
+ ``None``.
+``MAX_CONTENT_LENGTH`` If set to a value in bytes, Flask will
+ reject incoming requests with a
+ content length greater than this by
+ returning a 413 status code.
+``TRAP_HTTP_EXCEPTIONS`` If this is set to ``True`` Flask will
+ not execute the error handlers of HTTP
+ exceptions but instead treat the
+ exception like any other and bubble it
+ through the exception stack. This is
+ helpful for hairy debugging situations
+ where you have to find out where an HTTP
+ exception is coming from.
+``TRAP_BAD_REQUEST_ERRORS`` Werkzeug's internal data structures that
+ deal with request specific data will
+ raise special key errors that are also
+ bad request exceptions. Likewise many
+ operations can implicitly fail with a
+ BadRequest exception for consistency.
+ Since it's nice for debugging to know
+ why exactly it failed this flag can be
+ used to debug those situations. If this
+ config is set to ``True`` you will get
+ a regular traceback instead.
+================================= =========================================
+
+.. admonition:: More on ``SERVER_NAME``
+
+ The ``SERVER_NAME`` key is used for the subdomain support. Because
+ Flask cannot guess the subdomain part without the knowledge of the
+ actual server name, this is required if you want to work with
+ subdomains. This is also used for the session cookie.
+
+ Please keep in mind that not only Flask has the problem of not knowing
+ what subdomains are, your web browser does as well. Most modern web
+ browsers will not allow cross-subdomain cookies to be set on a
+ server name without dots in it. So if your server name is
+ ``'localhost'`` you will not be able to set a cookie for
+ ``'localhost'`` and every subdomain of it. Please chose a different
+ server name in that case, like ``'myapplication.local'`` and add
+ this name + the subdomains you want to use into your host config
+ or setup a local `bind`_.
+
+.. _bind: https://www.isc.org/software/bind
+
+.. versionadded:: 0.4
+ ``LOGGER_NAME``
+
+.. versionadded:: 0.5
+ ``SERVER_NAME``
+
+.. versionadded:: 0.6
+ ``MAX_CONTENT_LENGTH``
+
+.. versionadded:: 0.7
+ ``PROPAGATE_EXCEPTIONS``, ``PRESERVE_CONTEXT_ON_EXCEPTION``
+
+.. versionadded:: 0.8
+ ``TRAP_BAD_REQUEST_ERRORS``, ``TRAP_HTTP_EXCEPTIONS``,
+ ``APPLICATION_ROOT``, ``SESSION_COOKIE_DOMAIN``,
+ ``SESSION_COOKIE_PATH``, ``SESSION_COOKIE_HTTPONLY``,
+ ``SESSION_COOKIE_SECURE``
+
+Configuring from Files
+----------------------
+
+Configuration becomes more useful if you can store it in a separate file,
+ideally located outside the actual application package. This makes
+packaging and distributing your application possible via various package
+handling tools (:ref:`distribute-deployment`) and finally modifying the
+configuration file afterwards.
+
+So a common pattern is this::
+
+ app = Flask(__name__)
+ app.config.from_object('yourapplication.default_settings')
+ app.config.from_envvar('YOURAPPLICATION_SETTINGS')
+
+This first loads the configuration from the
+`yourapplication.default_settings` module and then overrides the values
+with the contents of the file the :envvar:`YOURAPPLICATION_SETTINGS`
+environment variable points to. This environment variable can be set on
+Linux or OS X with the export command in the shell before starting the
+server::
+
+ $ export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
+ $ python run-app.py
+ * Running on http://127.0.0.1:5000/
+ * Restarting with reloader...
+
+On Windows systems use the `set` builtin instead::
+
+ >set YOURAPPLICATION_SETTINGS=\path\to\settings.cfg
+
+The configuration files themselves are actual Python files. Only values
+in uppercase are actually stored in the config object later on. So make
+sure to use uppercase letters for your config keys.
+
+Here is an example of a configuration file::
+
+ # Example configuration
+ DEBUG = False
+ SECRET_KEY = '?\xbf,\xb4\x8d\xa3"<\x9c\xb0@\x0f5\xab,w\xee\x8d$0\x13\x8b83'
+
+Make sure to load the configuration very early on, so that extensions have
+the ability to access the configuration when starting up. There are other
+methods on the config object as well to load from individual files. For a
+complete reference, read the :class:`~flask.Config` object's
+documentation.
+
+
+Configuration Best Practices
+----------------------------
+
+The downside with the approach mentioned earlier is that it makes testing
+a little harder. There is no single 100% solution for this problem in
+general, but there are a couple of things you can keep in mind to improve
+that experience:
+
+1. create your application in a function and register blueprints on it.
+ That way you can create multiple instances of your application with
+ different configurations attached which makes unittesting a lot
+ easier. You can use this to pass in configuration as needed.
+
+2. Do not write code that needs the configuration at import time. If you
+ limit yourself to request-only accesses to the configuration you can
+ reconfigure the object later on as needed.
+
+
+Development / Production
+------------------------
+
+Most applications need more than one configuration. There should be at
+least separate configurations for the production server and the one used
+during development. The easiest way to handle this is to use a default
+configuration that is always loaded and part of the version control, and a
+separate configuration that overrides the values as necessary as mentioned
+in the example above::
+
+ app = Flask(__name__)
+ app.config.from_object('yourapplication.default_settings')
+ app.config.from_envvar('YOURAPPLICATION_SETTINGS')
+
+Then you just have to add a separate `config.py` file and export
+``YOURAPPLICATION_SETTINGS=/path/to/config.py`` and you are done. However
+there are alternative ways as well. For example you could use imports or
+subclassing.
+
+What is very popular in the Django world is to make the import explicit in
+the config file by adding an ``from yourapplication.default_settings
+import *`` to the top of the file and then overriding the changes by hand.
+You could also inspect an environment variable like
+``YOURAPPLICATION_MODE`` and set that to `production`, `development` etc
+and import different hardcoded files based on that.
+
+An interesting pattern is also to use classes and inheritance for
+configuration::
+
+ class Config(object):
+ DEBUG = False
+ TESTING = False
+ DATABASE_URI = 'sqlite://:memory:'
+
+ class ProductionConfig(Config):
+ DATABASE_URI = 'mysql://user@localhost/foo'
+
+ class DevelopmentConfig(Config):
+ DEBUG = True
+
+ class TestingConfig(Config):
+ TESTING = True
+
+To enable such a config you just have to call into
+:meth:`~flask.Config.from_object`::
+
+ app.config.from_object('configmodule.ProductionConfig')
+
+There are many different ways and it's up to you how you want to manage
+your configuration files. However here a list of good recommendations:
+
+- keep a default configuration in version control. Either populate the
+ config with this default configuration or import it in your own
+ configuration files before overriding values.
+- use an environment variable to switch between the configurations.
+ This can be done from outside the Python interpreter and makes
+ development and deployment much easier because you can quickly and
+ easily switch between different configs without having to touch the
+ code at all. If you are working often on different projects you can
+ even create your own script for sourcing that activates a virtualenv
+ and exports the development configuration for you.
+- Use a tool like `fabric`_ in production to push code and
+ configurations separately to the production server(s). For some
+ details about how to do that, head over to the
+ :ref:`fabric-deployment` pattern.
+
+.. _fabric: http://fabfile.org/
+
+
+.. _instance-folders:
+
+Instance Folders
+----------------
+
+.. versionadded:: 0.8
+
+Flask 0.8 introduces instance folders. Flask for a long time made it
+possible to refer to paths relative to the application's folder directly
+(via :attr:`Flask.root_path`). This was also how many developers loaded
+configurations stored next to the application. Unfortunately however this
+only works well if applications are not packages in which case the root
+path refers to the contents of the package.
+
+With Flask 0.8 a new attribute was introduced:
+:attr:`Flask.instance_path`. It refers to a new concept called the
+“instance folder”. The instance folder is designed to not be under
+version control and be deployment specific. It's the perfect place to
+drop things that either change at runtime or configuration files.
+
+You can either explicitly provide the path of the instance folder when
+creating the Flask application or you can let Flask autodetect the
+instance folder. For explicit configuration use the `instance_path`
+parameter::
+
+ app = Flask(__name__, instance_path='/path/to/instance/folder')
+
+Please keep in mind that this path *must* be absolute when provided.
+
+If the `instance_path` parameter is not provided the following default
+locations are used:
+
+- Uninstalled module::
+
+ /myapp.py
+ /instance
+
+- Uninstalled package::
+
+ /myapp
+ /__init__.py
+ /instance
+
+- Installed module or package::
+
+ $PREFIX/lib/python2.X/site-packages/myapp
+ $PREFIX/var/myapp-instance
+
+ ``$PREFIX`` is the prefix of your Python installation. This can be
+ ``/usr`` or the path to your virtualenv. You can print the value of
+ ``sys.prefix`` to see what the prefix is set to.
+
+Since the config object provided loading of configuration files from
+relative filenames we made it possible to change the loading via filenames
+to be relative to the instance path if wanted. The behavior of relative
+paths in config files can be flipped between “relative to the application
+root” (the default) to “relative to instance folder” via the
+`instance_relative_config` switch to the application constructor::
+
+ app = Flask(__name__, instance_relative_config=True)
+
+Here is a full example of how to configure Flask to preload the config
+from a module and then override the config from a file in the config
+folder if it exists::
+
+ app = Flask(__name__, instance_relative_config=True)
+ app.config.from_object('yourapplication.default_settings')
+ app.config.from_pyfile('application.cfg', silent=True)
+
+The path to the instance folder can be found via the
+:attr:`Flask.instance_path`. Flask also provides a shortcut to open a
+file from the instance folder with :meth:`Flask.open_instance_resource`.
+
+Example usage for both::
+
+ filename = os.path.join(app.instance_root, 'application.cfg')
+ with open(filename) as f:
+ config = f.read()
+
+ # or via open_instance_resource:
+ with app.open_instance_resource('application.cfg') as f:
+ config = f.read()
diff --git a/app/static/doc/flask-docs/_sources/deploying/cgi.txt b/app/static/doc/flask-docs/_sources/deploying/cgi.txt
new file mode 100644
index 0000000..a2fba90
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/cgi.txt
@@ -0,0 +1,46 @@
+CGI
+===
+
+If all other deployment methods do not work, CGI will work for sure.
+CGI is supported by all major servers but usually has a sub-optimal
+performance.
+
+This is also the way you can use a Flask application on Google's `App
+Engine`_, where execution happens in a CGI-like environment.
+
+.. admonition:: Watch Out
+
+ Please make sure in advance that any ``app.run()`` calls you might
+ have in your application file are inside an ``if __name__ ==
+ '__main__':`` block or moved to a separate file. Just make sure it's
+ not called because this will always start a local WSGI server which
+ we do not want if we deploy that application to CGI / app engine.
+
+Creating a `.cgi` file
+----------------------
+
+First you need to create the CGI application file. Let's call it
+`yourapplication.cgi`::
+
+ #!/usr/bin/python
+ from wsgiref.handlers import CGIHandler
+ from yourapplication import app
+
+ CGIHandler().run(app)
+
+Server Setup
+------------
+
+Usually there are two ways to configure the server. Either just copy the
+`.cgi` into a `cgi-bin` (and use `mod_rewrite` or something similar to
+rewrite the URL) or let the server point to the file directly.
+
+In Apache for example you can put a like like this into the config:
+
+.. sourcecode:: apache
+
+ ScriptAlias /app /path/to/the/application.cgi
+
+For more information consult the documentation of your webserver.
+
+.. _App Engine: http://code.google.com/appengine/
diff --git a/app/static/doc/flask-docs/_sources/deploying/fastcgi.txt b/app/static/doc/flask-docs/_sources/deploying/fastcgi.txt
new file mode 100644
index 0000000..6dace1a
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/fastcgi.txt
@@ -0,0 +1,164 @@
+.. _deploying-fastcgi:
+
+FastCGI
+=======
+
+FastCGI is a deployment option on servers like `nginx`_, `lighttpd`_,
+and `cherokee`_; see :ref:`deploying-uwsgi` and
+:ref:`deploying-other-servers` for other options. To use your WSGI
+application with any of them you will need a FastCGI server first. The
+most popular one is `flup`_ which we will use for this guide. Make sure
+to have it installed to follow along.
+
+.. admonition:: Watch Out
+
+ Please make sure in advance that any ``app.run()`` calls you might
+ have in your application file are inside an ``if __name__ ==
+ '__main__':`` block or moved to a separate file. Just make sure it's
+ not called because this will always start a local WSGI server which
+ we do not want if we deploy that application to FastCGI.
+
+Creating a `.fcgi` file
+-----------------------
+
+First you need to create the FastCGI server file. Let's call it
+`yourapplication.fcgi`::
+
+ #!/usr/bin/python
+ from flup.server.fcgi import WSGIServer
+ from yourapplication import app
+
+ if __name__ == '__main__':
+ WSGIServer(app).run()
+
+This is enough for Apache to work, however nginx and older versions of
+lighttpd need a socket to be explicitly passed to communicate with the
+FastCGI server. For that to work you need to pass the path to the
+socket to the :class:`~flup.server.fcgi.WSGIServer`::
+
+ WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
+
+The path has to be the exact same path you define in the server
+config.
+
+Save the `yourapplication.fcgi` file somewhere you will find it again.
+It makes sense to have that in `/var/www/yourapplication` or something
+similar.
+
+Make sure to set the executable bit on that file so that the servers
+can execute it:
+
+.. sourcecode:: text
+
+ # chmod +x /var/www/yourapplication/yourapplication.fcgi
+
+Configuring lighttpd
+--------------------
+
+A basic FastCGI configuration for lighttpd looks like that::
+
+ fastcgi.server = ("/yourapplication.fcgi" =>
+ ((
+ "socket" => "/tmp/yourapplication-fcgi.sock",
+ "bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
+ "check-local" => "disable",
+ "max-procs" => 1
+ ))
+ )
+
+ alias.url = (
+ "/static/" => "/path/to/your/static"
+ )
+
+ url.rewrite-once = (
+ "^(/static.*)$" => "$1",
+ "^(/.*)$" => "/yourapplication.fcgi$1"
+
+Remember to enable the FastCGI, alias and rewrite modules. This
+configuration binds the application to `/yourapplication`. If you want
+the application to work in the URL root you have to work around a
+lighttpd bug with the
+:class:`~werkzeug.contrib.fixers.LighttpdCGIRootFix` middleware.
+
+Make sure to apply it only if you are mounting the application the URL
+root. Also, see the Lighty docs for more information on `FastCGI and
+Python <http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModFastCGI>`_
+(note that explicitly passing a socket to run() is no longer necessary).
+
+
+Configuring nginx
+-----------------
+
+Installing FastCGI applications on nginx is a bit different because by
+default no FastCGI parameters are forwarded.
+
+A basic flask FastCGI configuration for nginx looks like this::
+
+ location = /yourapplication { rewrite ^ /yourapplication/ last; }
+ location /yourapplication { try_files $uri @yourapplication; }
+ location @yourapplication {
+ include fastcgi_params;
+ fastcgi_split_path_info ^(/yourapplication)(.*)$;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ fastcgi_param SCRIPT_NAME $fastcgi_script_name;
+ fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
+ }
+
+This configuration binds the application to `/yourapplication`. If you
+want to have it in the URL root it's a bit simpler because you don't
+have to figure out how to calculate `PATH_INFO` and `SCRIPT_NAME`::
+
+ location / { try_files $uri @yourapplication; }
+ location @yourapplication {
+ include fastcgi_params;
+ fastcgi_param PATH_INFO $fastcgi_script_name;
+ fastcgi_param SCRIPT_NAME "";
+ fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
+ }
+
+Running FastCGI Processes
+-------------------------
+
+Since Nginx and others do not load FastCGI apps, you have to do it by
+yourself. `Supervisor can manage FastCGI processes.
+<http://supervisord.org/configuration.html#fcgi-program-x-section-settings>`_
+You can look around for other FastCGI process managers or write a script
+to run your `.fcgi` file at boot, e.g. using a SysV ``init.d`` script.
+For a temporary solution, you can always run the ``.fcgi`` script inside
+GNU screen. See ``man screen`` for details, and note that this is a
+manual solution which does not persist across system restart::
+
+ $ screen
+ $ /var/www/yourapplication/yourapplication.fcgi
+
+Debugging
+---------
+
+FastCGI deployments tend to be hard to debug on most webservers. Very
+often the only thing the server log tells you is something along the
+lines of "premature end of headers". In order to debug the application
+the only thing that can really give you ideas why it breaks is switching
+to the correct user and executing the application by hand.
+
+This example assumes your application is called `application.fcgi` and
+that your webserver user is `www-data`::
+
+ $ su www-data
+ $ cd /var/www/yourapplication
+ $ python application.fcgi
+ Traceback (most recent call last):
+ File "yourapplication.fcgi", line 4, in <module>
+ ImportError: No module named yourapplication
+
+In this case the error seems to be "yourapplication" not being on the
+python path. Common problems are:
+
+- Relative paths being used. Don't rely on the current working directory
+- The code depending on environment variables that are not set by the
+ web server.
+- Different python interpreters being used.
+
+.. _nginx: http://nginx.org/
+.. _lighttpd: http://www.lighttpd.net/
+.. _cherokee: http://www.cherokee-project.com/
+.. _flup: http://trac.saddi.com/flup
diff --git a/app/static/doc/flask-docs/_sources/deploying/index.txt b/app/static/doc/flask-docs/_sources/deploying/index.txt
new file mode 100644
index 0000000..d258df8
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/index.txt
@@ -0,0 +1,23 @@
+.. _deployment:
+
+Deployment Options
+==================
+
+Depending on what you have available there are multiple ways to run
+Flask applications. You can use the builtin server during development,
+but you should use a full deployment option for production applications.
+(Do not use the builtin development server in production.) Several
+options are available and documented here.
+
+If you have a different WSGI server look up the server documentation
+about how to use a WSGI app with it. Just remember that your
+:class:`Flask` application object is the actual WSGI application.
+
+.. toctree::
+ :maxdepth: 2
+
+ mod_wsgi
+ cgi
+ fastcgi
+ uwsgi
+ others
diff --git a/app/static/doc/flask-docs/_sources/deploying/mod_wsgi.txt b/app/static/doc/flask-docs/_sources/deploying/mod_wsgi.txt
new file mode 100644
index 0000000..c85ed64
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/mod_wsgi.txt
@@ -0,0 +1,167 @@
+.. _mod_wsgi-deployment:
+
+mod_wsgi (Apache)
+=================
+
+If you are using the `Apache`_ webserver, consider using `mod_wsgi`_.
+
+.. admonition:: Watch Out
+
+ Please make sure in advance that any ``app.run()`` calls you might
+ have in your application file are inside an ``if __name__ ==
+ '__main__':`` block or moved to a separate file. Just make sure it's
+ not called because this will always start a local WSGI server which
+ we do not want if we deploy that application to mod_wsgi.
+
+.. _Apache: http://httpd.apache.org/
+
+Installing `mod_wsgi`
+---------------------
+
+If you don't have `mod_wsgi` installed yet you have to either install it
+using a package manager or compile it yourself. The mod_wsgi
+`installation instructions`_ cover source installations on UNIX systems.
+
+If you are using Ubuntu/Debian you can apt-get it and activate it as
+follows:
+
+.. sourcecode:: text
+
+ # apt-get install libapache2-mod-wsgi
+
+On FreeBSD install `mod_wsgi` by compiling the `www/mod_wsgi` port or by
+using pkg_add:
+
+.. sourcecode:: text
+
+ # pkg_add -r mod_wsgi
+
+If you are using pkgsrc you can install `mod_wsgi` by compiling the
+`www/ap2-wsgi` package.
+
+If you encounter segfaulting child processes after the first apache
+reload you can safely ignore them. Just restart the server.
+
+Creating a `.wsgi` file
+-----------------------
+
+To run your application you need a `yourapplication.wsgi` file. This file
+contains the code `mod_wsgi` is executing on startup to get the application
+object. The object called `application` in that file is then used as
+application.
+
+For most applications the following file should be sufficient::
+
+ from yourapplication import app as application
+
+If you don't have a factory function for application creation but a singleton
+instance you can directly import that one as `application`.
+
+Store that file somewhere that you will find it again (e.g.:
+`/var/www/yourapplication`) and make sure that `yourapplication` and all
+the libraries that are in use are on the python load path. If you don't
+want to install it system wide consider using a `virtual python`_
+instance.
+
+Configuring Apache
+------------------
+
+The last thing you have to do is to create an Apache configuration file
+for your application. In this example we are telling `mod_wsgi` to
+execute the application under a different user for security reasons:
+
+.. sourcecode:: apache
+
+ <VirtualHost *>
+ ServerName example.com
+
+ WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
+ WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi
+
+ <Directory /var/www/yourapplication>
+ WSGIProcessGroup yourapplication
+ WSGIApplicationGroup %{GLOBAL}
+ Order deny,allow
+ Allow from all
+ </Directory>
+ </VirtualHost>
+
+For more information consult the `mod_wsgi wiki`_.
+
+.. _mod_wsgi: http://code.google.com/p/modwsgi/
+.. _installation instructions: http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
+.. _virtual python: http://pypi.python.org/pypi/virtualenv
+.. _mod_wsgi wiki: http://code.google.com/p/modwsgi/wiki/
+
+Troubleshooting
+---------------
+
+If your application does not run, follow this guide to troubleshoot:
+
+**Problem:** application does not run, errorlog shows SystemExit ignored
+ You have a ``app.run()`` call in your application file that is not
+ guarded by an ``if __name__ == '__main__':`` condition. Either
+ remove that :meth:`~flask.Flask.run` call from the file and move it
+ into a separate `run.py` file or put it into such an if block.
+
+**Problem:** application gives permission errors
+ Probably caused by your application running as the wrong user. Make
+ sure the folders the application needs access to have the proper
+ privileges set and the application runs as the correct user
+ (``user`` and ``group`` parameter to the `WSGIDaemonProcess`
+ directive)
+
+**Problem:** application dies with an error on print
+ Keep in mind that mod_wsgi disallows doing anything with
+ :data:`sys.stdout` and :data:`sys.stderr`. You can disable this
+ protection from the config by setting the `WSGIRestrictStdout` to
+ ``off``:
+
+ .. sourcecode:: apache
+
+ WSGIRestrictStdout Off
+
+ Alternatively you can also replace the standard out in the .wsgi file
+ with a different stream::
+
+ import sys
+ sys.stdout = sys.stderr
+
+**Problem:** accessing resources gives IO errors
+ Your application probably is a single .py file you symlinked into
+ the site-packages folder. Please be aware that this does not work,
+ instead you either have to put the folder into the pythonpath the
+ file is stored in, or convert your application into a package.
+
+ The reason for this is that for non-installed packages, the module
+ filename is used to locate the resources and for symlinks the wrong
+ filename is picked up.
+
+Support for Automatic Reloading
+-------------------------------
+
+To help deployment tools you can activate support for automatic
+reloading. Whenever something changes the `.wsgi` file, `mod_wsgi` will
+reload all the daemon processes for us.
+
+For that, just add the following directive to your `Directory` section:
+
+.. sourcecode:: apache
+
+ WSGIScriptReloading On
+
+Working with Virtual Environments
+---------------------------------
+
+Virtual environments have the advantage that they never install the
+required dependencies system wide so you have a better control over what
+is used where. If you want to use a virtual environment with mod_wsgi
+you have to modify your `.wsgi` file slightly.
+
+Add the following lines to the top of your `.wsgi` file::
+
+ activate_this = '/path/to/env/bin/activate_this.py'
+ execfile(activate_this, dict(__file__=activate_this))
+
+This sets up the load paths according to the settings of the virtual
+environment. Keep in mind that the path has to be absolute.
diff --git a/app/static/doc/flask-docs/_sources/deploying/others.txt b/app/static/doc/flask-docs/_sources/deploying/others.txt
new file mode 100644
index 0000000..6f3e5cc
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/others.txt
@@ -0,0 +1,102 @@
+.. _deploying-other-servers:
+
+Other Servers
+=============
+
+There are popular servers written in Python that allow the execution of WSGI
+applications as well. These servers stand alone when they run; you can proxy
+to them from your web server.
+
+Tornado
+--------
+
+`Tornado`_ is an open source version of the scalable, non-blocking web
+server and tools that power `FriendFeed`_. Because it is non-blocking and
+uses epoll, it can handle thousands of simultaneous standing connections,
+which means it is ideal for real-time web services. Integrating this
+service with Flask is a trivial task::
+
+ from tornado.wsgi import WSGIContainer
+ from tornado.httpserver import HTTPServer
+ from tornado.ioloop import IOLoop
+ from yourapplication import app
+
+ http_server = HTTPServer(WSGIContainer(app))
+ http_server.listen(5000)
+ IOLoop.instance().start()
+
+
+.. _Tornado: http://www.tornadoweb.org/
+.. _FriendFeed: http://friendfeed.com/
+
+Gevent
+-------
+
+`Gevent`_ is a coroutine-based Python networking library that uses
+`greenlet`_ to provide a high-level synchronous API on top of `libevent`_
+event loop::
+
+ from gevent.wsgi import WSGIServer
+ from yourapplication import app
+
+ http_server = WSGIServer(('', 5000), app)
+ http_server.serve_forever()
+
+.. _Gevent: http://www.gevent.org/
+.. _greenlet: http://codespeak.net/py/0.9.2/greenlet.html
+.. _libevent: http://monkey.org/~provos/libevent/
+
+Gunicorn
+--------
+
+`Gunicorn`_ 'Green Unicorn' is a WSGI HTTP Server for UNIX. It's a pre-fork
+worker model ported from Ruby's Unicorn project. It supports both `eventlet`_
+and `greenlet`_. Running a Flask application on this server is quite simple::
+
+ gunicorn myproject:app
+
+`Gunicorn`_ provides many command-line options -- see ``gunicorn -h``.
+For example, to run a Flask application with 4 worker processes (``-w
+4``) binding to localhost port 4000 (``-b 127.0.0.1:4000``)::
+
+ gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
+
+.. _Gunicorn: http://gunicorn.org/
+.. _eventlet: http://eventlet.net/
+.. _greenlet: http://codespeak.net/py/0.9.2/greenlet.html
+
+Proxy Setups
+------------
+
+If you deploy your application using one of these servers behind an HTTP
+proxy you will need to rewrite a few headers in order for the
+application to work. The two problematic values in the WSGI environment
+usually are `REMOTE_ADDR` and `HTTP_HOST`. Werkzeug ships a fixer that
+will solve some common setups, but you might want to write your own WSGI
+middleware for specific setups.
+
+The most common setup invokes the host being set from `X-Forwarded-Host`
+and the remote address from `X-Forwarded-For`::
+
+ from werkzeug.contrib.fixers import ProxyFix
+ app.wsgi_app = ProxyFix(app.wsgi_app)
+
+Please keep in mind that it is a security issue to use such a middleware
+in a non-proxy setup because it will blindly trust the incoming
+headers which might be forged by malicious clients.
+
+If you want to rewrite the headers from another header, you might want to
+use a fixer like this::
+
+ class CustomProxyFix(object):
+
+ def __init__(self, app):
+ self.app = app
+
+ def __call__(self, environ, start_response):
+ host = environ.get('HTTP_X_FHOST', '')
+ if host:
+ environ['HTTP_HOST'] = host
+ return self.app(environ, start_response)
+
+ app.wsgi_app = CustomProxyFix(app.wsgi_app)
diff --git a/app/static/doc/flask-docs/_sources/deploying/uwsgi.txt b/app/static/doc/flask-docs/_sources/deploying/uwsgi.txt
new file mode 100644
index 0000000..bdee15b
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/deploying/uwsgi.txt
@@ -0,0 +1,68 @@
+.. _deploying-uwsgi:
+
+uWSGI
+=====
+
+uWSGI is a deployment option on servers like `nginx`_, `lighttpd`_, and
+`cherokee`_; see :ref:`deploying-fastcgi` and
+:ref:`deploying-other-servers` for other options. To use your WSGI
+application with uWSGI protocol you will need a uWSGI server
+first. uWSGI is both a protocol and an application server; the
+application server can serve uWSGI, FastCGI, and HTTP protocols.
+
+The most popular uWSGI server is `uwsgi`_, which we will use for this
+guide. Make sure to have it installed to follow along.
+
+.. admonition:: Watch Out
+
+ Please make sure in advance that any ``app.run()`` calls you might
+ have in your application file are inside an ``if __name__ ==
+ '__main__':`` block or moved to a separate file. Just make sure it's
+ not called because this will always start a local WSGI server which
+ we do not want if we deploy that application to uWSGI.
+
+Starting your app with uwsgi
+----------------------------
+
+`uwsgi` is designed to operate on WSGI callables found in python modules.
+
+Given a flask application in myapp.py, use the following command:
+
+.. sourcecode:: text
+
+ $ uwsgi -s /tmp/uwsgi.sock --module myapp --callable app
+
+Or, if you prefer:
+
+.. sourcecode:: text
+
+ $ uwsgi -s /tmp/uwsgi.sock -w myapp:app
+
+Configuring nginx
+-----------------
+
+A basic flask uWSGI configuration for nginx looks like this::
+
+ location = /yourapplication { rewrite ^ /yourapplication/; }
+ location /yourapplication { try_files $uri @yourapplication; }
+ location @yourapplication {
+ include uwsgi_params;
+ uwsgi_param SCRIPT_NAME /yourapplication;
+ uwsgi_modifier1 30;
+ uwsgi_pass unix:/tmp/uwsgi.sock;
+ }
+
+This configuration binds the application to `/yourapplication`. If you want
+to have it in the URL root it's a bit simpler because you don't have to tell
+it the WSGI `SCRIPT_NAME` or set the uwsgi modifier to make use of it::
+
+ location / { try_files $uri @yourapplication; }
+ location @yourapplication {
+ include uwsgi_params;
+ uwsgi_pass unix:/tmp/uwsgi.sock;
+ }
+
+.. _nginx: http://nginx.org/
+.. _lighttpd: http://www.lighttpd.net/
+.. _cherokee: http://www.cherokee-project.com/
+.. _uwsgi: http://projects.unbit.it/uwsgi/
diff --git a/app/static/doc/flask-docs/_sources/design.txt b/app/static/doc/flask-docs/_sources/design.txt
new file mode 100644
index 0000000..6ca363a
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/design.txt
@@ -0,0 +1,191 @@
+.. _design:
+
+Design Decisions in Flask
+=========================
+
+If you are curious why Flask does certain things the way it does and not
+differently, this section is for you. This should give you an idea about
+some of the design decisions that may appear arbitrary and surprising at
+first, especially in direct comparison with other frameworks.
+
+
+The Explicit Application Object
+-------------------------------
+
+A Python web application based on WSGI has to have one central callable
+object that implements the actual application. In Flask this is an
+instance of the :class:`~flask.Flask` class. Each Flask application has
+to create an instance of this class itself and pass it the name of the
+module, but why can't Flask do that itself?
+
+Without such an explicit application object the following code::
+
+ from flask import Flask
+ app = Flask(__name__)
+
+ @app.route('/')
+ def index():
+ return 'Hello World!'
+
+Would look like this instead::
+
+ from hypothetical_flask import route
+
+ @route('/')
+ def index():
+ return 'Hello World!'
+
+There are three major reasons for this. The most important one is that
+implicit application objects require that there may only be one instance at
+the time. There are ways to fake multiple applications with a single
+application object, like maintaining a stack of applications, but this
+causes some problems I won't outline here in detail. Now the question is:
+when does a microframework need more than one application at the same
+time? A good example for this is unittesting. When you want to test
+something it can be very helpful to create a minimal application to test
+specific behavior. When the application object is deleted everything it
+allocated will be freed again.
+
+Another thing that becomes possible when you have an explicit object lying
+around in your code is that you can subclass the base class
+(:class:`~flask.Flask`) to alter specific behaviour. This would not be
+possible without hacks if the object were created ahead of time for you
+based on a class that is not exposed to you.
+
+But there is another very important reason why Flask depends on an
+explicit instantiation of that class: the package name. Whenever you
+create a Flask instance you usually pass it `__name__` as package name.
+Flask depends on that information to properly load resources relative
+to your module. With Python's outstanding support for reflection it can
+then access the package to figure out where the templates and static files
+are stored (see :meth:`~flask.Flask.open_resource`). Now obviously there
+are frameworks around that do not need any configuration and will still be
+able to load templates relative to your application module. But they have
+to use the current working directory for that, which is a very unreliable
+way to determine where the application is. The current working directory
+is process-wide and if you are running multiple applications in one
+process (which could happen in a webserver without you knowing) the paths
+will be off. Worse: many webservers do not set the working directory to
+the directory of your application but to the document root which does not
+have to be the same folder.
+
+The third reason is "explicit is better than implicit". That object is
+your WSGI application, you don't have to remember anything else. If you
+want to apply a WSGI middleware, just wrap it and you're done (though
+there are better ways to do that so that you do not lose the reference
+to the application object :meth:`~flask.Flask.wsgi_app`).
+
+Furthermore this design makes it possible to use a factory function to
+create the application which is very helpful for unittesting and similar
+things (:ref:`app-factories`).
+
+The Routing System
+------------------
+
+Flask uses the Werkzeug routing system which has was designed to
+automatically order routes by complexity. This means that you can declare
+routes in arbitrary order and they will still work as expected. This is a
+requirement if you want to properly implement decorator based routing
+since decorators could be fired in undefined order when the application is
+split into multiple modules.
+
+Another design decision with the Werkzeug routing system is that routes
+in Werkzeug try to ensure that there is that URLs are unique. Werkzeug
+will go quite far with that in that it will automatically redirect to a
+canonical URL if a route is ambiguous.
+
+
+One Template Engine
+-------------------
+
+Flask decides on one template engine: Jinja2. Why doesn't Flask have a
+pluggable template engine interface? You can obviously use a different
+template engine, but Flask will still configure Jinja2 for you. While
+that limitation that Jinja2 is *always* configured will probably go away,
+the decision to bundle one template engine and use that will not.
+
+Template engines are like programming languages and each of those engines
+has a certain understanding about how things work. On the surface they
+all work the same: you tell the engine to evaluate a template with a set
+of variables and take the return value as string.
+
+But that's about where similarities end. Jinja2 for example has an
+extensive filter system, a certain way to do template inheritance, support
+for reusable blocks (macros) that can be used from inside templates and
+also from Python code, uses Unicode for all operations, supports
+iterative template rendering, configurable syntax and more. On the other
+hand an engine like Genshi is based on XML stream evaluation, template
+inheritance by taking the availability of XPath into account and more.
+Mako on the other hand treats templates similar to Python modules.
+
+When it comes to connecting a template engine with an application or
+framework there is more than just rendering templates. For instance,
+Flask uses Jinja2's extensive autoescaping support. Also it provides
+ways to access macros from Jinja2 templates.
+
+A template abstraction layer that would not take the unique features of
+the template engines away is a science on its own and a too large
+undertaking for a microframework like Flask.
+
+Furthermore extensions can then easily depend on one template language
+being present. You can easily use your own templating language, but an
+extension could still depend on Jinja itself.
+
+
+Micro with Dependencies
+-----------------------
+
+Why does Flask call itself a microframework and yet it depends on two
+libraries (namely Werkzeug and Jinja2). Why shouldn't it? If we look
+over to the Ruby side of web development there we have a protocol very
+similar to WSGI. Just that it's called Rack there, but besides that it
+looks very much like a WSGI rendition for Ruby. But nearly all
+applications in Ruby land do not work with Rack directly, but on top of a
+library with the same name. This Rack library has two equivalents in
+Python: WebOb (formerly Paste) and Werkzeug. Paste is still around but
+from my understanding it's sort of deprecated in favour of WebOb. The
+development of WebOb and Werkzeug started side by side with similar ideas
+in mind: be a good implementation of WSGI for other applications to take
+advantage.
+
+Flask is a framework that takes advantage of the work already done by
+Werkzeug to properly interface WSGI (which can be a complex task at
+times). Thanks to recent developments in the Python package
+infrastructure, packages with dependencies are no longer an issue and
+there are very few reasons against having libraries that depend on others.
+
+
+Thread Locals
+-------------
+
+Flask uses thread local objects (context local objects in fact, they
+support greenlet contexts as well) for request, session and an extra
+object you can put your own things on (:data:`~flask.g`). Why is that and
+isn't that a bad idea?
+
+Yes it is usually not such a bright idea to use thread locals. They cause
+troubles for servers that are not based on the concept of threads and make
+large applications harder to maintain. However Flask is just not designed
+for large applications or asynchronous servers. Flask wants to make it
+quick and easy to write a traditional web application.
+
+Also see the :ref:`becomingbig` section of the documentation for some
+inspiration for larger applications based on Flask.
+
+
+What Flask is, What Flask is Not
+--------------------------------
+
+Flask will never have a database layer. It will not have a form library
+or anything else in that direction. Flask itself just bridges to Werkzeug
+to implement a proper WSGI application and to Jinja2 to handle templating.
+It also binds to a few common standard library packages such as logging.
+Everything else is up for extensions.
+
+Why is this the case? Because people have different preferences and
+requirements and Flask could not meet those if it would force any of this
+into the core. The majority of web applications will need a template
+engine in some sort. However not every application needs a SQL database.
+
+The idea of Flask is to build a good foundation for all applications.
+Everything else is up to you or extensions.
diff --git a/app/static/doc/flask-docs/_sources/errorhandling.txt b/app/static/doc/flask-docs/_sources/errorhandling.txt
new file mode 100644
index 0000000..debb9d7
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/errorhandling.txt
@@ -0,0 +1,237 @@
+.. _application-errors:
+
+Handling Application Errors
+===========================
+
+.. versionadded:: 0.3
+
+Applications fail, servers fail. Sooner or later you will see an exception
+in production. Even if your code is 100% correct, you will still see
+exceptions from time to time. Why? Because everything else involved will
+fail. Here some situations where perfectly fine code can lead to server
+errors:
+
+- the client terminated the request early and the application was still
+ reading from the incoming data.
+- the database server was overloaded and could not handle the query.
+- a filesystem is full
+- a harddrive crashed
+- a backend server overloaded
+- a programming error in a library you are using
+- network connection of the server to another system failed.
+
+And that's just a small sample of issues you could be facing. So how do we
+deal with that sort of problem? By default if your application runs in
+production mode, Flask will display a very simple page for you and log the
+exception to the :attr:`~flask.Flask.logger`.
+
+But there is more you can do, and we will cover some better setups to deal
+with errors.
+
+Error Mails
+-----------
+
+If the application runs in production mode (which it will do on your
+server) you won't see any log messages by default. Why is that? Flask
+tries to be a zero-configuration framework. Where should it drop the logs
+for you if there is no configuration? Guessing is not a good idea because
+chances are, the place it guessed is not the place where the user has
+permission to create a logfile. Also, for most small applications nobody
+will look at the logs anyways.
+
+In fact, I promise you right now that if you configure a logfile for the
+application errors you will never look at it except for debugging an issue
+when a user reported it for you. What you want instead is a mail the
+second the exception happened. Then you get an alert and you can do
+something about it.
+
+Flask uses the Python builtin logging system, and it can actually send
+you mails for errors which is probably what you want. Here is how you can
+configure the Flask logger to send you mails for exceptions::
+
+ ADMINS = ['yourname@example.com']
+ if not app.debug:
+ import logging
+ from logging.handlers import SMTPHandler
+ mail_handler = SMTPHandler('127.0.0.1',
+ 'server-error@example.com',
+ ADMINS, 'YourApplication Failed')
+ mail_handler.setLevel(logging.ERROR)
+ app.logger.addHandler(mail_handler)
+
+So what just happened? We created a new
+:class:`~logging.handlers.SMTPHandler` that will send mails with the mail
+server listening on ``127.0.0.1`` to all the `ADMINS` from the address
+*server-error@example.com* with the subject "YourApplication Failed". If
+your mail server requires credentials, these can also be provided. For
+that check out the documentation for the
+:class:`~logging.handlers.SMTPHandler`.
+
+We also tell the handler to only send errors and more critical messages.
+Because we certainly don't want to get a mail for warnings or other
+useless logs that might happen during request handling.
+
+Before you run that in production, please also look at :ref:`logformat` to
+put more information into that error mail. That will save you from a lot
+of frustration.
+
+
+Logging to a File
+-----------------
+
+Even if you get mails, you probably also want to log warnings. It's a
+good idea to keep as much information around that might be required to
+debug a problem. Please note that Flask itself will not issue any
+warnings in the core system, so it's your responsibility to warn in the
+code if something seems odd.
+
+There are a couple of handlers provided by the logging system out of the
+box but not all of them are useful for basic error logging. The most
+interesting are probably the following:
+
+- :class:`~logging.FileHandler` - logs messages to a file on the
+ filesystem.
+- :class:`~logging.handlers.RotatingFileHandler` - logs messages to a file
+ on the filesystem and will rotate after a certain number of messages.
+- :class:`~logging.handlers.NTEventLogHandler` - will log to the system
+ event log of a Windows system. If you are deploying on a Windows box,
+ this is what you want to use.
+- :class:`~logging.handlers.SysLogHandler` - sends logs to a UNIX
+ syslog.
+
+Once you picked your log handler, do like you did with the SMTP handler
+above, just make sure to use a lower setting (I would recommend
+`WARNING`)::
+
+ if not app.debug:
+ import logging
+ from themodule import TheHandlerYouWant
+ file_handler = TheHandlerYouWant(...)
+ file_handler.setLevel(logging.WARNING)
+ app.logger.addHandler(file_handler)
+
+.. _logformat:
+
+Controlling the Log Format
+--------------------------
+
+By default a handler will only write the message string into a file or
+send you that message as mail. A log record stores more information,
+and it makes a lot of sense to configure your logger to also contain that
+information so that you have a better idea of why that error happened, and
+more importantly, where it did.
+
+A formatter can be instantiated with a format string. Note that
+tracebacks are appended to the log entry automatically. You don't have to
+do that in the log formatter format string.
+
+Here some example setups:
+
+Email
+`````
+
+::
+
+ from logging import Formatter
+ mail_handler.setFormatter(Formatter('''
+ Message type: %(levelname)s
+ Location: %(pathname)s:%(lineno)d
+ Module: %(module)s
+ Function: %(funcName)s
+ Time: %(asctime)s
+
+ Message:
+
+ %(message)s
+ '''))
+
+File logging
+````````````
+
+::
+
+ from logging import Formatter
+ file_handler.setFormatter(Formatter(
+ '%(asctime)s %(levelname)s: %(message)s '
+ '[in %(pathname)s:%(lineno)d]'
+ ))
+
+
+Complex Log Formatting
+``````````````````````
+
+Here is a list of useful formatting variables for the format string. Note
+that this list is not complete, consult the official documentation of the
+:mod:`logging` package for a full list.
+
+.. tabularcolumns:: |p{3cm}|p{12cm}|
+
++------------------+----------------------------------------------------+
+| Format | Description |
++==================+====================================================+
+| ``%(levelname)s``| Text logging level for the message |
+| | (``'DEBUG'``, ``'INFO'``, ``'WARNING'``, |
+| | ``'ERROR'``, ``'CRITICAL'``). |
++------------------+----------------------------------------------------+
+| ``%(pathname)s`` | Full pathname of the source file where the |
+| | logging call was issued (if available). |
++------------------+----------------------------------------------------+
+| ``%(filename)s`` | Filename portion of pathname. |
++------------------+----------------------------------------------------+
+| ``%(module)s`` | Module (name portion of filename). |
++------------------+----------------------------------------------------+
+| ``%(funcName)s`` | Name of function containing the logging call. |
++------------------+----------------------------------------------------+
+| ``%(lineno)d`` | Source line number where the logging call was |
+| | issued (if available). |
++------------------+----------------------------------------------------+
+| ``%(asctime)s`` | Human-readable time when the LogRecord` was |
+| | created. By default this is of the form |
+| | ``"2003-07-08 16:49:45,896"`` (the numbers after |
+| | the comma are millisecond portion of the time). |
+| | This can be changed by subclassing the formatter |
+| | and overriding the |
+| | :meth:`~logging.Formatter.formatTime` method. |
++------------------+----------------------------------------------------+
+| ``%(message)s`` | The logged message, computed as ``msg % args`` |
++------------------+----------------------------------------------------+
+
+If you want to further customize the formatting, you can subclass the
+formatter. The formatter has three interesting methods:
+
+:meth:`~logging.Formatter.format`:
+ handles the actual formatting. It is passed a
+ :class:`~logging.LogRecord` object and has to return the formatted
+ string.
+:meth:`~logging.Formatter.formatTime`:
+ called for `asctime` formatting. If you want a different time format
+ you can override this method.
+:meth:`~logging.Formatter.formatException`
+ called for exception formatting. It is passed an :attr:`~sys.exc_info`
+ tuple and has to return a string. The default is usually fine, you
+ don't have to override it.
+
+For more information, head over to the official documentation.
+
+
+Other Libraries
+---------------
+
+So far we only configured the logger your application created itself.
+Other libraries might log themselves as well. For example, SQLAlchemy uses
+logging heavily in its core. While there is a method to configure all
+loggers at once in the :mod:`logging` package, I would not recommend using
+it. There might be a situation in which you want to have multiple
+separate applications running side by side in the same Python interpreter
+and then it becomes impossible to have different logging setups for those.
+
+Instead, I would recommend figuring out which loggers you are interested
+in, getting the loggers with the :func:`~logging.getLogger` function and
+iterating over them to attach handlers::
+
+ from logging import getLogger
+ loggers = [app.logger, getLogger('sqlalchemy'),
+ getLogger('otherlibrary')]
+ for logger in loggers:
+ logger.addHandler(mail_handler)
+ logger.addHandler(file_handler)
diff --git a/app/static/doc/flask-docs/_sources/extensiondev.txt b/app/static/doc/flask-docs/_sources/extensiondev.txt
new file mode 100644
index 0000000..ee0d5e6
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/extensiondev.txt
@@ -0,0 +1,387 @@
+Flask Extension Development
+===========================
+
+Flask, being a microframework, often requires some repetitive steps to get
+a third party library working. Because very often these steps could be
+abstracted to support multiple projects the `Flask Extension Registry`_
+was created.
+
+If you want to create your own Flask extension for something that does not
+exist yet, this guide to extension development will help you get your
+extension running in no time and to feel like users would expect your
+extension to behave.
+
+.. _Flask Extension Registry: http://flask.pocoo.org/extensions/
+
+Anatomy of an Extension
+-----------------------
+
+Extensions are all located in a package called ``flask_something``
+where "something" is the name of the library you want to bridge. So for
+example if you plan to add support for a library named `simplexml` to
+Flask, you would name your extension's package ``flask_simplexml``.
+
+The name of the actual extension (the human readable name) however would
+be something like "Flask-SimpleXML". Make sure to include the name
+"Flask" somewhere in that name and that you check the capitalization.
+This is how users can then register dependencies to your extension in
+their `setup.py` files.
+
+Flask sets up a redirect package called :data:`flask.ext` where users
+should import the extensions from. If you for instance have a package
+called ``flask_something`` users would import it as
+``flask.ext.something``. This is done to transition from the old
+namespace packages. See :ref:`ext-import-transition` for more details.
+
+But how do extensions look like themselves? An extension has to ensure
+that it works with multiple Flask application instances at once. This is
+a requirement because many people will use patterns like the
+:ref:`app-factories` pattern to create their application as needed to aid
+unittests and to support multiple configurations. Because of that it is
+crucial that your application supports that kind of behaviour.
+
+Most importantly the extension must be shipped with a `setup.py` file and
+registered on PyPI. Also the development checkout link should work so
+that people can easily install the development version into their
+virtualenv without having to download the library by hand.
+
+Flask extensions must be licensed as BSD or MIT or a more liberal license
+to be enlisted on the Flask Extension Registry. Keep in mind that the
+Flask Extension Registry is a moderated place and libraries will be
+reviewed upfront if they behave as required.
+
+"Hello Flaskext!"
+-----------------
+
+So let's get started with creating such a Flask extension. The extension
+we want to create here will provide very basic support for SQLite3.
+
+First we create the following folder structure::
+
+ flask-sqlite3/
+ flask_sqlite3.py
+ LICENSE
+ README
+
+Here's the contents of the most important files:
+
+setup.py
+````````
+
+The next file that is absolutely required is the `setup.py` file which is
+used to install your Flask extension. The following contents are
+something you can work with::
+
+ """
+ Flask-SQLite3
+ -------------
+
+ This is the description for that library
+ """
+ from setuptools import setup
+
+
+ setup(
+ name='Flask-SQLite3',
+ version='1.0',
+ url='http://example.com/flask-sqlite3/',
+ license='BSD',
+ author='Your Name',
+ author_email='your-email@example.com',
+ description='Very short description',
+ long_description=__doc__,
+ py_modules=['flask_sqlite3'],
+ # if you would be using a package instead use packages instead
+ # of py_modules:
+ # packages=['flask_sqlite3'],
+ zip_safe=False,
+ include_package_data=True,
+ platforms='any',
+ install_requires=[
+ 'Flask'
+ ],
+ classifiers=[
+ 'Environment :: Web Environment',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: BSD License',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
+ 'Topic :: Software Development :: Libraries :: Python Modules'
+ ]
+ )
+
+That's a lot of code but you can really just copy/paste that from existing
+extensions and adapt.
+
+flask_sqlite3.py
+````````````````
+
+Now this is where your extension code goes. But how exactly should such
+an extension look like? What are the best practices? Continue reading
+for some insight.
+
+Initializing Extensions
+-----------------------
+
+Many extensions will need some kind of initialization step. For example,
+consider your application is currently connecting to SQLite like the
+documentation suggests (:ref:`sqlite3`) you will need to provide a few
+functions and before / after request handlers. So how does the extension
+know the name of the application object?
+
+Quite simple: you pass it to it.
+
+There are two recommended ways for an extension to initialize:
+
+initialization functions:
+ If your extension is called `helloworld` you might have a function
+ called ``init_helloworld(app[, extra_args])`` that initializes the
+ extension for that application. It could attach before / after
+ handlers etc.
+
+classes:
+ Classes work mostly like initialization functions but can later be
+ used to further change the behaviour. For an example look at how the
+ `OAuth extension`_ works: there is an `OAuth` object that provides
+ some helper functions like `OAuth.remote_app` to create a reference to
+ a remote application that uses OAuth.
+
+What to use depends on what you have in mind. For the SQLite 3 extension
+we will use the class based approach because it will provide users with a
+manager object that handles opening and closing database connections.
+
+The Extension Code
+------------------
+
+Here's the contents of the `flask_sqlite3.py` for copy/paste::
+
+ from __future__ import absolute_import
+ import sqlite3
+
+ from flask import _request_ctx_stack
+
+ class SQLite3(object):
+
+ def __init__(self, app):
+ self.app = app
+ self.app.config.setdefault('SQLITE3_DATABASE', ':memory:')
+ self.app.teardown_request(self.teardown_request)
+ self.app.before_request(self.before_request)
+
+ def connect(self):
+ return sqlite3.connect(self.app.config['SQLITE3_DATABASE'])
+
+ def before_request(self):
+ ctx = _request_ctx_stack.top
+ ctx.sqlite3_db = self.connect()
+
+ def teardown_request(self, exception):
+ ctx = _request_ctx_stack.top
+ ctx.sqlite3_db.close()
+
+ def get_db(self):
+ ctx = _request_ctx_stack.top
+ if ctx is not None:
+ return ctx.sqlite3_db
+
+So here's what these lines of code do:
+
+1. The ``__future__`` import is necessary to activate absolute imports.
+ Otherwise we could not call our module `sqlite3.py` and import the
+ top-level `sqlite3` module which actually implements the connection to
+ SQLite.
+2. We create a class for our extension that requires a supplied `app` object,
+ sets a configuration for the database if it's not there
+ (:meth:`dict.setdefault`), and attaches `before_request` and
+ `teardown_request` handlers.
+3. Next, we define a `connect` function that opens a database connection.
+4. Then we set up the request handlers we bound to the app above. Note here
+ that we're attaching our database connection to the top request context via
+ `_request_ctx_stack.top`. Extensions should use the top context and not the
+ `g` object to store things like database connections.
+5. Finally, we add a `get_db` function that simplifies access to the context's
+ database.
+
+So why did we decide on a class based approach here? Because using our
+extension looks something like this::
+
+ from flask import Flask
+ from flask_sqlite3 import SQLite3
+
+ app = Flask(__name__)
+ app.config.from_pyfile('the-config.cfg')
+ manager = SQLite3(app)
+ db = manager.get_db()
+
+You can then use the database from views like this::
+
+ @app.route('/')
+ def show_all():
+ cur = db.cursor()
+ cur.execute(...)
+
+Opening a database connection from outside a view function is simple.
+
+>>> from yourapplication import db
+>>> cur = db.cursor()
+>>> cur.execute(...)
+
+Adding an `init_app` Function
+-----------------------------
+
+In practice, you'll almost always want to permit users to initialize your
+extension and provide an app object after the fact. This can help avoid
+circular import problems when a user is breaking their app into multiple files.
+Our extension could add an `init_app` function as follows::
+
+ class SQLite3(object):
+
+ def __init__(self, app=None):
+ if app is not None:
+ self.app = app
+ self.init_app(self.app)
+ else:
+ self.app = None
+
+ def init_app(self, app):
+ self.app = app
+ self.app.config.setdefault('SQLITE3_DATABASE', ':memory:')
+ self.app.teardown_request(self.teardown_request)
+ self.app.before_request(self.before_request)
+
+ def connect(self):
+ return sqlite3.connect(app.config['SQLITE3_DATABASE'])
+
+ def before_request(self):
+ ctx = _request_ctx_stack.top
+ ctx.sqlite3_db = self.connect()
+
+ def teardown_request(self, exception):
+ ctx = _request_ctx_stack.top
+ ctx.sqlite3_db.close()
+
+ def get_db(self):
+ ctx = _request_ctx_stack.top
+ if ctx is not None:
+ return ctx.sqlite3_db
+
+The user could then initialize the extension in one file::
+
+ manager = SQLite3()
+
+and bind their app to the extension in another file::
+
+ manager.init_app(app)
+
+End-Of-Request Behavior
+-----------------------
+
+Due to the change in Flask 0.7 regarding functions that are run at the end
+of the request your extension will have to be extra careful there if it
+wants to continue to support older versions of Flask. The following
+pattern is a good way to support both::
+
+ def close_connection(response):
+ ctx = _request_ctx_stack.top
+ ctx.sqlite3_db.close()
+ return response
+
+ if hasattr(app, 'teardown_request'):
+ app.teardown_request(close_connection)
+ else:
+ app.after_request(close_connection)
+
+Strictly speaking the above code is wrong, because teardown functions are
+passed the exception and typically don't return anything. However because
+the return value is discarded this will just work assuming that the code
+in between does not touch the passed parameter.
+
+Learn from Others
+-----------------
+
+This documentation only touches the bare minimum for extension
+development. If you want to learn more, it's a very good idea to check
+out existing extensions on the `Flask Extension Registry`_. If you feel
+lost there is still the `mailinglist`_ and the `IRC channel`_ to get some
+ideas for nice looking APIs. Especially if you do something nobody before
+you did, it might be a very good idea to get some more input. This not
+only to get an idea about what people might want to have from an
+extension, but also to avoid having multiple developers working on pretty
+much the same side by side.
+
+Remember: good API design is hard, so introduce your project on the
+mailinglist, and let other developers give you a helping hand with
+designing the API.
+
+The best Flask extensions are extensions that share common idioms for the
+API. And this can only work if collaboration happens early.
+
+Approved Extensions
+-------------------
+
+Flask also has the concept of approved extensions. Approved extensions
+are tested as part of Flask itself to ensure extensions do not break on
+new releases. These approved extensions are listed on the `Flask
+Extension Registry`_ and marked appropriately. If you want your own
+extension to be approved you have to follow these guidelines:
+
+1. An approved Flask extension must provide exactly one package or module
+ named ``flask_extensionname``. They might also reside inside a
+ ``flaskext`` namespace packages though this is discouraged now.
+2. It must ship a testing suite that can either be invoked with ``make test``
+ or ``python setup.py test``. For test suites invoked with ``make
+ test`` the extension has to ensure that all dependencies for the test
+ are installed automatically, in case of ``python setup.py test``
+ dependencies for tests alone can be specified in the `setup.py`
+ file. The test suite also has to be part of the distribution.
+3. APIs of approved extensions will be checked for the following
+ characteristics:
+
+ - an approved extension has to support multiple applications
+ running in the same Python process.
+ - it must be possible to use the factory pattern for creating
+ applications.
+
+4. The license must be BSD/MIT/WTFPL licensed.
+5. The naming scheme for official extensions is *Flask-ExtensionName* or
+ *ExtensionName-Flask*.
+6. Approved extensions must define all their dependencies in the
+ `setup.py` file unless a dependency cannot be met because it is not
+ available on PyPI.
+7. The extension must have documentation that uses one of the two Flask
+ themes for Sphinx documentation.
+8. The setup.py description (and thus the PyPI description) has to
+ link to the documentation, website (if there is one) and there
+ must be a link to automatically install the development version
+ (``PackageName==dev``).
+9. The ``zip_safe`` flag in the setup script must be set to ``False``,
+ even if the extension would be safe for zipping.
+10. An extension currently has to support Python 2.5, 2.6 as well as
+ Python 2.7
+
+
+.. _ext-import-transition:
+
+Extension Import Transition
+---------------------------
+
+For a while we recommended using namespace packages for Flask extensions.
+This turned out to be problematic in practice because many different
+competing namespace package systems exist and pip would automatically
+switch between different systems and this caused a lot of problems for
+users.
+
+Instead we now recommend naming packages ``flask_foo`` instead of the now
+deprecated ``flaskext.foo``. Flask 0.8 introduces a redirect import
+system that lets uses import from ``flask.ext.foo`` and it will try
+``flask_foo`` first and if that fails ``flaskext.foo``.
+
+Flask extensions should urge users to import from ``flask.ext.foo``
+instead of ``flask_foo`` or ``flaskext_foo`` so that extensions can
+transition to the new package name without affecting users.
+
+
+.. _OAuth extension: http://packages.python.org/Flask-OAuth/
+.. _mailinglist: http://flask.pocoo.org/mailinglist/
+.. _IRC channel: http://flask.pocoo.org/community/irc/
diff --git a/app/static/doc/flask-docs/_sources/extensions.txt b/app/static/doc/flask-docs/_sources/extensions.txt
new file mode 100644
index 0000000..53dca56
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/extensions.txt
@@ -0,0 +1,48 @@
+Flask Extensions
+================
+
+Flask extensions extend the functionality of Flask in various different
+ways. For instance they add support for databases and other common tasks.
+
+Finding Extensions
+------------------
+
+Flask extensions are listed on the `Flask Extension Registry`_ and can be
+downloaded with ``easy_install`` or ``pip``. If you add a Flask extension
+as dependency to your ``requirements.rst`` or ``setup.py`` file they are
+usually installed with a simple command or when your application installs.
+
+Using Extensions
+----------------
+
+Extensions typically have documentation that goes along that shows how to
+use it. There are no general rules in how extensions are supposed to
+behave but they are imported from common locations. If you have an
+extension called ``Flask-Foo`` or ``Foo-Flask`` it will be always
+importable from ``flask.ext.foo``::
+
+ from flask.ext import foo
+
+Flask Before 0.8
+----------------
+
+If you are using Flask 0.7 or earlier the :data:`flask.ext` package will not
+exist, instead you have to import from ``flaskext.foo`` or ``flask_foo``
+depending on how the extension is distributed. If you want to develop an
+application that supports Flask 0.7 or earlier you should still import
+from the :data:`flask.ext` package. We provide you with a compatibility
+module that provides this package for older versions of Flask. You can
+download it from github: `flaskext_compat.py`_
+
+And here is how you can use it::
+
+ import flaskext_compat
+ flaskext_compat.activate()
+
+ from flask.ext import foo
+
+Once the ``flaskext_compat`` module is activated the :data:`flask.ext` will
+exist and you can start importing from there.
+
+.. _Flask Extension Registry: http://flask.pocoo.org/extensions/
+.. _flaskext_compat.py: https://github.com/mitsuhiko/flask/raw/master/scripts/flaskext_compat.py
diff --git a/app/static/doc/flask-docs/_sources/foreword.txt b/app/static/doc/flask-docs/_sources/foreword.txt
new file mode 100644
index 0000000..10b886b
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/foreword.txt
@@ -0,0 +1,100 @@
+Foreword
+========
+
+Read this before you get started with Flask. This hopefully answers some
+questions about the purpose and goals of the project, and when you
+should or should not be using it.
+
+What does "micro" mean?
+-----------------------
+
+To me, the "micro" in microframework refers not only to the simplicity and
+small size of the framework, but also the fact that it does not make much
+decisions for you. While Flask does pick a templating engine for you, we
+won't make such decisions for your datastore or other parts.
+
+For us however the term “micro” does not mean that the whole implementation
+has to fit into a single Python file.
+
+One of the design decisions with Flask was that simple tasks should be
+simple and not take up a lot of code and yet not limit yourself. Because
+of that we took a few design choices that some people might find
+surprising or unorthodox. For example, Flask uses thread-local objects
+internally so that you don't have to pass objects around from function to
+function within a request in order to stay threadsafe. While this is a
+really easy approach and saves you a lot of time, it might also cause some
+troubles for very large applications because changes on these thread-local
+objects can happen anywhere in the same thread. In order to solve these
+problems we don't hide the thread locals for you but instead embrace them
+and provide you with a lot of tools to make it as pleasant as possible to
+work with them.
+
+Flask is also based on convention over configuration, which means that
+many things are preconfigured. For example, by convention, templates and
+static files are in subdirectories within the Python source tree of the
+application. While this can be changed you usually don't have to.
+
+The main reason however why Flask is called a "microframework" is the idea
+to keep the core simple but extensible. There is no database abstraction
+layer, no form validation or anything else where different libraries
+already exist that can handle that. However Flask knows the concept of
+extensions that can add this functionality into your application as if it
+was implemented in Flask itself. There are currently extensions for
+object relational mappers, form validation, upload handling, various open
+authentication technologies and more.
+
+Since Flask is based on a very solid foundation there is not a lot of code
+in Flask itself. As such it's easy to adapt even for lage applications
+and we are making sure that you can either configure it as much as
+possible by subclassing things or by forking the entire codebase. If you
+are interested in that, check out the :ref:`becomingbig` chapter.
+
+If you are curious about the Flask design principles, head over to the
+section about :ref:`design`.
+
+Web Development is Dangerous
+----------------------------
+
+I'm not joking. Well, maybe a little. If you write a web
+application, you are probably allowing users to register and leave their
+data on your server. The users are entrusting you with data. And even if
+you are the only user that might leave data in your application, you still
+want that data to be stored securely.
+
+Unfortunately, there are many ways the security of a web application can be
+compromised. Flask protects you against one of the most common security
+problems of modern web applications: cross-site scripting (XSS). Unless
+you deliberately mark insecure HTML as secure, Flask and the underlying
+Jinja2 template engine have you covered. But there are many more ways to
+cause security problems.
+
+The documentation will warn you about aspects of web development that
+require attention to security. Some of these security concerns
+are far more complex than one might think, and we all sometimes underestimate
+the likelihood that a vulnerability will be exploited, until a clever
+attacker figures out a way to exploit our applications. And don't think
+that your application is not important enough to attract an attacker.
+Depending on the kind of attack, chances are that automated bots are
+probing for ways to fill your database with spam, links to malicious
+software, and the like.
+
+So always keep security in mind when doing web development.
+
+The Status of Python 3
+----------------------
+
+Currently the Python community is in the process of improving libraries to
+support the new iteration of the Python programming language. While the
+situation is greatly improving there are still some issues that make it
+hard for us to switch over to Python 3 just now. These problems are
+partially caused by changes in the language that went unreviewed for too
+long, partially also because we have not quite worked out how the lower
+level API should change for the unicode differences in Python3.
+
+Werkzeug and Flask will be ported to Python 3 as soon as a solution for
+the changes is found, and we will provide helpful tips how to upgrade
+existing applications to Python 3. Until then, we strongly recommend
+using Python 2.6 and 2.7 with activated Python 3 warnings during
+development. If you plan on upgrading to Python 3 in the near future we
+strongly recommend that you read `How to write forwards compatible
+Python code <http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/>`_.
diff --git a/app/static/doc/flask-docs/_sources/htmlfaq.txt b/app/static/doc/flask-docs/_sources/htmlfaq.txt
new file mode 100644
index 0000000..1da25f3
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/htmlfaq.txt
@@ -0,0 +1,207 @@
+HTML/XHTML FAQ
+==============
+
+The Flask documentation and example applications are using HTML5. You
+may notice that in many situations, when end tags are optional they are
+not used, so that the HTML is cleaner and faster to load. Because there
+is much confusion about HTML and XHTML among developers, this document tries
+to answer some of the major questions.
+
+
+History of XHTML
+----------------
+
+For a while, it appeared that HTML was about to be replaced by XHTML.
+However, barely any websites on the Internet are actual XHTML (which is
+HTML processed using XML rules). There are a couple of major reasons
+why this is the case. One of them is Internet Explorer's lack of proper
+XHTML support. The XHTML spec states that XHTML must be served with the MIME
+type `application/xhtml+xml`, but Internet Explorer refuses to read files
+with that MIME type.
+While it is relatively easy to configure Web servers to serve XHTML properly,
+few people do. This is likely because properly using XHTML can be quite
+painful.
+
+One of the most important causes of pain is XML's draconian (strict and
+ruthless) error handling. When an XML parsing error is encountered,
+the browser is supposed to show the user an ugly error message, instead
+of attempting to recover from the error and display what it can. Most of
+the (X)HTML generation on the web is based on non-XML template engines
+(such as Jinja, the one used in Flask) which do not protect you from
+accidentally creating invalid XHTML. There are XML based template engines,
+such as Kid and the popular Genshi, but they often come with a larger
+runtime overhead and, are not as straightforward to use because they have
+to obey XML rules.
+
+The majority of users, however, assumed they were properly using XHTML.
+They wrote an XHTML doctype at the top of the document and self-closed all
+the necessary tags (``<br>`` becomes ``<br/>`` or ``<br></br>`` in XHTML).
+However, even if the document properly validates as XHTML, what really
+determines XHTML/HTML processing in browsers is the MIME type, which as
+said before is often not set properly. So the valid XHTML was being treated
+as invalid HTML.
+
+XHTML also changed the way JavaScript is used. To properly work with XHTML,
+programmers have to use the namespaced DOM interface with the XHTML
+namespace to query for HTML elements.
+
+History of HTML5
+----------------
+
+Development of the HTML5 specification was started in 2004 under the name
+"Web Applications 1.0" by the Web Hypertext Application Technology Working
+Group, or WHATWG (which was formed by the major browser vendors Apple,
+Mozilla, and Opera) with the goal of writing a new and improved HTML
+specification, based on existing browser behaviour instead of unrealistic
+and backwards-incompatible specifications.
+
+For example, in HTML4 ``<title/Hello/`` theoretically parses exactly the
+same as ``<title>Hello</title>``. However, since people were using
+XHTML-like tags along the lines of ``<link />``, browser vendors implemented
+the XHTML syntax over the syntax defined by the specification.
+
+In 2007, the specification was adopted as the basis of a new HTML
+specification under the umbrella of the W3C, known as HTML5. Currently,
+it appears that XHTML is losing traction, as the XHTML 2 working group has
+been disbanded and HTML5 is being implemented by all major browser vendors.
+
+HTML versus XHTML
+-----------------
+
+The following table gives you a quick overview of features available in
+HTML 4.01, XHTML 1.1 and HTML5. (XHTML 1.0 is not included, as it was
+superseded by XHTML 1.1 and the barely-used XHTML5.)
+
+.. tabularcolumns:: |p{9cm}|p{2cm}|p{2cm}|p{2cm}|
+
++-----------------------------------------+----------+----------+----------+
+| | HTML4.01 | XHTML1.1 | HTML5 |
++=========================================+==========+==========+==========+
+| ``<tag/value/`` == ``<tag>value</tag>`` | |Y| [1]_ | |N| | |N| |
++-----------------------------------------+----------+----------+----------+
+| ``<br/>`` supported | |N| | |Y| | |Y| [2]_ |
++-----------------------------------------+----------+----------+----------+
+| ``<script/>`` supported | |N| | |Y| | |N| |
++-----------------------------------------+----------+----------+----------+
+| should be served as `text/html` | |Y| | |N| [3]_ | |Y| |
++-----------------------------------------+----------+----------+----------+
+| should be served as | |N| | |Y| | |N| |
+| `application/xhtml+xml` | | | |
++-----------------------------------------+----------+----------+----------+
+| strict error handling | |N| | |Y| | |N| |
++-----------------------------------------+----------+----------+----------+
+| inline SVG | |N| | |Y| | |Y| |
++-----------------------------------------+----------+----------+----------+
+| inline MathML | |N| | |Y| | |Y| |
++-----------------------------------------+----------+----------+----------+
+| ``<video>`` tag | |N| | |N| | |Y| |
++-----------------------------------------+----------+----------+----------+
+| ``<audio>`` tag | |N| | |N| | |Y| |
++-----------------------------------------+----------+----------+----------+
+| New semantic tags like ``<article>`` | |N| | |N| | |Y| |
++-----------------------------------------+----------+----------+----------+
+
+.. [1] This is an obscure feature inherited from SGML. It is usually not
+ supported by browsers, for reasons detailed above.
+.. [2] This is for compatibility with server code that generates XHTML for
+ tags such as ``<br>``. It should not be used in new code.
+.. [3] XHTML 1.0 is the last XHTML standard that allows to be served
+ as `text/html` for backwards compatibility reasons.
+
+.. |Y| image:: _static/yes.png
+ :alt: Yes
+.. |N| image:: _static/no.png
+ :alt: No
+
+What does "strict" mean?
+------------------------
+
+HTML5 has strictly defined parsing rules, but it also specifies exactly
+how a browser should react to parsing errors - unlike XHTML, which simply
+states parsing should abort. Some people are confused by apparently
+invalid syntax that still generates the expected results (for example,
+missing end tags or unquoted attribute values).
+
+Some of these work because of the lenient error handling most browsers use
+when they encounter a markup error, others are actually specified. The
+following constructs are optional in HTML5 by standard, but have to be
+supported by browsers:
+
+- Wrapping the document in an ``<html>`` tag
+- Wrapping header elements in ``<head>`` or the body elements in
+ ``<body>``
+- Closing the ``<p>``, ``<li>``, ``<dt>``, ``<dd>``, ``<tr>``,
+ ``<td>``, ``<th>``, ``<tbody>``, ``<thead>``, or ``<tfoot>`` tags.
+- Quoting attributes, so long as they contain no whitespace or
+ special characters (like ``<``, ``>``, ``'``, or ``"``).
+- Requiring boolean attributes to have a value.
+
+This means the following page in HTML5 is perfectly valid:
+
+.. sourcecode:: html
+
+ <!doctype html>
+ <title>Hello HTML5</title>
+ <div class=header>
+ <h1>Hello HTML5</h1>
+ <p class=tagline>HTML5 is awesome
+ </div>
+ <ul class=nav>
+ <li><a href=/index>Index</a>
+ <li><a href=/downloads>Downloads</a>
+ <li><a href=/about>About</a>
+ </ul>
+ <div class=body>
+ <h2>HTML5 is probably the future</h2>
+ <p>
+ There might be some other things around but in terms of
+ browser vendor support, HTML5 is hard to beat.
+ <dl>
+ <dt>Key 1
+ <dd>Value 1
+ <dt>Key 2
+ <dd>Value 2
+ </dl>
+ </div>
+
+
+New technologies in HTML5
+-------------------------
+
+HTML5 adds many new features that make Web applications easier to write
+and to use.
+
+- The ``<audio>`` and ``<video>`` tags provide a way to embed audio and
+ video without complicated add-ons like QuickTime or Flash.
+- Semantic elements like ``<article>``, ``<header>``, ``<nav>``, and
+ ``<time>`` that make content easier to understand.
+- The ``<canvas>`` tag, which supports a powerful drawing API, reducing
+ the need for server-generated images to present data graphically.
+- New form control types like ``<input type="date">`` that allow user
+ agents to make entering and validating values easier.
+- Advanced JavaScript APIs like Web Storage, Web Workers, Web Sockets,
+ geolocation, and offline applications.
+
+Many other features have been added, as well. A good guide to new features
+in HTML5 is Mark Pilgrim's soon-to-be-published book, `Dive Into HTML5`_.
+Not all of them are supported in browsers yet, however, so use caution.
+
+.. _Dive Into HTML5: http://www.diveintohtml5.org/
+
+What should be used?
+--------------------
+
+Currently, the answer is HTML5. There are very few reasons to use XHTML
+considering the latest developments in Web browsers. To summarize the
+reasons given above:
+
+- Internet Explorer (which, sadly, currently leads in market share)
+ has poor support for XHTML.
+- Many JavaScript libraries also do not support XHTML, due to the more
+ complicated namespacing API it requires.
+- HTML5 adds several new features, including semantic tags and the
+ long-awaited ``<audio>`` and ``<video>`` tags.
+- It has the support of most browser vendors behind it.
+- It is much easier to write, and more compact.
+
+For most applications, it is undoubtedly better to use HTML5 than XHTML.
diff --git a/app/static/doc/flask-docs/_sources/index.txt b/app/static/doc/flask-docs/_sources/index.txt
new file mode 100644
index 0000000..c4ded1f
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/index.txt
@@ -0,0 +1,30 @@
+:orphan:
+
+Welcome to Flask
+================
+
+.. image:: _static/logo-full.png
+ :alt: Flask: web development, one drop at a time
+ :class: floatingflask
+
+Welcome to Flask's documentation. This documentation is divided into
+different parts. I recommend that you get started with
+:ref:`installation` and then head over to the :ref:`quickstart`.
+Besides the quickstart there is also a more detailed :ref:`tutorial` that
+shows how to create a complete (albeit small) application with Flask. If
+you'd rather dive into the internals of Flask, check out
+the :ref:`api` documentation. Common patterns are described in the
+:ref:`patterns` section.
+
+Flask depends on two external libraries: the `Jinja2`_ template
+engine and the `Werkzeug`_ WSGI toolkit. These libraries are not documented
+here. If you want to dive into their documentation check out the
+following links:
+
+- `Jinja2 Documentation <http://jinja.pocoo.org/2/documentation/>`_
+- `Werkzeug Documentation <http://werkzeug.pocoo.org/documentation/>`_
+
+.. _Jinja2: http://jinja.pocoo.org/2/
+.. _Werkzeug: http://werkzeug.pocoo.org/
+
+.. include:: contents.rst.inc
diff --git a/app/static/doc/flask-docs/_sources/installation.txt b/app/static/doc/flask-docs/_sources/installation.txt
new file mode 100644
index 0000000..eb645bd
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/installation.txt
@@ -0,0 +1,175 @@
+.. _installation:
+
+Installation
+============
+
+Flask depends on two external libraries, `Werkzeug
+<http://werkzeug.pocoo.org/>`_ and `Jinja2 <http://jinja.pocoo.org/2/>`_.
+Werkzeug is a toolkit for WSGI, the standard Python interface between web
+applications and a variety of servers for both development and deployment.
+Jinja2 renders templates.
+
+So how do you get all that on your computer quickly? There are many ways
+which this section will explain, but the most kick-ass method is
+virtualenv, so let's look at that first.
+
+Either way, you will need Python 2.5 or higher to get started, so be sure
+to have an up to date Python 2.x installation. At the time of writing,
+the WSGI specification is not yet finalized for Python 3, so Flask cannot
+support the 3.x series of Python.
+
+.. _virtualenv:
+
+virtualenv
+----------
+
+Virtualenv is probably what you want to use during development, and in
+production too if you have shell access there.
+
+What problem does virtualenv solve? If you like Python as I do,
+chances are you want to use it for other projects besides Flask-based
+web applications. But the more projects you have, the more likely it is
+that you will be working with different versions of Python itself, or at
+least different versions of Python libraries. Let's face it; quite often
+libraries break backwards compatibility, and it's unlikely that any serious
+application will have zero dependencies. So what do you do if two or more
+of your projects have conflicting dependencies?
+
+Virtualenv to the rescue! It basically enables multiple side-by-side
+installations of Python, one for each project. It doesn't actually
+install separate copies of Python, but it does provide a clever way
+to keep different project environments isolated.
+
+So let's see how virtualenv works!
+
+If you are on Mac OS X or Linux, chances are that one of the following two
+commands will work for you::
+
+ $ sudo easy_install virtualenv
+
+or even better::
+
+ $ sudo pip install virtualenv
+
+One of these will probably install virtualenv on your system. Maybe it's
+even in your package manager. If you use Ubuntu, try::
+
+ $ sudo apt-get install python-virtualenv
+
+If you are on Windows and don't have the `easy_install` command, you must
+install it first. Check the :ref:`windows-easy-install` section for more
+information about how to do that. Once you have it installed, run the
+same commands as above, but without the `sudo` prefix.
+
+Once you have virtualenv installed, just fire up a shell and create
+your own environment. I usually create a project folder and an `env`
+folder within::
+
+ $ mkdir myproject
+ $ cd myproject
+ $ virtualenv env
+ New python executable in env/bin/python
+ Installing setuptools............done.
+
+Now, whenever you want to work on a project, you only have to activate
+the corresponding environment. On OS X and Linux, do the following::
+
+ $ . env/bin/activate
+
+(Note the space between the dot and the script name. The dot means that
+this script should run in the context of the current shell. If this command
+does not work in your shell, try replacing the dot with ``source``)
+
+If you are a Windows user, the following command is for you::
+
+ $ env\scripts\activate
+
+Either way, you should now be using your virtualenv (see how the prompt of
+your shell has changed to show the virtualenv).
+
+Now you can just enter the following command to get Flask activated in
+your virtualenv::
+
+ $ easy_install Flask
+
+A few seconds later you are good to go.
+
+
+System Wide Installation
+------------------------
+
+This is possible as well, but I do not recommend it. Just run
+`easy_install` with root rights::
+
+ $ sudo easy_install Flask
+
+(Run it in an Admin shell on Windows systems and without `sudo`).
+
+
+Living on the Edge
+------------------
+
+If you want to work with the latest version of Flask, there are two ways: you
+can either let `easy_install` pull in the development version, or tell it
+to operate on a git checkout. Either way, virtualenv is recommended.
+
+Get the git checkout in a new virtualenv and run in development mode::
+
+ $ git clone http://github.com/mitsuhiko/flask.git
+ Initialized empty Git repository in ~/dev/flask/.git/
+ $ cd flask
+ $ virtualenv env
+ $ . env/bin/activate
+ New python executable in env/bin/python
+ Installing setuptools............done.
+ $ python setup.py develop
+ ...
+ Finished processing dependencies for Flask
+
+This will pull in the dependencies and activate the git head as the current
+version inside the virtualenv. Then you just have to ``git pull origin``
+to get the latest version.
+
+To just get the development version without git, do this instead::
+
+ $ mkdir flask
+ $ cd flask
+ $ virtualenv env
+ $ . env/bin/activate
+ New python executable in env/bin/python
+ Installing setuptools............done.
+ $ easy_install Flask==dev
+ ...
+ Finished processing dependencies for Flask==dev
+
+.. _windows-easy-install:
+
+`easy_install` on Windows
+-------------------------
+
+On Windows, installation of `easy_install` is a little bit trickier because
+slightly different rules apply on Windows than on Unix-like systems, but
+it's not difficult. The easiest way to do it is to download the
+`ez_setup.py`_ file and run it. The easiest way to run the file is to
+open your downloads folder and double-click on the file.
+
+Next, add the `easy_install` command and other Python scripts to the
+command search path, by adding your Python installation's Scripts folder
+to the `PATH` environment variable. To do that, right-click on the
+"Computer" icon on the Desktop or in the Start menu, and choose
+"Properties". Then, on Windows Vista and Windows 7 click on "Advanced System
+settings"; on Windows XP, click on the "Advanced" tab instead. Then click
+on the "Environment variables" button and double click on the "Path"
+variable in the "System variables" section. There append the path of your
+Python interpreter's Scripts folder; make sure you delimit it from
+existing values with a semicolon. Assuming you are using Python 2.6 on
+the default path, add the following value::
+
+ ;C:\Python26\Scripts
+
+Then you are done. To check that it worked, open the Command Prompt and
+execute ``easy_install``. If you have User Account Control enabled on
+Windows Vista or Windows 7, it should prompt you for admin privileges.
+
+
+.. _ez_setup.py: http://peak.telecommunity.com/dist/ez_setup.py
diff --git a/app/static/doc/flask-docs/_sources/latexindex.txt b/app/static/doc/flask-docs/_sources/latexindex.txt
new file mode 100644
index 0000000..288197c
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/latexindex.txt
@@ -0,0 +1,6 @@
+:orphan:
+
+Flask Documentation
+===================
+
+.. include:: contents.rst.inc
diff --git a/app/static/doc/flask-docs/_sources/license.txt b/app/static/doc/flask-docs/_sources/license.txt
new file mode 100644
index 0000000..38777e6
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/license.txt
@@ -0,0 +1,48 @@
+License
+=======
+
+Flask is licensed under a three clause BSD License. It basically means:
+do whatever you want with it as long as the copyright in Flask sticks
+around, the conditions are not modified and the disclaimer is present.
+Furthermore you must not use the names of the authors to promote derivatives
+of the software without written consent.
+
+The full license text can be found below (:ref:`flask-license`). For the
+documentation and artwork different licenses apply.
+
+.. _authors:
+
+Authors
+-------
+
+.. include:: ../AUTHORS
+
+General License Definitions
+---------------------------
+
+The following section contains the full license texts for Flask and the
+documentation.
+
+- "AUTHORS" hereby refers to all the authors listed in the
+ :ref:`authors` section.
+
+- The ":ref:`flask-license`" applies to all the sourcecode shipped as
+ part of Flask (Flask itself as well as the examples and the unittests)
+ as well as documentation.
+
+- The ":ref:`artwork-license`" applies to the project's Horn-Logo.
+
+.. _flask-license:
+
+Flask License
+-------------
+
+.. include:: ../LICENSE
+
+
+.. _artwork-license:
+
+Flask Artwork License
+---------------------
+
+.. include:: ../artwork/LICENSE
diff --git a/app/static/doc/flask-docs/_sources/patterns/appdispatch.txt b/app/static/doc/flask-docs/_sources/patterns/appdispatch.txt
new file mode 100644
index 0000000..93b4af9
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/appdispatch.txt
@@ -0,0 +1,170 @@
+.. _app-dispatch:
+
+Application Dispatching
+=======================
+
+Application dispatching is the process of combining multiple Flask
+applications on the WSGI level. You can not only combine Flask
+applications into something larger but any WSGI application. This would
+even allow you to run a Django and a Flask application in the same
+interpreter side by side if you want. The usefulness of this depends on
+how the applications work internally.
+
+The fundamental difference from the :ref:`module approach
+<larger-applications>` is that in this case you are running the same or
+different Flask applications that are entirely isolated from each other.
+They run different configurations and are dispatched on the WSGI level.
+
+
+Working with this Document
+--------------------------
+
+Each of the techniques and examples below results in an ``application`` object
+that can be run with any WSGI server. For production, see :ref:`deployment`.
+For development, Werkzeug provides a builtin server for development available
+at :func:`werkzeug.serving.run_simple`::
+
+ from werkzeug.serving import run_simple
+ run_simple('localhost', 5000, application, use_reloader=True)
+
+Note that :func:`run_simple <werkzeug.serving.run_simple>` is not intended for
+use in production. Use a :ref:`full-blown WSGI server <deployment>`.
+
+
+Combining Applications
+----------------------
+
+If you have entirely separated applications and you want them to work next
+to each other in the same Python interpreter process you can take
+advantage of the :class:`werkzeug.wsgi.DispatcherMiddleware`. The idea
+here is that each Flask application is a valid WSGI application and they
+are combined by the dispatcher middleware into a larger one that
+dispatched based on prefix.
+
+For example you could have your main application run on `/` and your
+backend interface on `/backend`::
+
+ from werkzeug.wsgi import DispatcherMiddleware
+ from frontend_app import application as frontend
+ from backend_app import application as backend
+
+ application = DispatcherMiddleware(frontend, {
+ '/backend': backend
+ })
+
+
+Dispatch by Subdomain
+---------------------
+
+Sometimes you might want to use multiple instances of the same application
+with different configurations. Assuming the application is created inside
+a function and you can call that function to instanciate it, that is
+really easy to implement. In order to develop your application to support
+creating new instances in functions have a look at the
+:ref:`app-factories` pattern.
+
+A very common example would be creating applications per subdomain. For
+instance you configure your webserver to dispatch all requests for all
+subdomains to your application and you then use the subdomain information
+to create user-specific instances. Once you have your server set up to
+listen on all subdomains you can use a very simple WSGI application to do
+the dynamic application creation.
+
+The perfect level for abstraction in that regard is the WSGI layer. You
+write your own WSGI application that looks at the request that comes and
+and delegates it to your Flask application. If that application does not
+exist yet, it is dynamically created and remembered::
+
+ from threading import Lock
+
+ class SubdomainDispatcher(object):
+
+ def __init__(self, domain, create_app):
+ self.domain = domain
+ self.create_app = create_app
+ self.lock = Lock()
+ self.instances = {}
+
+ def get_application(self, host):
+ host = host.split(':')[0]
+ assert host.endswith(self.domain), 'Configuration error'
+ subdomain = host[:-len(self.domain)].rstrip('.')
+ with self.lock:
+ app = self.instances.get(subdomain)
+ if app is None:
+ app = self.create_app(subdomain)
+ self.instances[subdomain] = app
+ return app
+
+ def __call__(self, environ, start_response):
+ app = self.get_application(environ['HTTP_HOST'])
+ return app(environ, start_response)
+
+
+This dispatcher can then be used like this::
+
+ from myapplication import create_app, get_user_for_subdomain
+ from werkzeug.exceptions import NotFound
+
+ def make_app(subdomain):
+ user = get_user_for_subdomain(subdomain)
+ if user is None:
+ # if there is no user for that subdomain we still have
+ # to return a WSGI application that handles that request.
+ # We can then just return the NotFound() exception as
+ # application which will render a default 404 page.
+ # You might also redirect the user to the main page then
+ return NotFound()
+
+ # otherwise create the application for the specific user
+ return create_app(user)
+
+ application = SubdomainDispatcher('example.com', make_app)
+
+
+Dispatch by Path
+----------------
+
+Dispatching by a path on the URL is very similar. Instead of looking at
+the `Host` header to figure out the subdomain one simply looks at the
+request path up to the first slash::
+
+ from threading import Lock
+ from werkzeug.wsgi import pop_path_info, peek_path_info
+
+ class PathDispatcher(object):
+
+ def __init__(self, default_app, create_app):
+ self.default_app = default_app
+ self.create_app = create_app
+ self.lock = Lock()
+ self.instances = {}
+
+ def get_application(self, prefix):
+ with self.lock:
+ app = self.instances.get(prefix)
+ if app is None:
+ app = self.create_app(prefix)
+ if app is not None:
+ self.instances[prefix] = app
+ return app
+
+ def __call__(self, environ, start_response):
+ app = self.get_application(peek_path_info(environ))
+ if app is not None:
+ pop_path_info(environ)
+ else:
+ app = self.default_app
+ return app(environ, start_response)
+
+The big difference between this and the subdomain one is that this one
+falls back to another application if the creator function returns `None`::
+
+ from myapplication import create_app, default_app, get_user_for_prefix
+
+ def make_app(prefix):
+ user = get_user_for_prefix(prefix)
+ if user is not None:
+ return create_app(user)
+
+ application = PathDispatcher(default_app, make_app)
diff --git a/app/static/doc/flask-docs/_sources/patterns/appfactories.txt b/app/static/doc/flask-docs/_sources/patterns/appfactories.txt
new file mode 100644
index 0000000..2a6190e
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/appfactories.txt
@@ -0,0 +1,75 @@
+.. _app-factories:
+
+Application Factories
+=====================
+
+If you are already using packages and blueprints for your application
+(:ref:`blueprints`) there are a couple of really nice ways to further improve
+the experience. A common pattern is creating the application object when
+the blueprint is imported. But if you move the creation of this object,
+into a function, you can then create multiple instances of this and later.
+
+So why would you want to do this?
+
+1. Testing. You can have instances of the application with different
+ settings to test every case.
+2. Multiple instances. Imagine you want to run different versions of the
+ same application. Of course you could have multiple instances with
+ different configs set up in your webserver, but if you use factories,
+ you can have multiple instances of the same application running in the
+ same application process which can be handy.
+
+So how would you then actually implement that?
+
+Basic Factories
+---------------
+
+The idea is to set up the application in a function. Like this::
+
+ def create_app(config_filename):
+ app = Flask(__name__)
+ app.config.from_pyfile(config_filename)
+
+ from yourapplication.views.admin import admin
+ from yourapplication.views.frontend import frontend
+ app.register_blueprint(admin)
+ app.register_blueprint(frontend)
+
+ return app
+
+The downside is that you cannot use the application object in the blueprints
+at import time. You can however use it from within a request. How do you
+get access to the application with the config? Use
+:data:`~flask.current_app`::
+
+ from flask import current_app, Blueprint, render_template
+ admin = Blueprint('admin', __name__, url_prefix='/admin')
+
+ @admin.route('/')
+ def index():
+ return render_template(current_app.config['INDEX_TEMPLATE'])
+
+Here we look up the name of a template in the config.
+
+Using Applications
+------------------
+
+So to use such an application you then have to create the application
+first. Here an example `run.py` file that runs such an application::
+
+ from yourapplication import create_app
+ app = create_app('/path/to/config.cfg')
+ app.run()
+
+Factory Improvements
+--------------------
+
+The factory function from above is not very clever so far, you can improve
+it. The following changes are straightforward and possible:
+
+1. make it possible to pass in configuration values for unittests so that
+ you don't have to create config files on the filesystem
+2. call a function from a blueprint when the application is setting up so
+ that you have a place to modify attributes of the application (like
+ hooking in before / after request handlers etc.)
+3. Add in WSGI middlewares when the application is creating if necessary.
diff --git a/app/static/doc/flask-docs/_sources/patterns/caching.txt b/app/static/doc/flask-docs/_sources/patterns/caching.txt
new file mode 100644
index 0000000..5817aa2
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/caching.txt
@@ -0,0 +1,69 @@
+.. _caching-pattern:
+
+Caching
+=======
+
+When your application runs slow, throw some caches in. Well, at least
+it's the easiest way to speed up things. What does a cache do? Say you
+have a function that takes some time to complete but the results would
+still be good enough if they were 5 minutes old. So then the idea is that
+you actually put the result of that calculation into a cache for some
+time.
+
+Flask itself does not provide caching for you, but Werkzeug, one of the
+libraries it is based on, has some very basic cache support. It supports
+multiple cache backends, normally you want to use a memcached server.
+
+Setting up a Cache
+------------------
+
+You create a cache object once and keep it around, similar to how
+:class:`~flask.Flask` objects are created. If you are using the
+development server you can create a
+:class:`~werkzeug.contrib.cache.SimpleCache` object, that one is a simple
+cache that keeps the item stored in the memory of the Python interpreter::
+
+ from werkzeug.contrib.cache import SimpleCache
+ cache = SimpleCache()
+
+If you want to use memcached, make sure to have one of the memcache modules
+supported (you get them from `PyPI <http://pypi.python.org/>`_) and a
+memcached server running somewhere. This is how you connect to such an
+memcached server then::
+
+ from werkzeug.contrib.cache import MemcachedCache
+ cache = MemcachedCache(['127.0.0.1:11211'])
+
+If you are using App Engine, you can connect to the App Engine memcache
+server easily::
+
+ from werkzeug.contrib.cache import GAEMemcachedCache
+ cache = GAEMemcachedCache()
+
+Using a Cache
+-------------
+
+Now how can one use such a cache? There are two very important
+operations: :meth:`~werkzeug.contrib.cache.BaseCache.get` and
+:meth:`~werkzeug.contrib.cache.BaseCache.set`. This is how to use them:
+
+To get an item from the cache call
+:meth:`~werkzeug.contrib.cache.BaseCache.get` with a string as key name.
+If something is in the cache, it is returned. Otherwise that function
+will return `None`::
+
+ rv = cache.get('my-item')
+
+To add items to the cache, use the :meth:`~werkzeug.contrib.cache.BaseCache.set`
+method instead. The first argument is the key and the second the value
+that should be set. Also a timeout can be provided after which the cache
+will automatically remove item.
+
+Here a full example how this looks like normally::
+
+ def get_my_item():
+ rv = cache.get('my-item')
+ if rv is None:
+ rv = calculate_value()
+ cache.set('my-item', rv, timeout=5 * 60)
+ return rv
diff --git a/app/static/doc/flask-docs/_sources/patterns/deferredcallbacks.txt b/app/static/doc/flask-docs/_sources/patterns/deferredcallbacks.txt
new file mode 100644
index 0000000..917c512
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/deferredcallbacks.txt
@@ -0,0 +1,73 @@
+.. _deferred-callbacks:
+
+Deferred Request Callbacks
+==========================
+
+One of the design principles of Flask is that response objects are created
+and passed down a chain of potential callbacks that can modify them or
+replace them. When the request handling starts, there is no response
+object yet. It is created as necessary either by a view function or by
+some other component in the system.
+
+But what happens if you want to modify the response at a point where the
+response does not exist yet? A common example for that would be a
+before-request function that wants to set a cookie on the response object.
+
+One way is to avoid the situation. Very often that is possible. For
+instance you can try to move that logic into an after-request callback
+instead. Sometimes however moving that code there is just not a very
+pleasant experience or makes code look very awkward.
+
+As an alternative possibility you can attach a bunch of callback functions
+to the :data:`~flask.g` object and call then at the end of the request.
+This way you can defer code execution from anywhere in the application.
+
+
+The Decorator
+-------------
+
+The following decorator is the key. It registers a function on a list on
+the :data:`~flask.g` object::
+
+ from flask import g
+
+ def after_this_request(f):
+ if not hasattr(g, 'after_request_callbacks'):
+ g.after_request_callbacks = []
+ g.after_request_callbacks.append(f)
+ return f
+
+
+Calling the Deferred
+--------------------
+
+Now you can use the `after_this_request` decorator to mark a function to
+be called at the end of the request. But we still need to call them. For
+this the following function needs to be registered as
+:meth:`~flask.Flask.after_request` callback::
+
+ @app.after_request
+ def call_after_request_callbacks(response):
+ for callback in getattr(g, 'after_request_callbacks', ()):
+ response = callback(response)
+ return response
+
+
+A Practical Example
+-------------------
+
+Now we can easily at any point in time register a function to be called at
+the end of this particular request. For example you can remember the
+current language of the user in a cookie in the before-request function::
+
+ from flask import request
+
+ @app.before_request
+ def detect_user_language():
+ language = request.cookies.get('user_lang')
+ if language is None:
+ language = guess_language_from_request()
+ @after_this_request
+ def remember_language(response):
+ response.set_cookie('user_lang', language)
+ g.language = language
diff --git a/app/static/doc/flask-docs/_sources/patterns/distribute.txt b/app/static/doc/flask-docs/_sources/patterns/distribute.txt
new file mode 100644
index 0000000..b6f6a5e
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/distribute.txt
@@ -0,0 +1,166 @@
+.. _distribute-deployment:
+
+Deploying with Distribute
+=========================
+
+`distribute`_, formerly setuptools, is an extension library that is
+commonly used to (like the name says) distribute Python libraries and
+extensions. It extends distutils, a basic module installation system
+shipped with Python to also support various more complex constructs that
+make larger applications easier to distribute:
+
+- **support for dependencies**: a library or application can declare a
+ list of other libraries it depends on which will be installed
+ automatically for you.
+- **package registry**: setuptools registers your package with your
+ Python installation. This makes it possible to query information
+ provided by one package from another package. The best known feature of
+ this system is the entry point support which allows one package to
+ declare an "entry point" another package can hook into to extend the
+ other package.
+- **installation manager**: `easy_install`, which comes with distribute
+ can install other libraries for you. You can also use `pip`_ which
+ sooner or later will replace `easy_install` which does more than just
+ installing packages for you.
+
+Flask itself, and all the libraries you can find on the cheeseshop
+are distributed with either distribute, the older setuptools or distutils.
+
+In this case we assume your application is called
+`yourapplication.py` and you are not using a module, but a :ref:`package
+<larger-applications>`. Distributing resources with standard modules is
+not supported by `distribute`_ so we will not bother with it. If you have
+not yet converted your application into a package, head over to the
+:ref:`larger-applications` pattern to see how this can be done.
+
+A working deployment with distribute is the first step into more complex
+and more automated deployment scenarios. If you want to fully automate
+the process, also read the :ref:`fabric-deployment` chapter.
+
+Basic Setup Script
+------------------
+
+Because you have Flask running, you either have setuptools or distribute
+available on your system anyways. If you do not, fear not, there is a
+script to install it for you: `distribute_setup.py`_. Just download and
+run with your Python interpreter.
+
+Standard disclaimer applies: :ref:`you better use a virtualenv
+<virtualenv>`.
+
+Your setup code always goes into a file named `setup.py` next to your
+application. The name of the file is only convention, but because
+everybody will look for a file with that name, you better not change it.
+
+Yes, even if you are using `distribute`, you are importing from a package
+called `setuptools`. `distribute` is fully backwards compatible with
+`setuptools`, so it also uses the same import name.
+
+A basic `setup.py` file for a Flask application looks like this::
+
+ from setuptools import setup
+
+ setup(
+ name='Your Application',
+ version='1.0',
+ long_description=__doc__,
+ packages=['yourapplication'],
+ include_package_data=True,
+ zip_safe=False,
+ install_requires=['Flask']
+ )
+
+Please keep in mind that you have to list subpackages explicitly. If you
+want distribute to lookup the packages for you automatically, you can use
+the `find_packages` function::
+
+ from setuptools import setup, find_packages
+
+ setup(
+ ...
+ packages=find_packages()
+ )
+
+Most parameters to the `setup` function should be self explanatory,
+`include_package_data` and `zip_safe` might not be.
+`include_package_data` tells distribute to look for a `MANIFEST.in` file
+and install all the entries that match as package data. We will use this
+to distribute the static files and templates along with the Python module
+(see :ref:`distributing-resources`). The `zip_safe` flag can be used to
+force or prevent zip Archive creation. In general you probably don't want
+your packages to be installed as zip files because some tools do not
+support them and they make debugging a lot harder.
+
+
+.. _distributing-resources:
+
+Distributing Resources
+----------------------
+
+If you try to install the package you just created, you will notice that
+folders like `static` or `templates` are not installed for you. The
+reason for this is that distribute does not know which files to add for
+you. What you should do, is to create a `MANIFEST.in` file next to your
+`setup.py` file. This file lists all the files that should be added to
+your tarball::
+
+ recursive-include yourapplication/templates *
+ recursive-include yourapplication/static *
+
+Don't forget that even if you enlist them in your `MANIFEST.in` file, they
+won't be installed for you unless you set the `include_package_data`
+parameter of the `setup` function to `True`!
+
+
+Declaring Dependencies
+----------------------
+
+Dependencies are declared in the `install_requires` parameter as list.
+Each item in that list is the name of a package that should be pulled from
+PyPI on installation. By default it will always use the most recent
+version, but you can also provide minimum and maximum version
+requirements. Here some examples::
+
+ install_requires=[
+ 'Flask>=0.2',
+ 'SQLAlchemy>=0.6',
+ 'BrokenPackage>=0.7,<=1.0'
+ ]
+
+I mentioned earlier that dependencies are pulled from PyPI. What if you
+want to depend on a package that cannot be found on PyPI and won't be
+because it is an internal package you don't want to share with anyone?
+Just still do as if there was a PyPI entry for it and provide a list of
+alternative locations where distribute should look for tarballs::
+
+ dependency_links=['http://example.com/yourfiles']
+
+Make sure that page has a directory listing and the links on the page are
+pointing to the actual tarballs with their correct filenames as this is
+how distribute will find the files. If you have an internal company
+server that contains the packages, provide the URL to that server there.
+
+
+Installing / Developing
+-----------------------
+
+To install your application (ideally into a virtualenv) just run the
+`setup.py` script with the `install` parameter. It will install your
+application into the virtualenv's site-packages folder and also download
+and install all dependencies::
+
+ $ python setup.py install
+
+If you are developing on the package and also want the requirements to be
+installed, you can use the `develop` command instead::
+
+ $ python setup.py develop
+
+This has the advantage of just installing a link to the site-packages
+folder instead of copying the data over. You can then continue to work on
+the code without having to run `install` again after each change.
+
+
+.. _distribute: http://pypi.python.org/pypi/distribute
+.. _pip: http://pypi.python.org/pypi/pip
+.. _distribute_setup.py: http://python-distribute.org/distribute_setup.py
diff --git a/app/static/doc/flask-docs/_sources/patterns/errorpages.txt b/app/static/doc/flask-docs/_sources/patterns/errorpages.txt
new file mode 100644
index 0000000..ddf73c9
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/errorpages.txt
@@ -0,0 +1,77 @@
+Custom Error Pages
+==================
+
+Flask comes with a handy :func:`~flask.abort` function that aborts a
+request with an HTTP error code early. It will also provide a plain black
+and white error page for you with a basic description, but nothing fancy.
+
+Depending on the error code it is less or more likely for the user to
+actually see such an error.
+
+Common Error Codes
+------------------
+
+The following error codes are some that are often displayed to the user,
+even if the application behaves correctly:
+
+*404 Not Found*
+ The good old "chap, you made a mistake typing that URL" message. So
+ common that even novices to the internet know that 404 means: damn,
+ the thing I was looking for is not there. It's a very good idea to
+ make sure there is actually something useful on a 404 page, at least a
+ link back to the index.
+
+*403 Forbidden*
+ If you have some kind of access control on your website, you will have
+ to send a 403 code for disallowed resources. So make sure the user
+ is not lost when they try to access a forbidden resource.
+
+*410 Gone*
+ Did you know that there the "404 Not Found" has a brother named "410
+ Gone"? Few people actually implement that, but the idea is that
+ resources that previously existed and got deleted answer with 410
+ instead of 404. If you are not deleting documents permanently from
+ the database but just mark them as deleted, do the user a favour and
+ use the 410 code instead and display a message that what they were
+ looking for was deleted for all eternity.
+
+*500 Internal Server Error*
+ Usually happens on programming errors or if the server is overloaded.
+ A terrible good idea to have a nice page there, because your
+ application *will* fail sooner or later (see also:
+ :ref:`application-errors`).
+
+
+Error Handlers
+--------------
+
+An error handler is a function, just like a view function, but it is
+called when an error happens and is passed that error. The error is most
+likely a :exc:`~werkzeug.exceptions.HTTPException`, but in one case it
+can be a different error: a handler for internal server errors will be
+passed other exception instances as well if they are uncaught.
+
+An error handler is registered with the :meth:`~flask.Flask.errorhandler`
+decorator and the error code of the exception. Keep in mind that Flask
+will *not* set the error code for you, so make sure to also provide the
+HTTP status code when returning a response.
+
+Here an example implementation for a "404 Page Not Found" exception::
+
+ from flask import render_template
+
+ @app.errorhandler(404)
+ def page_not_found(e):
+ return render_template('404.html'), 404
+
+An example template might be this:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block title %}Page Not Found{% endblock %}
+ {% block body %}
+ <h1>Page Not Found</h1>
+ <p>What you were looking for is just not there.
+ <p><a href="{{ url_for('index') }}">go somewhere nice</a>
+ {% endblock %}
diff --git a/app/static/doc/flask-docs/_sources/patterns/fabric.txt b/app/static/doc/flask-docs/_sources/patterns/fabric.txt
new file mode 100644
index 0000000..b02ad27
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/fabric.txt
@@ -0,0 +1,196 @@
+.. _fabric-deployment:
+
+Deploying with Fabric
+=====================
+
+`Fabric`_ is a tool for Python similar to Makefiles but with the ability
+to execute commands on a remote server. In combination with a properly
+set up Python package (:ref:`larger-applications`) and a good concept for
+configurations (:ref:`config`) it is very easy to deploy Flask
+applications to external servers.
+
+Before we get started, here a quick checklist of things we have to ensure
+upfront:
+
+- Fabric 1.0 has to be installed locally. This tutorial assumes the
+ latest version of Fabric.
+- The application already has to be a package and requires a working
+ `setup.py` file (:ref:`distribute-deployment`).
+- In the following example we are using `mod_wsgi` for the remote
+ servers. You can of course use your own favourite server there, but
+ for this example we chose Apache + `mod_wsgi` because it's very easy
+ to setup and has a simple way to reload applications without root
+ access.
+
+Creating the first Fabfile
+--------------------------
+
+A fabfile is what controls what Fabric executes. It is named `fabfile.py`
+and executed by the `fab` command. All the functions defined in that file
+will show up as `fab` subcommands. They are executed on one or more
+hosts. These hosts can be defined either in the fabfile or on the command
+line. In this case we will add them to the fabfile.
+
+This is a basic first example that has the ability to upload the current
+sourcecode to the server and install it into a pre-existing
+virtual environment::
+
+ from fabric.api import *
+
+ # the user to use for the remote commands
+ env.user = 'appuser'
+ # the servers where the commands are executed
+ env.hosts = ['server1.example.com', 'server2.example.com']
+
+ def pack():
+ # create a new source distribution as tarball
+ local('python setup.py sdist --formats=gztar', capture=False)
+
+ def deploy():
+ # figure out the release name and version
+ dist = local('python setup.py --fullname', capture=True).strip()
+ # upload the source tarball to the temporary folder on the server
+ put('dist/%s.tar.gz' % dist, '/tmp/yourapplication.tar.gz')
+ # create a place where we can unzip the tarball, then enter
+ # that directory and unzip it
+ run('mkdir /tmp/yourapplication')
+ with cd('/tmp/yourapplication'):
+ run('tar xzf /tmp/yourapplication.tar.gz')
+ # now setup the package with our virtual environment's
+ # python interpreter
+ run('/var/www/yourapplication/env/bin/python setup.py install')
+ # now that all is set up, delete the folder again
+ run('rm -rf /tmp/yourapplication /tmp/yourapplication.tar.gz')
+ # and finally touch the .wsgi file so that mod_wsgi triggers
+ # a reload of the application
+ run('touch /var/www/yourapplication.wsgi')
+
+The example above is well documented and should be straightforward. Here
+a recap of the most common commands fabric provides:
+
+- `run` - executes a command on a remote server
+- `local` - executes a command on the local machine
+- `put` - uploads a file to the remote server
+- `cd` - changes the directory on the serverside. This has to be used
+ in combination with the `with` statement.
+
+Running Fabfiles
+----------------
+
+Now how do you execute that fabfile? You use the `fab` command. To
+deploy the current version of the code on the remote server you would use
+this command::
+
+ $ fab pack deploy
+
+However this requires that our server already has the
+``/var/www/yourapplication`` folder created and
+``/var/www/yourapplication/env`` to be a virtual environment. Furthermore
+are we not creating the configuration or `.wsgi` file on the server. So
+how do we bootstrap a new server into our infrastructure?
+
+This now depends on the number of servers we want to set up. If we just
+have one application server (which the majority of applications will
+have), creating a command in the fabfile for this is overkill. But
+obviously you can do that. In that case you would probably call it
+`setup` or `bootstrap` and then pass the servername explicitly on the
+command line::
+
+ $ fab -H newserver.example.com bootstrap
+
+To setup a new server you would roughly do these steps:
+
+1. Create the directory structure in ``/var/www``::
+
+ $ mkdir /var/www/yourapplication
+ $ cd /var/www/yourapplication
+ $ virtualenv --distribute env
+
+2. Upload a new `application.wsgi` file to the server and the
+ configuration file for the application (eg: `application.cfg`)
+
+3. Create a new Apache config for `yourapplication` and activate it.
+ Make sure to activate watching for changes of the `.wsgi` file so
+ that we can automatically reload the application by touching it.
+ (See :ref:`mod_wsgi-deployment` for more information)
+
+So now the question is, where do the `application.wsgi` and
+`application.cfg` files come from?
+
+The WSGI File
+-------------
+
+The WSGI file has to import the application and also to set an environment
+variable so that the application knows where to look for the config. This
+is a short example that does exactly that::
+
+ import os
+ os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg'
+ from yourapplication import app
+
+The application itself then has to initialize itself like this to look for
+the config at that environment variable::
+
+ app = Flask(__name__)
+ app.config.from_object('yourapplication.default_config')
+ app.config.from_envvar('YOURAPPLICATION_CONFIG')
+
+This approach is explained in detail in the :ref:`config` section of the
+documentation.
+
+The Configuration File
+----------------------
+
+Now as mentioned above, the application will find the correct
+configuration file by looking up the `YOURAPPLICATION_CONFIG` environment
+variable. So we have to put the configuration in a place where the
+application will able to find it. Configuration files have the unfriendly
+quality of being different on all computers, so you do not version them
+usually.
+
+A popular approach is to store configuration files for different servers
+in a separate version control repository and check them out on all
+servers. Then symlink the file that is active for the server into the
+location where it's expected (eg: ``/var/www/yourapplication``).
+
+Either way, in our case here we only expect one or two servers and we can
+upload them ahead of time by hand.
+
+First Deployment
+----------------
+
+Now we can do our first deployment. We have set up the servers so that
+they have their virtual environments and activated apache configs. Now we
+can pack up the application and deploy it::
+
+ $ fab pack deploy
+
+Fabric will now connect to all servers and run the commands as written
+down in the fabfile. First it will execute pack so that we have our
+tarball ready and then it will execute deploy and upload the source code
+to all servers and install it there. Thanks to the `setup.py` file we
+will automatically pull in the required libraries into our virtual
+environment.
+
+Next Steps
+----------
+
+From that point onwards there is so much that can be done to make
+deployment actually fun:
+
+- Create a `bootstrap` command that initializes new servers. It could
+ initialize a new virtual environment, setup apache appropriately etc.
+- Put configuration files into a separate version control repository
+ and symlink the active configs into place.
+- You could also put your application code into a repository and check
+ out the latest version on the server and then install. That way you
+ can also easily go back to older versions.
+- hook in testing functionality so that you can deploy to an external
+ server and run the testsuite.
+
+Working with Fabric is fun and you will notice that it's quite magical to
+type ``fab deploy`` and see your application being deployed automatically
+to one or more remote servers.
+
+
+.. _Fabric: http://fabfile.org/
diff --git a/app/static/doc/flask-docs/_sources/patterns/favicon.txt b/app/static/doc/flask-docs/_sources/patterns/favicon.txt
new file mode 100644
index 0000000..f7b2f9c
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/favicon.txt
@@ -0,0 +1,53 @@
+Adding a favicon
+================
+
+A "favicon" is an icon used by browsers for tabs and bookmarks. This helps
+to distinguish your website and to give it a unique brand.
+
+A common question is how to add a favicon to a flask application. First, of
+course, you need an icon. It should be 16 × 16 pixels and in the ICO file
+format. This is not a requirement but a de-facto standard supported by all
+relevant browsers. Put the icon in your static directory as
+:file:`favicon.ico`.
+
+Now, to get browsers to find your icon, the correct way is to add a link
+tag in your HTML. So, for example:
+
+.. sourcecode:: html+jinja
+
+ <link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
+
+That's all you need for most browsers, however some really old ones do not
+support this standard. The old de-facto standard is to serve this file,
+with this name, at the website root. If your application is not mounted at
+the root path of the domain you either need to configure the webserver to
+serve the icon at the root or if you can't do that you're out of luck. If
+however your application is the root you can simply route a redirect::
+
+ app.add_url_rule('/favicon.ico',
+ redirect_to=url_for('static', filename='favicon.ico'))
+
+If you want to save the extra redirect request you can also write a view
+using :func:`~flask.send_from_directory`::
+
+ import os
+ from flask import send_from_directory
+
+ @app.route('/favicon.ico')
+ def favicon():
+ return send_from_directory(os.path.join(app.root_path, 'static'),
+ 'favicon.ico', mimetype='image/vnd.microsoft.icon')
+
+We can leave out the explicit mimetype and it will be guessed, but we may
+as well specify it to avoid the extra guessing, as it will always be the
+same.
+
+The above will serve the icon via your application and if possible it's
+better to configure your dedicated web server to serve it; refer to the
+webserver's documentation.
+
+See also
+--------
+
+* The `Favicon <http://en.wikipedia.org/wiki/Favicon>`_ article on
+ Wikipedia
diff --git a/app/static/doc/flask-docs/_sources/patterns/fileuploads.txt b/app/static/doc/flask-docs/_sources/patterns/fileuploads.txt
new file mode 100644
index 0000000..d237b10
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/fileuploads.txt
@@ -0,0 +1,181 @@
+.. _uploading-files:
+
+Uploading Files
+===============
+
+Ah yes, the good old problem of file uploads. The basic idea of file
+uploads is actually quite simple. It basically works like this:
+
+1. A ``<form>`` tag is marked with ``enctype=multipart/form-data``
+ and an ``<input type=file>`` is placed in that form.
+2. The application accesses the file from the :attr:`~flask.request.files`
+ dictionary on the request object.
+3. use the :meth:`~werkzeug.datastructures.FileStorage.save` method of the file to save
+ the file permanently somewhere on the filesystem.
+
+A Gentle Introduction
+---------------------
+
+Let's start with a very basic application that uploads a file to a
+specific upload folder and displays a file to the user. Let's look at the
+bootstrapping code for our application::
+
+ import os
+ from flask import Flask, request, redirect, url_for
+ from werkzeug import secure_filename
+
+ UPLOAD_FOLDER = '/path/to/the/uploads'
+ ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
+
+ app = Flask(__name__)
+ app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
+
+So first we need a couple of imports. Most should be straightforward, the
+:func:`werkzeug.secure_filename` is explained a little bit later. The
+`UPLOAD_FOLDER` is where we will store the uploaded files and the
+`ALLOWED_EXTENSIONS` is the set of allowed file extensions. Then we add a
+URL rule by hand to the application. Now usually we're not doing that, so
+why here? The reasons is that we want the webserver (or our development
+server) to serve these files for us and so we only need a rule to generate
+the URL to these files.
+
+Why do we limit the extensions that are allowed? You probably don't want
+your users to be able to upload everything there if the server is directly
+sending out the data to the client. That way you can make sure that users
+are not able to upload HTML files that would cause XSS problems (see
+:ref:`xss`). Also make sure to disallow `.php` files if the server
+executes them, but who has PHP installed on his server, right? :)
+
+Next the functions that check if an extension is valid and that uploads
+the file and redirects the user to the URL for the uploaded file::
+
+ def allowed_file(filename):
+ return '.' in filename and \
+ filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
+
+ @app.route('/', methods=['GET', 'POST'])
+ def upload_file():
+ if request.method == 'POST':
+ file = request.files['file']
+ if file and allowed_file(file.filename):
+ filename = secure_filename(file.filename)
+ file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
+ return redirect(url_for('uploaded_file',
+ filename=filename))
+ return '''
+ <!doctype html>
+ <title>Upload new File</title>
+ <h1>Upload new File</h1>
+ <form action="" method=post enctype=multipart/form-data>
+ <p><input type=file name=file>
+ <input type=submit value=Upload>
+ </form>
+ '''
+
+So what does that :func:`~werkzeug.utils.secure_filename` function actually do?
+Now the problem is that there is that principle called "never trust user
+input". This is also true for the filename of an uploaded file. All
+submitted form data can be forged, and filenames can be dangerous. For
+the moment just remember: always use that function to secure a filename
+before storing it directly on the filesystem.
+
+.. admonition:: Information for the Pros
+
+ So you're interested in what that :func:`~werkzeug.utils.secure_filename`
+ function does and what the problem is if you're not using it? So just
+ imagine someone would send the following information as `filename` to
+ your application::
+
+ filename = "../../../../home/username/.bashrc"
+
+ Assuming the number of ``../`` is correct and you would join this with
+ the `UPLOAD_FOLDER` the user might have the ability to modify a file on
+ the server's filesystem he or she should not modify. This does require some
+ knowledge about how the application looks like, but trust me, hackers
+ are patient :)
+
+ Now let's look how that function works:
+
+ >>> secure_filename('../../../../home/username/.bashrc')
+ 'home_username_.bashrc'
+
+Now one last thing is missing: the serving of the uploaded files. As of
+Flask 0.5 we can use a function that does that for us::
+
+ from flask import send_from_directory
+
+ @app.route('/uploads/<filename>')
+ def uploaded_file(filename):
+ return send_from_directory(app.config['UPLOAD_FOLDER'],
+ filename)
+
+Alternatively you can register `uploaded_file` as `build_only` rule and
+use the :class:`~werkzeug.wsgi.SharedDataMiddleware`. This also works with
+older versions of Flask::
+
+ from werkzeug import SharedDataMiddleware
+ app.add_url_rule('/uploads/<filename>', 'uploaded_file',
+ build_only=True)
+ app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
+ '/uploads': app.config['UPLOAD_FOLDER']
+ })
+
+If you now run the application everything should work as expected.
+
+
+Improving Uploads
+-----------------
+
+.. versionadded:: 0.6
+
+So how exactly does Flask handle uploads? Well it will store them in the
+webserver's memory if the files are reasonable small otherwise in a
+temporary location (as returned by :func:`tempfile.gettempdir`). But how
+do you specify the maximum file size after which an upload is aborted? By
+default Flask will happily accept file uploads to an unlimited amount of
+memory, but you can limit that by setting the ``MAX_CONTENT_LENGTH``
+config key::
+
+ from flask import Flask, Request
+
+ app = Flask(__name__)
+ app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
+
+The code above will limited the maximum allowed payload to 16 megabytes.
+If a larger file is transmitted, Flask will raise an
+:exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception.
+
+This feature was added in Flask 0.6 but can be achieved in older versions
+as well by subclassing the request object. For more information on that
+consult the Werkzeug documentation on file handling.
+
+
+Upload Progress Bars
+--------------------
+
+A while ago many developers had the idea to read the incoming file in
+small chunks and store the upload progress in the database to be able to
+poll the progress with JavaScript from the client. Long story short: the
+client asks the server every 5 seconds how much it has transmitted
+already. Do you realize the irony? The client is asking for something it
+should already know.
+
+Now there are better solutions to that work faster and more reliable. The
+web changed a lot lately and you can use HTML5, Java, Silverlight or Flash
+to get a nicer uploading experience on the client side. Look at the
+following libraries for some nice examples how to do that:
+
+- `Plupload <http://www.plupload.com/>`_ - HTML5, Java, Flash
+- `SWFUpload <http://www.swfupload.org/>`_ - Flash
+- `JumpLoader <http://jumploader.com/>`_ - Java
+
+
+An Easier Solution
+------------------
+
+Because the common pattern for file uploads exists almost unchanged in all
+applications dealing with uploads, there is a Flask extension called
+`Flask-Uploads`_ that implements a full fledged upload mechanism with
+white and blacklisting of extensions and more.
+
+.. _Flask-Uploads: http://packages.python.org/Flask-Uploads/
diff --git a/app/static/doc/flask-docs/_sources/patterns/flashing.txt b/app/static/doc/flask-docs/_sources/patterns/flashing.txt
new file mode 100644
index 0000000..7abe716
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/flashing.txt
@@ -0,0 +1,119 @@
+.. _message-flashing-pattern:
+
+Message Flashing
+================
+
+Good applications and user interfaces are all about feedback. If the user
+does not get enough feedback they will probably end up hating the
+application. Flask provides a really simple way to give feedback to a
+user with the flashing system. The flashing system basically makes it
+possible to record a message at the end of a request and access it next
+request and only next request. This is usually combined with a layout
+template that does this.
+
+Simple Flashing
+---------------
+
+So here is a full example::
+
+ from flask import flash, redirect, url_for, render_template
+
+ @app.route('/')
+ def index():
+ return render_template('index.html')
+
+ @app.route('/login', methods=['GET', 'POST'])
+ def login():
+ error = None
+ if request.method == 'POST':
+ if request.form['username'] != 'admin' or \
+ request.form['password'] != 'secret':
+ error = 'Invalid credentials'
+ else:
+ flash('You were successfully logged in')
+ return redirect(url_for('index'))
+ return render_template('login.html', error=error)
+
+And here the ``layout.html`` template which does the magic:
+
+.. sourcecode:: html+jinja
+
+ <!doctype html>
+ <title>My Application</title>
+ {% with messages = get_flashed_messages() %}
+ {% if messages %}
+ <ul class=flashes>
+ {% for message in messages %}
+ <li>{{ message }}</li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% endwith %}
+ {% block body %}{% endblock %}
+
+And here the index.html template:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block body %}
+ <h1>Overview</h1>
+ <p>Do you want to <a href="{{ url_for('login') }}">log in?</a>
+ {% endblock %}
+
+And of course the login template:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block body %}
+ <h1>Login</h1>
+ {% if error %}
+ <p class=error><strong>Error:</strong> {{ error }}
+ {% endif %}
+ <form action="" method=post>
+ <dl>
+ <dt>Username:
+ <dd><input type=text name=username value="{{
+ request.form.username }}">
+ <dt>Password:
+ <dd><input type=password name=password>
+ </dl>
+ <p><input type=submit value=Login>
+ </form>
+ {% endblock %}
+
+Flashing With Categories
+------------------------
+
+.. versionadded:: 0.3
+
+It is also possible to provide categories when flashing a message. The
+default category if nothing is provided is ``'message'``. Alternative
+categories can be used to give the user better feedback. For example
+error messages could be displayed with a red background.
+
+To flash a message with a different category, just use the second argument
+to the :func:`~flask.flash` function::
+
+ flash(u'Invalid password provided', 'error')
+
+Inside the template you then have to tell the
+:func:`~flask.get_flashed_messages` function to also return the
+categories. The loop looks slightly different in that situation then:
+
+.. sourcecode:: html+jinja
+
+ {% with messages = get_flashed_messages(with_categories=true) %}
+ {% if messages %}
+ <ul class=flashes>
+ {% for category, message in messages %}
+ <li class="{{ category }}">{{ message }}</li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% endwith %}
+
+This is just one example of how to render these flashed messages. One
+might also use the category to add a prefix such as
+``<strong>Error:</strong>`` to the message.
diff --git a/app/static/doc/flask-docs/_sources/patterns/index.txt b/app/static/doc/flask-docs/_sources/patterns/index.txt
new file mode 100644
index 0000000..964b1e1
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/index.txt
@@ -0,0 +1,39 @@
+.. _patterns:
+
+Patterns for Flask
+==================
+
+Certain things are common enough that the chances are high you will find
+them in most web applications. For example quite a lot of applications
+are using relational databases and user authentication. In that case,
+chances are they will open a database connection at the beginning of the
+request and get the information of the currently logged in user. At the
+end of the request, the database connection is closed again.
+
+There are more user contributed snippets and patterns in the `Flask
+Snippet Archives <http://flask.pocoo.org/snippets/>`_.
+
+.. toctree::
+ :maxdepth: 2
+
+ packages
+ appfactories
+ appdispatch
+ urlprocessors
+ distribute
+ fabric
+ sqlite3
+ sqlalchemy
+ fileuploads
+ caching
+ viewdecorators
+ wtforms
+ templateinheritance
+ flashing
+ jquery
+ errorpages
+ lazyloading
+ mongokit
+ favicon
+ streaming
+ deferredcallbacks
diff --git a/app/static/doc/flask-docs/_sources/patterns/jquery.txt b/app/static/doc/flask-docs/_sources/patterns/jquery.txt
new file mode 100644
index 0000000..f3c46e3
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/jquery.txt
@@ -0,0 +1,167 @@
+AJAX with jQuery
+================
+
+`jQuery`_ is a small JavaScript library commonly used to simplify working
+with the DOM and JavaScript in general. It is the perfect tool to make
+web applications more dynamic by exchanging JSON between server and
+client.
+
+JSON itself is a very lightweight transport format, very similar to how
+Python primitives (numbers, strings, dicts and lists) look like which is
+widely supported and very easy to parse. It became popular a few years
+ago and quickly replaced XML as transport format in web applications.
+
+If you have Python 2.6 JSON will work out of the box, in Python 2.5 you
+will have to install the `simplejson`_ library from PyPI.
+
+.. _jQuery: http://jquery.com/
+.. _simplejson: http://pypi.python.org/pypi/simplejson
+
+Loading jQuery
+--------------
+
+In order to use jQuery, you have to download it first and place it in the
+static folder of your application and then ensure it's loaded. Ideally
+you have a layout template that is used for all pages where you just have
+to add a script statement to the bottom of your `<body>` to load jQuery:
+
+.. sourcecode:: html
+
+ <script type=text/javascript src="{{
+ url_for('static', filename='jquery.js') }}"></script>
+
+Another method is using Google's `AJAX Libraries API
+<http://code.google.com/apis/ajaxlibs/documentation/>`_ to load jQuery:
+
+.. sourcecode:: html
+
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script>
+ <script>window.jQuery || document.write('<script src="{{
+ url_for('static', filename='jquery.js') }}">\x3C/script>')</script>
+
+In this case you have to put jQuery into your static folder as a fallback, but it will
+first try to load it directly from Google. This has the advantage that your
+website will probably load faster for users if they went to at least one
+other website before using the same jQuery version from Google because it
+will already be in the browser cache.
+
+Where is My Site?
+-----------------
+
+Do you know where your application is? If you are developing the answer
+is quite simple: it's on localhost port something and directly on the root
+of that server. But what if you later decide to move your application to
+a different location? For example to ``http://example.com/myapp``? On
+the server side this never was a problem because we were using the handy
+:func:`~flask.url_for` function that could answer that question for
+us, but if we are using jQuery we should not hardcode the path to
+the application but make that dynamic, so how can we do that?
+
+A simple method would be to add a script tag to our page that sets a
+global variable to the prefix to the root of the application. Something
+like this:
+
+.. sourcecode:: html+jinja
+
+ <script type=text/javascript>
+ $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
+ </script>
+
+The ``|safe`` is necessary so that Jinja does not escape the JSON encoded
+string with HTML rules. Usually this would be necessary, but we are
+inside a `script` block here where different rules apply.
+
+.. admonition:: Information for Pros
+
+ In HTML the `script` tag is declared `CDATA` which means that entities
+ will not be parsed. Everything until ``</script>`` is handled as script.
+ This also means that there must never be any ``</`` between the script
+ tags. ``|tojson`` is kind enough to do the right thing here and
+ escape slashes for you (``{{ "</script>"|tojson|safe }}`` is rendered as
+ ``"<\/script>"``).
+
+
+JSON View Functions
+-------------------
+
+Now let's create a server side function that accepts two URL arguments of
+numbers which should be added together and then sent back to the
+application in a JSON object. This is a really ridiculous example and is
+something you usually would do on the client side alone, but a simple
+example that shows how you would use jQuery and Flask nonetheless::
+
+ from flask import Flask, jsonify, render_template, request
+ app = Flask(__name__)
+
+ @app.route('/_add_numbers')
+ def add_numbers():
+ a = request.args.get('a', 0, type=int)
+ b = request.args.get('b', 0, type=int)
+ return jsonify(result=a + b)
+
+ @app.route('/')
+ def index():
+ return render_template('index.html')
+
+As you can see I also added an `index` method here that renders a
+template. This template will load jQuery as above and have a little form
+we can add two numbers and a link to trigger the function on the server
+side.
+
+Note that we are using the :meth:`~werkzeug.datastructures.MultiDict.get` method here
+which will never fail. If the key is missing a default value (here ``0``)
+is returned. Furthermore it can convert values to a specific type (like
+in our case `int`). This is especially handy for code that is
+triggered by a script (APIs, JavaScript etc.) because you don't need
+special error reporting in that case.
+
+The HTML
+--------
+
+Your index.html template either has to extend a `layout.html` template with
+jQuery loaded and the `$SCRIPT_ROOT` variable set, or do that on the top.
+Here's the HTML code needed for our little application (`index.html`).
+Notice that we also drop the script directly into the HTML here. It is
+usually a better idea to have that in a separate script file:
+
+.. sourcecode:: html
+
+ <script type=text/javascript>
+ $(function() {
+ $('a#calculate').bind('click', function() {
+ $.getJSON($SCRIPT_ROOT + '/_add_numbers', {
+ a: $('input[name="a"]').val(),
+ b: $('input[name="b"]').val()
+ }, function(data) {
+ $("#result").text(data.result);
+ });
+ return false;
+ });
+ });
+ </script>
+ <h1>jQuery Example</h1>
+ <p><input type=text size=5 name=a> +
+ <input type=text size=5 name=b> =
+ <span id=result>?</span>
+ <p><a href=# id=calculate>calculate server side</a>
+
+I won't got into detail here about how jQuery works, just a very quick
+explanation of the little bit of code above:
+
+1. ``$(function() { ... })`` specifies code that should run once the
+ browser is done loading the basic parts of the page.
+2. ``$('selector')`` selects an element and lets you operate on it.
+3. ``element.bind('event', func)`` specifies a function that should run
+ when the user clicked on the element. If that function returns
+ `false`, the default behaviour will not kick in (in this case, navigate
+ to the `#` URL).
+4. ``$.getJSON(url, data, func)`` sends a `GET` request to `url` and will
+ send the contents of the `data` object as query parameters. Once the
+ data arrived, it will call the given function with the return value as
+ argument. Note that we can use the `$SCRIPT_ROOT` variable here that
+ we set earlier.
+
+If you don't get the whole picture, download the `sourcecode
+for this example
+<http://github.com/mitsuhiko/flask/tree/master/examples/jqueryexample>`_
+from github.
diff --git a/app/static/doc/flask-docs/_sources/patterns/lazyloading.txt b/app/static/doc/flask-docs/_sources/patterns/lazyloading.txt
new file mode 100644
index 0000000..50ad6fa
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/lazyloading.txt
@@ -0,0 +1,104 @@
+Lazily Loading Views
+====================
+
+Flask is usually used with the decorators. Decorators are simple and you
+have the URL right next to the function that is called for that specific
+URL. However there is a downside to this approach: it means all your code
+that uses decorators has to be imported upfront or Flask will never
+actually find your function.
+
+This can be a problem if your application has to import quick. It might
+have to do that on systems like Google's App Engine or other systems. So
+if you suddenly notice that your application outgrows this approach you
+can fall back to a centralized URL mapping.
+
+The system that enables having a central URL map is the
+:meth:`~flask.Flask.add_url_rule` function. Instead of using decorators,
+you have a file that sets up the application with all URLs.
+
+Converting to Centralized URL Map
+---------------------------------
+
+Imagine the current application looks somewhat like this::
+
+ from flask import Flask
+ app = Flask(__name__)
+
+ @app.route('/')
+ def index():
+ pass
+
+ @app.route('/user/<username>')
+ def user(username):
+ pass
+
+Then the centralized approach you would have one file with the views
+(`views.py`) but without any decorator::
+
+ def index():
+ pass
+
+ def user(username):
+ pass
+
+And then a file that sets up an application which maps the functions to
+URLs::
+
+ from flask import Flask
+ from yourapplication import views
+ app = Flask(__name__)
+ app.add_url_rule('/', view_func=views.index)
+ app.add_url_rule('/user/<username>', view_func=views.user)
+
+Loading Late
+------------
+
+So far we only split up the views and the routing, but the module is still
+loaded upfront. The trick to actually load the view function as needed.
+This can be accomplished with a helper class that behaves just like a
+function but internally imports the real function on first use::
+
+ from werkzeug import import_string, cached_property
+
+ class LazyView(object):
+
+ def __init__(self, import_name):
+ self.__module__, self.__name__ = import_name.rsplit('.', 1)
+ self.import_name = import_name
+
+ @cached_property
+ def view(self):
+ return import_string(self.import_name)
+
+ def __call__(self, *args, **kwargs):
+ return self.view(*args, **kwargs)
+
+What's important here is is that `__module__` and `__name__` are properly
+set. This is used by Flask internally to figure out how to name the
+URL rules in case you don't provide a name for the rule yourself.
+
+Then you can define your central place to combine the views like this::
+
+ from flask import Flask
+ from yourapplication.helpers import LazyView
+ app = Flask(__name__)
+ app.add_url_rule('/',
+ view_func=LazyView('yourapplication.views.index'))
+ app.add_url_rule('/user/<username>',
+ view_func=LazyView('yourapplication.views.user'))
+
+You can further optimize this in terms of amount of keystrokes needed to
+write this by having a function that calls into
+:meth:`~flask.Flask.add_url_rule` by prefixing a string with the project
+name and a dot, and by wrapping `view_func` in a `LazyView` as needed::
+
+ def url(url_rule, import_name, **options):
+ view = LazyView('yourapplication.' + import_name)
+ app.add_url_rule(url_rule, view_func=view, **options)
+
+ url('/', 'views.index')
+ url('/user/<username>', 'views.user')
+
+One thing to keep in mind is that before and after request handlers have
+to be in a file that is imported upfront to work properly on the first
+request. The same goes for any kind of remaining decorator.
diff --git a/app/static/doc/flask-docs/_sources/patterns/mongokit.txt b/app/static/doc/flask-docs/_sources/patterns/mongokit.txt
new file mode 100644
index 0000000..a9c4eef
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/mongokit.txt
@@ -0,0 +1,144 @@
+.. mongokit-pattern:
+
+MongoKit in Flask
+=================
+
+Using a document database rather than a full DBMS gets more common these days.
+This pattern shows how to use MongoKit, a document mapper library, to
+integrate with MongoDB.
+
+This pattern requires a running MongoDB server and the MongoKit library
+installed.
+
+There are two very common ways to use MongoKit. I will outline each of them
+here:
+
+
+Declarative
+-----------
+
+The default behaviour of MongoKit is the declarative one that is based on
+common ideas from Django or the SQLAlchemy declarative extension.
+
+Here an example `app.py` module for your application::
+
+ from flask import Flask
+ from mongokit import Connection, Document
+
+ # configuration
+ MONGODB_HOST = 'localhost'
+ MONGODB_PORT = 27017
+
+ # create the little application object
+ app = Flask(__name__)
+ app.config.from_object(__name__)
+
+ # connect to the database
+ connection = Connection(app.config['MONGODB_HOST'],
+ app.config['MONGODB_PORT'])
+
+
+To define your models, just subclass the `Document` class that is imported
+from MongoKit. If you've seen the SQLAlchemy pattern you may wonder why we do
+not have a session and even do not define a `init_db` function here. On the
+one hand, MongoKit does not have something like a session. This sometimes
+makes it more to type but also makes it blazingly fast. On the other hand,
+MongoDB is schemaless. This means you can modify the data structure from one
+insert query to the next without any problem. MongoKit is just schemaless
+too, but implements some validation to ensure data integrity.
+
+Here is an example document (put this also into `app.py`, e.g.)::
+
+ def max_length(length):
+ def validate(value):
+ if len(value) <= length:
+ return True
+ raise Exception('%s must be at most %s characters long' % length)
+ return validate
+
+ class User(Document):
+ structure = {
+ 'name': unicode,
+ 'email': unicode,
+ }
+ validators = {
+ 'name': max_length(50),
+ 'email': max_length(120)
+ }
+ use_dot_notation = True
+ def __repr__(self):
+ return '<User %r>' % (self.name)
+
+ # register the User document with our current connection
+ connection.register([User])
+
+
+This example shows you how to define your schema (named structure), a
+validator for the maximum character length and uses a special MongoKit feature
+called `use_dot_notation`. Per default MongoKit behaves like a python
+dictionary but with `use_dot_notation` set to `True` you can use your
+documents like you use models in nearly any other ORM by using dots to
+separate between attributes.
+
+You can insert entries into the database like this:
+
+>>> from yourapplication.database import connection
+>>> from yourapplication.models import User
+>>> collection = connection['test'].users
+>>> user = collection.User()
+>>> user['name'] = u'admin'
+>>> user['email'] = u'admin@localhost'
+>>> user.save()
+
+Note that MongoKit is kinda strict with used column types, you must not use a
+common `str` type for either `name` or `email` but unicode.
+
+Querying is simple as well:
+
+>>> list(collection.User.find())
+[<User u'admin'>]
+>>> collection.User.find_one({'name': u'admin'})
+<User u'admin'>
+
+.. _MongoKit: http://bytebucket.org/namlook/mongokit/
+
+
+PyMongo Compatibility Layer
+---------------------------
+
+If you just want to use PyMongo, you can do that with MongoKit as well. You
+may use this process if you need the best performance to get. Note that this
+example does not show how to couple it with Flask, see the above MongoKit code
+for examples::
+
+ from MongoKit import Connection
+
+ connection = Connection()
+
+To insert data you can use the `insert` method. We have to get a
+collection first, this is somewhat the same as a table in the SQL world.
+
+>>> collection = connection['test'].users
+>>> user = {'name': u'admin', 'email': u'admin@localhost'}
+>>> collection.insert(user)
+
+print list(collection.find())
+print collection.find_one({'name': u'admin'})
+
+MongoKit will automatically commit for us.
+
+To query your database, you use the collection directly:
+
+>>> list(collection.find())
+[{u'_id': ObjectId('4c271729e13823182f000000'), u'name': u'admin', u'email': u'admin@localhost'}]
+>>> collection.find_one({'name': u'admin'})
+{u'_id': ObjectId('4c271729e13823182f000000'), u'name': u'admin', u'email': u'admin@localhost'}
+
+These results are also dict-like objects:
+
+>>> r = collection.find_one({'name': u'admin'})
+>>> r['email']
+u'admin@localhost'
+
+For more information about MongoKit, head over to the
+`website <http://bytebucket.org/namlook/mongokit/>`_.
diff --git a/app/static/doc/flask-docs/_sources/patterns/packages.txt b/app/static/doc/flask-docs/_sources/patterns/packages.txt
new file mode 100644
index 0000000..79fd2c5
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/packages.txt
@@ -0,0 +1,115 @@
+.. _larger-applications:
+
+Larger Applications
+===================
+
+For larger applications it's a good idea to use a package instead of a
+module. That is quite simple. Imagine a small application looks like
+this::
+
+ /yourapplication
+ /yourapplication.py
+ /static
+ /style.css
+ /templates
+ layout.html
+ index.html
+ login.html
+ ...
+
+Simple Packages
+---------------
+
+To convert that into a larger one, just create a new folder
+`yourapplication` inside the existing one and move everything below it.
+Then rename `yourapplication.py` to `__init__.py`. (Make sure to delete
+all `.pyc` files first, otherwise things would most likely break)
+
+You should then end up with something like that::
+
+ /yourapplication
+ /yourapplication
+ /__init__.py
+ /static
+ /style.css
+ /templates
+ layout.html
+ index.html
+ login.html
+ ...
+
+But how do you run your application now? The naive ``python
+yourapplication/__init__.py`` will not work. Let's just say that Python
+does not want modules in packages to be the startup file. But that is not
+a big problem, just add a new file called `runserver.py` next to the inner
+`yourapplication` folder with the following contents::
+
+ from yourapplication import app
+ app.run(debug=True)
+
+What did we gain from this? Now we can restructure the application a bit
+into multiple modules. The only thing you have to remember is the
+following quick checklist:
+
+1. the `Flask` application object creation has to be in the
+ `__init__.py` file. That way each module can import it safely and the
+ `__name__` variable will resolve to the correct package.
+2. all the view functions (the ones with a :meth:`~flask.Flask.route`
+ decorator on top) have to be imported when in the `__init__.py` file.
+ Not the object itself, but the module it is in. Import the view module
+ **after the application object is created**.
+
+Here's an example `__init__.py`::
+
+ from flask import Flask
+ app = Flask(__name__)
+
+ import yourapplication.views
+
+And this is what `views.py` would look like::
+
+ from yourapplication import app
+
+ @app.route('/')
+ def index():
+ return 'Hello World!'
+
+You should then end up with something like that::
+
+ /yourapplication
+ /runserver.py
+ /yourapplication
+ /__init__.py
+ /views.py
+ /static
+ /style.css
+ /templates
+ layout.html
+ index.html
+ login.html
+ ...
+
+.. admonition:: Circular Imports
+
+ Every Python programmer hates them, and yet we just added some:
+ circular imports (That's when two modules depend on each other. In this
+ case `views.py` depends on `__init__.py`). Be advised that this is a
+ bad idea in general but here it is actually fine. The reason for this is
+ that we are not actually using the views in `__init__.py` and just
+ ensuring the module is imported and we are doing that at the bottom of
+ the file.
+
+ There are still some problems with that approach but if you want to use
+ decorators there is no way around that. Check out the
+ :ref:`becomingbig` section for some inspiration how to deal with that.
+
+
+.. _working-with-modules:
+
+Working with Blueprints
+-----------------------
+
+If you have larger applications it's recommended to divide them into
+smaller groups where each group is implemented with the help of a
+blueprint. For a gentle introduction into this topic refer to the
+:ref:`blueprints` chapter of the documentation.
diff --git a/app/static/doc/flask-docs/_sources/patterns/sqlalchemy.txt b/app/static/doc/flask-docs/_sources/patterns/sqlalchemy.txt
new file mode 100644
index 0000000..5a33d1f
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/sqlalchemy.txt
@@ -0,0 +1,214 @@
+.. _sqlalchemy-pattern:
+
+SQLAlchemy in Flask
+===================
+
+Many people prefer `SQLAlchemy`_ for database access. In this case it's
+encouraged to use a package instead of a module for your flask application
+and drop the models into a separate module (:ref:`larger-applications`).
+While that is not necessary, it makes a lot of sense.
+
+There are four very common ways to use SQLAlchemy. I will outline each
+of them here:
+
+Flask-SQLAlchemy Extension
+--------------------------
+
+Because SQLAlchemy is a common database abstraction layer and object
+relational mapper that requires a little bit of configuration effort,
+there is a Flask extension that handles that for you. This is recommended
+if you want to get started quickly.
+
+You can download `Flask-SQLAlchemy`_ from `PyPI
+<http://pypi.python.org/pypi/Flask-SQLAlchemy>`_.
+
+.. _Flask-SQLAlchemy: http://packages.python.org/Flask-SQLAlchemy/
+
+
+Declarative
+-----------
+
+The declarative extension in SQLAlchemy is the most recent method of using
+SQLAlchemy. It allows you to define tables and models in one go, similar
+to how Django works. In addition to the following text I recommend the
+official documentation on the `declarative`_ extension.
+
+Here the example `database.py` module for your application::
+
+ from sqlalchemy import create_engine
+ from sqlalchemy.orm import scoped_session, sessionmaker
+ from sqlalchemy.ext.declarative import declarative_base
+
+ engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
+ db_session = scoped_session(sessionmaker(autocommit=False,
+ autoflush=False,
+ bind=engine))
+ Base = declarative_base()
+ Base.query = db_session.query_property()
+
+ def init_db():
+ # import all modules here that might define models so that
+ # they will be registered properly on the metadata. Otherwise
+ # you will have to import them first before calling init_db()
+ import yourapplication.models
+ Base.metadata.create_all(bind=engine)
+
+To define your models, just subclass the `Base` class that was created by
+the code above. If you are wondering why we don't have to care about
+threads here (like we did in the SQLite3 example above with the
+:data:`~flask.g` object): that's because SQLAlchemy does that for us
+already with the :class:`~sqlalchemy.orm.scoped_session`.
+
+To use SQLAlchemy in a declarative way with your application, you just
+have to put the following code into your application module. Flask will
+automatically remove database sessions at the end of the request for you::
+
+ from yourapplication.database import db_session
+
+ @app.teardown_request
+ def shutdown_session(exception=None):
+ db_session.remove()
+
+Here is an example model (put this into `models.py`, e.g.)::
+
+ from sqlalchemy import Column, Integer, String
+ from yourapplication.database import Base
+
+ class User(Base):
+ __tablename__ = 'users'
+ id = Column(Integer, primary_key=True)
+ name = Column(String(50), unique=True)
+ email = Column(String(120), unique=True)
+
+ def __init__(self, name=None, email=None):
+ self.name = name
+ self.email = email
+
+ def __repr__(self):
+ return '<User %r>' % (self.name)
+
+To create the database you can use the `init_db` function:
+
+>>> from yourapplication.database import init_db
+>>> init_db()
+
+You can insert entries into the database like this:
+
+>>> from yourapplication.database import db_session
+>>> from yourapplication.models import User
+>>> u = User('admin', 'admin@localhost')
+>>> db_session.add(u)
+>>> db_session.commit()
+
+Querying is simple as well:
+
+>>> User.query.all()
+[<User u'admin'>]
+>>> User.query.filter(User.name == 'admin').first()
+<User u'admin'>
+
+.. _SQLAlchemy: http://www.sqlalchemy.org/
+.. _declarative:
+ http://www.sqlalchemy.org/docs/orm/extensions/declarative.html
+
+Manual Object Relational Mapping
+--------------------------------
+
+Manual object relational mapping has a few upsides and a few downsides
+versus the declarative approach from above. The main difference is that
+you define tables and classes separately and map them together. It's more
+flexible but a little more to type. In general it works like the
+declarative approach, so make sure to also split up your application into
+multiple modules in a package.
+
+Here is an example `database.py` module for your application::
+
+ from sqlalchemy import create_engine, MetaData
+ from sqlalchemy.orm import scoped_session, sessionmaker
+
+ engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
+ metadata = MetaData()
+ db_session = scoped_session(sessionmaker(autocommit=False,
+ autoflush=False,
+ bind=engine))
+ def init_db():
+ metadata.create_all(bind=engine)
+
+As for the declarative approach you need to close the session after
+each request. Put this into your application module::
+
+ from yourapplication.database import db_session
+
+ @app.teardown_request
+ def shutdown_session(exception=None):
+ db_session.remove()
+
+Here is an example table and model (put this into `models.py`)::
+
+ from sqlalchemy import Table, Column, Integer, String
+ from sqlalchemy.orm import mapper
+ from yourapplication.database import metadata, db_session
+
+ class User(object):
+ query = db_session.query_property()
+
+ def __init__(self, name=None, email=None):
+ self.name = name
+ self.email = email
+
+ def __repr__(self):
+ return '<User %r>' % (self.name, self.email)
+
+ users = Table('users', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('name', String(50), unique=True),
+ Column('email', String(120), unique=True)
+ )
+ mapper(User, users)
+
+Querying and inserting works exactly the same as in the example above.
+
+
+SQL Abstraction Layer
+---------------------
+
+If you just want to use the database system (and SQL) abstraction layer
+you basically only need the engine::
+
+ from sqlalchemy import create_engine, MetaData
+
+ engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
+ metadata = MetaData(bind=engine)
+
+Then you can either declare the tables in your code like in the examples
+above, or automatically load them::
+
+ users = Table('users', metadata, autoload=True)
+
+To insert data you can use the `insert` method. We have to get a
+connection first so that we can use a transaction:
+
+>>> con = engine.connect()
+>>> con.execute(users.insert(name='admin', email='admin@localhost'))
+
+SQLAlchemy will automatically commit for us.
+
+To query your database, you use the engine directly or use a connection:
+
+>>> users.select(users.c.id == 1).execute().first()
+(1, u'admin', u'admin@localhost')
+
+These results are also dict-like tuples:
+
+>>> r = users.select(users.c.id == 1).execute().first()
+>>> r['name']
+u'admin'
+
+You can also pass strings of SQL statements to the
+:meth:`~sqlalchemy.engine.base.Connection.execute` method:
+
+>>> engine.execute('select * from users where id = :1', [1]).first()
+(1, u'admin', u'admin@localhost')
+
+For more information about SQLAlchemy, head over to the
+`website <http://sqlalchemy.org/>`_.
diff --git a/app/static/doc/flask-docs/_sources/patterns/sqlite3.txt b/app/static/doc/flask-docs/_sources/patterns/sqlite3.txt
new file mode 100644
index 0000000..0d02e46
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/sqlite3.txt
@@ -0,0 +1,119 @@
+.. _sqlite3:
+
+Using SQLite 3 with Flask
+=========================
+
+In Flask you can implement the opening of database connections at the
+beginning of the request and closing at the end with the
+:meth:`~flask.Flask.before_request` and :meth:`~flask.Flask.teardown_request`
+decorators in combination with the special :class:`~flask.g` object.
+
+So here is a simple example of how you can use SQLite 3 with Flask::
+
+ import sqlite3
+ from flask import g
+
+ DATABASE = '/path/to/database.db'
+
+ def connect_db():
+ return sqlite3.connect(DATABASE)
+
+ @app.before_request
+ def before_request():
+ g.db = connect_db()
+
+ @app.teardown_request
+ def teardown_request(exception):
+ if hasattr(g, 'db'):
+ g.db.close()
+
+.. note::
+
+ Please keep in mind that the teardown request functions are always
+ executed, even if a before-request handler failed or was never
+ executed. Because of this we have to make sure here that the database
+ is there before we close it.
+
+Connect on Demand
+-----------------
+
+The downside of this approach is that this will only work if Flask
+executed the before-request handlers for you. If you are attempting to
+use the database from a script or the interactive Python shell you would
+have to do something like this::
+
+ with app.test_request_context():
+ app.preprocess_request()
+ # now you can use the g.db object
+
+In order to trigger the execution of the connection code. You won't be
+able to drop the dependency on the request context this way, but you could
+make it so that the application connects when necessary::
+
+ def get_connection():
+ db = getattr(g, '_db', None)
+ if db is None:
+ db = g._db = connect_db()
+ return db
+
+Downside here is that you have to use ``db = get_connection()`` instead of
+just being able to use ``g.db`` directly.
+
+.. _easy-querying:
+
+Easy Querying
+-------------
+
+Now in each request handling function you can access `g.db` to get the
+current open database connection. To simplify working with SQLite, a
+helper function can be useful::
+
+ def query_db(query, args=(), one=False):
+ cur = g.db.execute(query, args)
+ rv = [dict((cur.description[idx][0], value)
+ for idx, value in enumerate(row)) for row in cur.fetchall()]
+ return (rv[0] if rv else None) if one else rv
+
+This handy little function makes working with the database much more
+pleasant than it is by just using the raw cursor and connection objects.
+
+Here is how you can use it::
+
+ for user in query_db('select * from users'):
+ print user['username'], 'has the id', user['user_id']
+
+Or if you just want a single result::
+
+ user = query_db('select * from users where username = ?',
+ [the_username], one=True)
+ if user is None:
+ print 'No such user'
+ else:
+ print the_username, 'has the id', user['user_id']
+
+To pass variable parts to the SQL statement, use a question mark in the
+statement and pass in the arguments as a list. Never directly add them to
+the SQL statement with string formatting because this makes it possible
+to attack the application using `SQL Injections
+<http://en.wikipedia.org/wiki/SQL_injection>`_.
+
+Initial Schemas
+---------------
+
+Relational databases need schemas, so applications often ship a
+`schema.sql` file that creates the database. It's a good idea to provide
+a function that creates the database based on that schema. This function
+can do that for you::
+
+ from contextlib import closing
+
+ def init_db():
+ with closing(connect_db()) as db:
+ with app.open_resource('schema.sql') as f:
+ db.cursor().executescript(f.read())
+ db.commit()
+
+You can then create such a database from the python shell:
+
+>>> from yourapplication import init_db
+>>> init_db()
diff --git a/app/static/doc/flask-docs/_sources/patterns/streaming.txt b/app/static/doc/flask-docs/_sources/patterns/streaming.txt
new file mode 100644
index 0000000..8393b00
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/streaming.txt
@@ -0,0 +1,61 @@
+Streaming Contents
+==================
+
+Sometimes you want to send an enormous amount of data to the client, much
+more than you want to keep in memory. When you are generating the data on
+the fly though, how do you send that back to the client without the
+roundtrip to the filesystem?
+
+The answer is by using generators and direct responses.
+
+Basic Usage
+-----------
+
+This is a basic view function that generates a lot of CSV data on the fly.
+The trick is to have an inner function that uses a generator to generate
+data and to then invoke that function and pass it to a response object::
+
+ from flask import Response
+
+ @app.route('/large.csv')
+ def generate_large_csv():
+ def generate():
+ for row in iter_all_rows():
+ yield ','.join(row) + '\n'
+ return Response(generate(), mimetype='text/csv')
+
+Each ``yield`` expression is directly sent to the browser. Now though
+that some WSGI middlewares might break streaming, so be careful there in
+debug environments with profilers and other things you might have enabled.
+
+Streaming from Templates
+------------------------
+
+The Jinja2 template engine also supports rendering templates piece by
+piece. This functionality is not directly exposed by Flask because it is
+quite uncommon, but you can easily do it yourself::
+
+ from flask import Response
+
+ def stream_template(template_name, **context):
+ app.update_template_context(context)
+ t = app.jinja_env.get_template(template_name)
+ rv = t.stream(context)
+ rv.enable_buffering(5)
+ return rv
+
+ @app.route('/my-large-page.html')
+ def render_large_template():
+ rows = iter_all_rows()
+ return Response(stream_template('the_template.html', rows=rows))
+
+The trick here is to get the template object from the Jinja2 environment
+on the application and to call :meth:`~jinja2.Template.stream` instead of
+:meth:`~jinja2.Template.render` which returns a stream object instead of a
+string. Since we're bypassing the Flask template render functions and
+using the template object itself we have to make sure to update the render
+context ourselves by calling :meth:`~flask.Flask.update_template_context`.
+The template is then evaluated as the stream is iterated over. Since each
+time you do a yield the server will flush the content to the client you
+might want to buffer up a few items in the template which you can do with
+``rv.enable_buffering(size)``. ``5`` is a sane default.
diff --git a/app/static/doc/flask-docs/_sources/patterns/templateinheritance.txt b/app/static/doc/flask-docs/_sources/patterns/templateinheritance.txt
new file mode 100644
index 0000000..70015ec
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/templateinheritance.txt
@@ -0,0 +1,69 @@
+.. _template-inheritance:
+
+Template Inheritance
+====================
+
+The most powerful part of Jinja is template inheritance. Template inheritance
+allows you to build a base "skeleton" template that contains all the common
+elements of your site and defines **blocks** that child templates can override.
+
+Sounds complicated but is very basic. It's easiest to understand it by starting
+with an example.
+
+
+Base Template
+-------------
+
+This template, which we'll call ``layout.html``, defines a simple HTML skeleton
+document that you might use for a simple two-column page. It's the job of
+"child" templates to fill the empty blocks with content:
+
+.. sourcecode:: html+jinja
+
+ <!doctype html>
+ <html>
+ <head>
+ {% block head %}
+ <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
+ <title>{% block title %}{% endblock %} - My Webpage</title>
+ {% endblock %}
+ </head>
+ <body>
+ <div id="content">{% block content %}{% endblock %}</div>
+ <div id="footer">
+ {% block footer %}
+ &copy; Copyright 2010 by <a href="http://domain.invalid/">you</a>.
+ {% endblock %}
+ </div>
+ </body>
+
+In this example, the ``{% block %}`` tags define four blocks that child templates
+can fill in. All the `block` tag does is tell the template engine that a
+child template may override those portions of the template.
+
+Child Template
+--------------
+
+A child template might look like this:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block title %}Index{% endblock %}
+ {% block head %}
+ {{ super() }}
+ <style type="text/css">
+ .important { color: #336699; }
+ </style>
+ {% endblock %}
+ {% block content %}
+ <h1>Index</h1>
+ <p class="important">
+ Welcome on my awesome homepage.
+ {% endblock %}
+
+The ``{% extends %}`` tag is the key here. It tells the template engine that
+this template "extends" another template. When the template system evaluates
+this template, first it locates the parent. The extends tag must be the
+first tag in the template. To render the contents of a block defined in
+the parent template, use ``{{ super() }}``.
diff --git a/app/static/doc/flask-docs/_sources/patterns/urlprocessors.txt b/app/static/doc/flask-docs/_sources/patterns/urlprocessors.txt
new file mode 100644
index 0000000..778a5a6
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/urlprocessors.txt
@@ -0,0 +1,126 @@
+Using URL Processors
+====================
+
+.. versionadded:: 0.7
+
+Flask 0.7 introduces the concept of URL processors. The idea is that you
+might have a bunch of resources with common parts in the URL that you
+don't always explicitly want to provide. For instance you might have a
+bunch of URLs that have the language code in it but you don't want to have
+to handle it in every single function yourself.
+
+URL processors are especially helpful when combined with blueprints. We
+will handle both application specific URL processors here as well as
+blueprint specifics.
+
+Internationalized Application URLs
+----------------------------------
+
+Consider an application like this::
+
+ from flask import Flask, g
+
+ app = Flask(__name__)
+
+ @app.route('/<lang_code>/')
+ def index(lang_code):
+ g.lang_code = lang_code
+ ...
+
+ @app.route('/<lang_code>/about')
+ def about(lang_code):
+ g.lang_code = lang_code
+ ...
+
+This is an awful lot of repetition as you have to handle the language code
+setting on the :data:`~flask.g` object yourself in every single function.
+Sure, a decorator could be used to simplify this, but if you want to
+generate URLs from one function to another you would have to still provide
+the language code explicitly which can be annoying.
+
+For the latter, this is where :func:`~flask.Flask.url_defaults` functions
+come in. They can automatically inject values into a call for
+:func:`~flask.url_for` automatically. The code below checks if the
+language code is not yet in the dictionary of URL values and if the
+endpoint wants a value named ``'lang_code'``::
+
+ @app.url_defaults
+ def add_language_code(endpoint, values):
+ if 'lang_code' in values or not g.lang_code:
+ return
+ if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
+ values['lang_code'] = g.lang_code
+
+The method :meth:`~werkzeug.routing.Map.is_endpoint_expecting` of the URL
+map can be used to figure out if it would make sense to provide a language
+code for the given endpoint.
+
+The reverse of that function are
+:meth:`~flask.Flask.url_value_preprocessor`\s. They are executed right
+after the request was matched and can execute code based on the URL
+values. The idea is that they pull information out of the values
+dictionary and put it somewhere else::
+
+ @app.url_value_preprocessor
+ def pull_lang_code(endpoint, values):
+ g.lang_code = values.pop('lang_code', None)
+
+That way you no longer have to do the `lang_code` assigment to
+:data:`~flask.g` in every function. You can further improve that by
+writing your own decorator that prefixes URLs with the language code, but
+the more beautiful solution is using a blueprint. Once the
+``'lang_code'`` is popped from the values dictionary and it will no longer
+be forwarded to the view function reducing the code to this::
+
+ from flask import Flask, g
+
+ app = Flask(__name__)
+
+ @app.url_defaults
+ def add_language_code(endpoint, values):
+ if 'lang_code' in values or not g.lang_code:
+ return
+ if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
+ values['lang_code'] = g.lang_code
+
+ @app.url_value_preprocessor
+ def pull_lang_code(endpoint, values):
+ g.lang_code = values.pop('lang_code', None)
+
+ @app.route('/<lang_code>/')
+ def index():
+ ...
+
+ @app.route('/<lang_code>/about')
+ def about():
+ ...
+
+Internationalized Blueprint URLs
+--------------------------------
+
+Because blueprints can automatically prefix all URLs with a common string
+it's easy to automatically do that for every function. Furthermore
+blueprints can have per-blueprint URL processors which removes a whole lot
+of logic from the :meth:`~flask.Flask.url_defaults` function because it no
+longer has to check if the URL is really interested in a ``'lang_code'``
+parameter::
+
+ from flask import Blueprint, g
+
+ bp = Blueprint('frontend', __name__, url_prefix='/<lang_code>')
+
+ @bp.url_defaults
+ def add_language_code(endpoint, values):
+ values.setdefault('lang_code', g.lang_code)
+
+ @bp.url_value_preprocessor
+ def pull_lang_code(endpoint, values):
+ g.lang_code = values.pop('lang_code')
+
+ @bp.route('/')
+ def index():
+ ...
+
+ @bp.route('/about')
+ def about():
+ ...
diff --git a/app/static/doc/flask-docs/_sources/patterns/viewdecorators.txt b/app/static/doc/flask-docs/_sources/patterns/viewdecorators.txt
new file mode 100644
index 0000000..a094857
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/viewdecorators.txt
@@ -0,0 +1,168 @@
+View Decorators
+===============
+
+Python has a really interesting feature called function decorators. This
+allow some really neat things for web applications. Because each view in
+Flask is a function decorators can be used to inject additional
+functionality to one or more functions. The :meth:`~flask.Flask.route`
+decorator is the one you probably used already. But there are use cases
+for implementing your own decorator. For instance, imagine you have a
+view that should only be used by people that are logged in to. If a user
+goes to the site and is not logged in, they should be redirected to the
+login page. This is a good example of a use case where a decorator is an
+excellent solution.
+
+Login Required Decorator
+------------------------
+
+So let's implement such a decorator. A decorator is a function that
+returns a function. Pretty simple actually. The only thing you have to
+keep in mind when implementing something like this is to update the
+`__name__`, `__module__` and some other attributes of a function. This is
+often forgotten, but you don't have to do that by hand, there is a
+function for that that is used like a decorator (:func:`functools.wraps`).
+
+This example assumes that the login page is called ``'login'`` and that
+the current user is stored as `g.user` and `None` if there is no-one
+logged in::
+
+ from functools import wraps
+ from flask import g, request, redirect, url_for
+
+ def login_required(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ if g.user is None:
+ return redirect(url_for('login', next=request.url))
+ return f(*args, **kwargs)
+ return decorated_function
+
+So how would you use that decorator now? Apply it as innermost decorator
+to a view function. When applying further decorators, always remember
+that the :meth:`~flask.Flask.route` decorator is the outermost::
+
+ @app.route('/secret_page')
+ @login_required
+ def secret_page():
+ pass
+
+Caching Decorator
+-----------------
+
+Imagine you have a view function that does an expensive calculation and
+because of that you would like to cache the generated results for a
+certain amount of time. A decorator would be nice for that. We're
+assuming you have set up a cache like mentioned in :ref:`caching-pattern`.
+
+Here an example cache function. It generates the cache key from a
+specific prefix (actually a format string) and the current path of the
+request. Notice that we are using a function that first creates the
+decorator that then decorates the function. Sounds awful? Unfortunately
+it is a little bit more complex, but the code should still be
+straightforward to read.
+
+The decorated function will then work as follows
+
+1. get the unique cache key for the current request base on the current
+ path.
+2. get the value for that key from the cache. If the cache returned
+ something we will return that value.
+3. otherwise the original function is called and the return value is
+ stored in the cache for the timeout provided (by default 5 minutes).
+
+Here the code::
+
+ from functools import wraps
+ from flask import request
+
+ def cached(timeout=5 * 60, key='view/%s'):
+ def decorator(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ cache_key = key % request.path
+ rv = cache.get(cache_key)
+ if rv is not None:
+ return rv
+ rv = f(*args, **kwargs)
+ cache.set(cache_key, rv, timeout=timeout)
+ return rv
+ return decorated_function
+ return decorator
+
+Notice that this assumes an instantiated `cache` object is available, see
+:ref:`caching-pattern` for more information.
+
+
+Templating Decorator
+--------------------
+
+A common pattern invented by the TurboGears guys a while back is a
+templating decorator. The idea of that decorator is that you return a
+dictionary with the values passed to the template from the view function
+and the template is automatically rendered. With that, the following
+three examples do exactly the same::
+
+ @app.route('/')
+ def index():
+ return render_template('index.html', value=42)
+
+ @app.route('/')
+ @templated('index.html')
+ def index():
+ return dict(value=42)
+
+ @app.route('/')
+ @templated()
+ def index():
+ return dict(value=42)
+
+As you can see, if no template name is provided it will use the endpoint
+of the URL map with dots converted to slashes + ``'.html'``. Otherwise
+the provided template name is used. When the decorated function returns,
+the dictionary returned is passed to the template rendering function. If
+`None` is returned, an empty dictionary is assumed, if something else than
+a dictionary is returned we return it from the function unchanged. That
+way you can still use the redirect function or return simple strings.
+
+Here the code for that decorator::
+
+ from functools import wraps
+ from flask import request
+
+ def templated(template=None):
+ def decorator(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ template_name = template
+ if template_name is None:
+ template_name = request.endpoint \
+ .replace('.', '/') + '.html'
+ ctx = f(*args, **kwargs)
+ if ctx is None:
+ ctx = {}
+ elif not isinstance(ctx, dict):
+ return ctx
+ return render_template(template_name, **ctx)
+ return decorated_function
+ return decorator
+
+
+Endpoint Decorator
+------------------
+
+When you want to use the werkzeug routing system for more flexibility you
+need to map the endpoint as defined in the :class:`~werkzeug.routing.Rule`
+to a view function. This is possible with this decorator. For example::
+
+ from flask import Flask
+ from werkzeug.routing import Rule
+
+ app = Flask(__name__)
+ app.url_map.add(Rule('/', endpoint='index'))
+
+ @app.endpoint('index')
+ def my_index():
+ return "Hello world"
+
+
+
diff --git a/app/static/doc/flask-docs/_sources/patterns/wtforms.txt b/app/static/doc/flask-docs/_sources/patterns/wtforms.txt
new file mode 100644
index 0000000..93824df
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/patterns/wtforms.txt
@@ -0,0 +1,124 @@
+Form Validation with WTForms
+============================
+
+When you have to work with form data submitted by a browser view code
+quickly becomes very hard to read. There are libraries out there designed
+to make this process easier to manage. One of them is `WTForms`_ which we
+will handle here. If you find yourself in the situation of having many
+forms, you might want to give it a try.
+
+When you are working with WTForms you have to define your forms as classes
+first. I recommend breaking up the application into multiple modules
+(:ref:`larger-applications`) for that and adding a separate module for the
+forms.
+
+.. admonition:: Getting most of WTForms with an Extension
+
+ The `Flask-WTF`_ extension expands on this pattern and adds a few
+ handful little helpers that make working with forms and Flask more
+ fun. You can get it from `PyPI
+ <http://pypi.python.org/pypi/Flask-WTF>`_.
+
+.. _Flask-WTF: http://packages.python.org/Flask-WTF/
+
+The Forms
+---------
+
+This is an example form for a typical registration page::
+
+ from wtforms import Form, BooleanField, TextField, validators
+
+ class RegistrationForm(Form):
+ username = TextField('Username', [validators.Length(min=4, max=25)])
+ email = TextField('Email Address', [validators.Length(min=6, max=35)])
+ password = PasswordField('New Password', [
+ validators.Required(),
+ validators.EqualTo('confirm', message='Passwords must match')
+ ])
+ confirm = PasswordField('Repeat Password')
+ accept_tos = BooleanField('I accept the TOS', [validators.Required()])
+
+In the View
+-----------
+
+In the view function, the usage of this form looks like this::
+
+ @app.route('/register', methods=['GET', 'POST'])
+ def register():
+ form = RegistrationForm(request.form)
+ if request.method == 'POST' and form.validate():
+ user = User(form.username.data, form.email.data,
+ form.password.data)
+ db_session.add(user)
+ flash('Thanks for registering')
+ return redirect(url_for('login'))
+ return render_template('register.html', form=form)
+
+Notice that we are implying that the view is using SQLAlchemy here
+(:ref:`sqlalchemy-pattern`) but this is no requirement of course. Adapt
+the code as necessary.
+
+Things to remember:
+
+1. create the form from the request :attr:`~flask.request.form` value if
+ the data is submitted via the HTTP `POST` method and
+ :attr:`~flask.request.args` if the data is submitted as `GET`.
+2. to validate the data, call the :func:`~wtforms.form.Form.validate`
+ method which will return `True` if the data validates, `False`
+ otherwise.
+3. to access individual values from the form, access `form.<NAME>.data`.
+
+Forms in Templates
+------------------
+
+Now to the template side. When you pass the form to the templates you can
+easily render them there. Look at the following example template to see
+how easy this is. WTForms does half the form generation for us already.
+To make it even nicer, we can write a macro that renders a field with
+label and a list of errors if there are any.
+
+Here's an example `_formhelpers.html` template with such a macro:
+
+.. sourcecode:: html+jinja
+
+ {% macro render_field(field) %}
+ <dt>{{ field.label }}
+ <dd>{{ field(**kwargs)|safe }}
+ {% if field.errors %}
+ <ul class="errors">
+ {% for error in field.errors %}<li>{{ error }}{% endfor %}
+ </ul>
+ {% endif %}
+ </dd>
+ {% endmacro %}
+
+This macro accepts a couple of keyword arguments that are forwarded to
+WTForm's field function that renders the field for us. The keyword
+arguments will be inserted as HTML attributes. So for example you can
+call ``render_field(form.username, class='username')`` to add a class to
+the input element. Note that WTForms returns standard Python unicode
+strings, so we have to tell Jinja2 that this data is already HTML escaped
+with the `|safe` filter.
+
+Here the `register.html` template for the function we used above which
+takes advantage of the `_formhelpers.html` template:
+
+.. sourcecode:: html+jinja
+
+ {% from "_formhelpers.html" import render_field %}
+ <form method="post" action="/register">
+ <dl>
+ {{ render_field(form.username) }}
+ {{ render_field(form.email) }}
+ {{ render_field(form.password) }}
+ {{ render_field(form.confirm) }}
+ {{ render_field(form.accept_tos) }}
+ </dl>
+ <p><input type=submit value=Register>
+ </form>
+
+For more information about WTForms, head over to the `WTForms
+website`_.
+
+.. _WTForms: http://wtforms.simplecodes.com/
+.. _WTForms website: http://wtforms.simplecodes.com/
diff --git a/app/static/doc/flask-docs/_sources/quickstart.txt b/app/static/doc/flask-docs/_sources/quickstart.txt
new file mode 100644
index 0000000..34aa3be
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/quickstart.txt
@@ -0,0 +1,824 @@
+.. _quickstart:
+
+Quickstart
+==========
+
+Eager to get started? This page gives a good introduction in how to get
+started with Flask. This assumes you already have Flask installed. If
+you do not, head over to the :ref:`installation` section.
+
+
+A Minimal Application
+---------------------
+
+A minimal Flask application looks something like this::
+
+ from flask import Flask
+ app = Flask(__name__)
+
+ @app.route('/')
+ def hello_world():
+ return 'Hello World!'
+
+ if __name__ == '__main__':
+ app.run()
+
+Just save it as `hello.py` or something similar and run it with your
+Python interpreter. Make sure to not call your application `flask.py`
+because this would conflict with Flask itself.
+
+::
+
+ $ python hello.py
+ * Running on http://127.0.0.1:5000/
+
+Head over to `http://127.0.0.1:5000/ <http://127.0.0.1:5000/>`_, you should
+see your hello world greeting.
+
+So what did that code do?
+
+1. First we imported the :class:`~flask.Flask` class. An instance of this
+ class will be our WSGI application. The first argument is the name of
+ the application's module. If you are using a single module (like here)
+ you should use `__name__` because depending on if it's started as
+ application or imported as module the name will be different
+ (``'__main__'`` versus the actual import name). For more information
+ on that, have a look at the :class:`~flask.Flask` documentation.
+2. Next we create an instance of it. We pass it the name of the module /
+ package. This is needed so that Flask knows where it should look for
+ templates, static files and so on.
+3. Then we use the :meth:`~flask.Flask.route` decorator to tell Flask
+ what URL should trigger our function.
+4. The function then has a name which is also used to generate URLs to
+ that particular function, and returns the message we want to display in
+ the user's browser.
+5. Finally we use the :meth:`~flask.Flask.run` function to run the
+ local server with our application. The ``if __name__ == '__main__':``
+ makes sure the server only runs if the script is executed directly from
+ the Python interpreter and not used as imported module.
+
+To stop the server, hit control-C.
+
+.. _public-server:
+
+.. admonition:: Externally Visible Server
+
+ If you run the server you will notice that the server is only available
+ from your own computer, not from any other in the network. This is the
+ default because in debugging mode a user of the application can execute
+ arbitrary Python code on your computer. If you have `debug` disabled
+ or trust the users on your network, you can make the server publicly
+ available.
+
+ Just change the call of the :meth:`~flask.Flask.run` method to look
+ like this::
+
+ app.run(host='0.0.0.0')
+
+ This tells your operating system to listen on a public IP.
+
+
+Debug Mode
+----------
+
+The :meth:`~flask.Flask.run` method is nice to start a local
+development server, but you would have to restart it manually after each
+change you do to code. That is not very nice and Flask can do better. If
+you enable the debug support the server will reload itself on code changes
+and also provide you with a helpful debugger if things go wrong.
+
+There are two ways to enable debugging. Either set that flag on the
+application object::
+
+ app.debug = True
+ app.run()
+
+Or pass it to run::
+
+ app.run(debug=True)
+
+Both will have exactly the same effect.
+
+.. admonition:: Attention
+
+ Even though the interactive debugger does not work in forking environments
+ (which makes it nearly impossible to use on production servers), it still
+ allows the execution of arbitrary code. That makes it a major security
+ risk and therefore it **must never be used on production machines**.
+
+Screenshot of the debugger in action:
+
+.. image:: _static/debugger.png
+ :align: center
+ :class: screenshot
+ :alt: screenshot of debugger in action
+
+.. admonition:: Working With Other Debuggers
+
+ Debuggers interfere with each other. If you are using another debugger
+ (e.g. PyDev or IntelliJ), you may need to set ``app.debug = False``.
+
+
+Routing
+-------
+
+Modern web applications have beautiful URLs. This helps people remember
+the URLs which is especially handy for applications that are used from
+mobile devices with slower network connections. If the user can directly
+go to the desired page without having to hit the index page it is more
+likely they will like the page and come back next time.
+
+As you have seen above, the :meth:`~flask.Flask.route` decorator is used
+to bind a function to a URL. Here are some basic examples::
+
+ @app.route('/')
+ def index():
+ return 'Index Page'
+
+ @app.route('/hello')
+ def hello():
+ return 'Hello World'
+
+But there is more to it! You can make certain parts of the URL dynamic
+and attach multiple rules to a function.
+
+Variable Rules
+``````````````
+
+To add variable parts to a URL you can mark these special sections as
+``<variable_name>``. Such a part is then passed as keyword argument to
+your function. Optionally a converter can be specified by specifying a
+rule with ``<converter:variable_name>``. Here are some nice examples::
+
+ @app.route('/user/<username>')
+ def show_user_profile(username):
+ # show the user profile for that user
+ pass
+
+ @app.route('/post/<int:post_id>')
+ def show_post(post_id):
+ # show the post with the given id, the id is an integer
+ pass
+
+The following converters exist:
+
+=========== ===========================================
+`int` accepts integers
+`float` like `int` but for floating point values
+`path` like the default but also accepts slashes
+=========== ===========================================
+
+.. admonition:: Unique URLs / Redirection Behaviour
+
+ Flask's URL rules are based on Werkzeug's routing module. The idea
+ behind that module is to ensure nice looking and also unique URLs based
+ on behaviour Apache and earlier servers coined.
+
+ Take these two rules::
+
+ @app.route('/projects/')
+ def projects():
+ pass
+
+ @app.route('/about')
+ def about():
+ pass
+
+ They look rather similar, the difference is the trailing slash in the
+ URL *definition*. In the first case, the canonical URL for the
+ `projects` endpoint has a trailing slash. It's similar to a folder in
+ that sense. Accessing it without a trailing slash will cause Flask to
+ redirect to the canonical URL with the trailing slash.
+
+ However in the second case the URL is defined without a slash so it
+ behaves similar to a file and accessing the URL with a trailing slash
+ will be a 404 error.
+
+ Why is this? This allows relative URLs to continue working if users
+ access the page when they forget a trailing slash. This behaviour is
+ also consistent with how Apache and other servers work. Also, the URLs
+ will stay unique which helps search engines not indexing the same page
+ twice.
+
+
+.. _url-building:
+
+URL Building
+````````````
+
+If it can match URLs, can it also generate them? Of course it can. To
+build a URL to a specific function you can use the :func:`~flask.url_for`
+function. It accepts the name of the function as first argument and a
+number of keyword arguments, each corresponding to the variable part of
+the URL rule. Unknown variable parts are appended to the URL as query
+parameter. Here are some examples:
+
+>>> from flask import Flask, url_for
+>>> app = Flask(__name__)
+>>> @app.route('/')
+... def index(): pass
+...
+>>> @app.route('/login')
+... def login(): pass
+...
+>>> @app.route('/user/<username>')
+... def profile(username): pass
+...
+>>> with app.test_request_context():
+... print url_for('index')
+... print url_for('login')
+... print url_for('login', next='/')
+... print url_for('profile', username='John Doe')
+...
+/
+/login
+/login?next=/
+/user/John%20Doe
+
+(This also uses the :meth:`~flask.Flask.test_request_context` method
+explained below. It basically tells Flask to think we are handling a
+request even though we are not, we are in an interactive Python shell.
+Have a look at the explanation below. :ref:`context-locals`).
+
+Why would you want to build URLs instead of hardcoding them in your
+templates? There are three good reasons for this:
+
+1. reversing is often more descriptive than hardcoding the URLs. Also and
+ more importantly you can change URLs in one go without having to change
+ the URLs all over the place.
+2. URL building will handle escaping of special characters and Unicode
+ data transparently for you, you don't have to deal with that.
+3. If your application is placed outside the URL root (so say in
+ ``/myapplication`` instead of ``/``), :func:`~flask.url_for` will
+ handle that properly for you.
+
+
+HTTP Methods
+````````````
+
+HTTP (the protocol web applications are speaking) knows different methods
+to access URLs. By default a route only answers to `GET` requests, but
+that can be changed by providing the `methods` argument to the
+:meth:`~flask.Flask.route` decorator. Here are some examples::
+
+ @app.route('/login', methods=['GET', 'POST'])
+ def login():
+ if request.method == 'POST':
+ do_the_login()
+ else:
+ show_the_login_form()
+
+If `GET` is present, `HEAD` will be added automatically for you. You
+don't have to deal with that. It will also make sure that `HEAD` requests
+are handled like the `HTTP RFC`_ (the document describing the HTTP
+protocol) demands, so you can completely ignore that part of the HTTP
+specification. Likewise as of Flask 0.6, `OPTIONS` is implemented for you
+as well automatically.
+
+You have no idea what an HTTP method is? Worry not, here is a quick
+introduction to HTTP methods and why they matter:
+
+The HTTP method (also often called "the verb") tells the server what the
+clients wants to *do* with the requested page. The following methods are
+very common:
+
+`GET`
+ The browser tells the server to just *get* the information stored on
+ that page and send it. This is probably the most common method.
+
+`HEAD`
+ The browser tells the server to get the information, but it is only
+ interested in the *headers*, not the content of the page. An
+ application is supposed to handle that as if a `GET` request was
+ received but to not deliver the actual content. In Flask you don't
+ have to deal with that at all, the underlying Werkzeug library handles
+ that for you.
+
+`POST`
+ The browser tells the server that it wants to *post* some new
+ information to that URL and that the server must ensure the data is
+ stored and only stored once. This is how HTML forms are usually
+ transmitting data to the server.
+
+`PUT`
+ Similar to `POST` but the server might trigger the store procedure
+ multiple times by overwriting the old values more than once. Now you
+ might be asking why is this useful, but there are some good reasons
+ to do it this way. Consider that the connection gets lost during
+ transmission: in this situation a system between the browser and the
+ server might receive the request safely a second time without breaking
+ things. With `POST` that would not be possible because it must only
+ be triggered once.
+
+`DELETE`
+ Remove the information at the given location.
+
+`OPTIONS`
+ Provides a quick way for a client to figure out which methods are
+ supported by this URL. Starting with Flask 0.6, this is implemented
+ for you automatically.
+
+Now the interesting part is that in HTML4 and XHTML1, the only methods a
+form can submit to the server are `GET` and `POST`. But with JavaScript
+and future HTML standards you can use the other methods as well. Furthermore
+HTTP has become quite popular lately and browsers are no longer the only
+clients that are using HTTP. For instance, many revision control system
+use it.
+
+.. _HTTP RFC: http://www.ietf.org/rfc/rfc2068.txt
+
+Static Files
+------------
+
+Dynamic web applications need static files as well. That's usually where
+the CSS and JavaScript files are coming from. Ideally your web server is
+configured to serve them for you, but during development Flask can do that
+as well. Just create a folder called `static` in your package or next to
+your module and it will be available at `/static` on the application.
+
+To generate URLs to that part of the URL, use the special ``'static'`` URL
+name::
+
+ url_for('static', filename='style.css')
+
+The file has to be stored on the filesystem as ``static/style.css``.
+
+Rendering Templates
+-------------------
+
+Generating HTML from within Python is not fun, and actually pretty
+cumbersome because you have to do the HTML escaping on your own to keep
+the application secure. Because of that Flask configures the `Jinja2
+<http://jinja.pocoo.org/2/>`_ template engine for you automatically.
+
+To render a template you can use the :func:`~flask.render_template`
+method. All you have to do is to provide the name of the template and the
+variables you want to pass to the template engine as keyword arguments.
+Here's a simple example of how to render a template::
+
+ from flask import render_template
+
+ @app.route('/hello/')
+ @app.route('/hello/<name>')
+ def hello(name=None):
+ return render_template('hello.html', name=name)
+
+Flask will look for templates in the `templates` folder. So if your
+application is a module, that folder is next to that module, if it's a
+package it's actually inside your package:
+
+**Case 1**: a module::
+
+ /application.py
+ /templates
+ /hello.html
+
+**Case 2**: a package::
+
+ /application
+ /__init__.py
+ /templates
+ /hello.html
+
+For templates you can use the full power of Jinja2 templates. Head over
+to the the official `Jinja2 Template Documentation
+<http://jinja.pocoo.org/2/documentation/templates>`_ for more information.
+
+Here is an example template:
+
+.. sourcecode:: html+jinja
+
+ <!doctype html>
+ <title>Hello from Flask</title>
+ {% if name %}
+ <h1>Hello {{ name }}!</h1>
+ {% else %}
+ <h1>Hello World!</h1>
+ {% endif %}
+
+Inside templates you also have access to the :class:`~flask.request`,
+:class:`~flask.session` and :class:`~flask.g` [#]_ objects
+as well as the :func:`~flask.get_flashed_messages` function.
+
+Templates are especially useful if inheritance is used. If you want to
+know how that works, head over to the :ref:`template-inheritance` pattern
+documentation. Basically template inheritance makes it possible to keep
+certain elements on each page (like header, navigation and footer).
+
+Automatic escaping is enabled, so if name contains HTML it will be escaped
+automatically. If you can trust a variable and you know that it will be
+safe HTML (because for example it came from a module that converts wiki
+markup to HTML) you can mark it as safe by using the
+:class:`~jinja2.Markup` class or by using the ``|safe`` filter in the
+template. Head over to the Jinja 2 documentation for more examples.
+
+Here is a basic introduction to how the :class:`~jinja2.Markup` class works:
+
+>>> from flask import Markup
+>>> Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>'
+Markup(u'<strong>Hello &lt;blink&gt;hacker&lt;/blink&gt;!</strong>')
+>>> Markup.escape('<blink>hacker</blink>')
+Markup(u'&lt;blink&gt;hacker&lt;/blink&gt;')
+>>> Markup('<em>Marked up</em> &raquo; HTML').striptags()
+u'Marked up \xbb HTML'
+
+.. versionchanged:: 0.5
+
+ Autoescaping is no longer enabled for all templates. The following
+ extensions for templates trigger autoescaping: ``.html``, ``.htm``,
+ ``.xml``, ``.xhtml``. Templates loaded from a string will have
+ autoescaping disabled.
+
+.. [#] Unsure what that :class:`~flask.g` object is? It's something in which
+ you can store information for your own needs, check the documentation of
+ that object (:class:`~flask.g`) and the :ref:`sqlite3` for more
+ information.
+
+
+Accessing Request Data
+----------------------
+
+For web applications it's crucial to react to the data a client sent to
+the server. In Flask this information is provided by the global
+:class:`~flask.request` object. If you have some experience with Python
+you might be wondering how that object can be global and how Flask
+manages to still be threadsafe. The answer are context locals:
+
+
+.. _context-locals:
+
+Context Locals
+``````````````
+
+.. admonition:: Insider Information
+
+ If you want to understand how that works and how you can implement
+ tests with context locals, read this section, otherwise just skip it.
+
+Certain objects in Flask are global objects, but not of the usual kind.
+These objects are actually proxies to objects that are local to a specific
+context. What a mouthful. But that is actually quite easy to understand.
+
+Imagine the context being the handling thread. A request comes in and the
+webserver decides to spawn a new thread (or something else, the
+underlying object is capable of dealing with other concurrency systems
+than threads as well). When Flask starts its internal request handling it
+figures out that the current thread is the active context and binds the
+current application and the WSGI environments to that context (thread).
+It does that in an intelligent way that one application can invoke another
+application without breaking.
+
+So what does this mean to you? Basically you can completely ignore that
+this is the case unless you are doing something like unittesting. You
+will notice that code that depends on a request object will suddenly break
+because there is no request object. The solution is creating a request
+object yourself and binding it to the context. The easiest solution for
+unittesting is by using the :meth:`~flask.Flask.test_request_context`
+context manager. In combination with the `with` statement it will bind a
+test request so that you can interact with it. Here is an example::
+
+ from flask import request
+
+ with app.test_request_context('/hello', method='POST'):
+ # now you can do something with the request until the
+ # end of the with block, such as basic assertions:
+ assert request.path == '/hello'
+ assert request.method == 'POST'
+
+The other possibility is passing a whole WSGI environment to the
+:meth:`~flask.Flask.request_context` method::
+
+ from flask import request
+
+ with app.request_context(environ):
+ assert request.method == 'POST'
+
+The Request Object
+``````````````````
+
+The request object is documented in the API section and we will not cover
+it here in detail (see :class:`~flask.request`). Here is a broad overview of
+some of the most common operations. First of all you have to import it from
+the `flask` module::
+
+ from flask import request
+
+The current request method is available by using the
+:attr:`~flask.request.method` attribute. To access form data (data
+transmitted in a `POST` or `PUT` request) you can use the
+:attr:`~flask.request.form` attribute. Here is a full example of the two
+attributes mentioned above::
+
+ @app.route('/login', methods=['POST', 'GET'])
+ def login():
+ error = None
+ if request.method == 'POST':
+ if valid_login(request.form['username'],
+ request.form['password']):
+ return log_the_user_in(request.form['username'])
+ else:
+ error = 'Invalid username/password'
+ # this is executed if the request method was GET or the
+ # credentials were invalid
+
+What happens if the key does not exist in the `form` attribute? In that
+case a special :exc:`KeyError` is raised. You can catch it like a
+standard :exc:`KeyError` but if you don't do that, a HTTP 400 Bad Request
+error page is shown instead. So for many situations you don't have to
+deal with that problem.
+
+To access parameters submitted in the URL (``?key=value``) you can use the
+:attr:`~flask.request.args` attribute::
+
+ searchword = request.args.get('q', '')
+
+We recommend accessing URL parameters with `get` or by catching the
+`KeyError` because users might change the URL and presenting them a 400
+bad request page in that case is not user friendly.
+
+For a full list of methods and attributes of the request object, head over
+to the :class:`~flask.request` documentation.
+
+
+File Uploads
+````````````
+
+You can handle uploaded files with Flask easily. Just make sure not to
+forget to set the ``enctype="multipart/form-data"`` attribute on your HTML
+form, otherwise the browser will not transmit your files at all.
+
+Uploaded files are stored in memory or at a temporary location on the
+filesystem. You can access those files by looking at the
+:attr:`~flask.request.files` attribute on the request object. Each
+uploaded file is stored in that dictionary. It behaves just like a
+standard Python :class:`file` object, but it also has a
+:meth:`~werkzeug.datastructures.FileStorage.save` method that allows you to store that
+file on the filesystem of the server. Here is a simple example showing how
+that works::
+
+ from flask import request
+
+ @app.route('/upload', methods=['GET', 'POST'])
+ def upload_file():
+ if request.method == 'POST':
+ f = request.files['the_file']
+ f.save('/var/www/uploads/uploaded_file.txt')
+ ...
+
+If you want to know how the file was named on the client before it was
+uploaded to your application, you can access the
+:attr:`~werkzeug.datastructures.FileStorage.filename` attribute. However please keep in
+mind that this value can be forged so never ever trust that value. If you
+want to use the filename of the client to store the file on the server,
+pass it through the :func:`~werkzeug.utils.secure_filename` function that
+Werkzeug provides for you::
+
+ from flask import request
+ from werkzeug import secure_filename
+
+ @app.route('/upload', methods=['GET', 'POST'])
+ def upload_file():
+ if request.method == 'POST':
+ f = request.files['the_file']
+ f.save('/var/www/uploads/' + secure_filename(f.filename))
+ ...
+
+For some better examples, checkout the :ref:`uploading-files` pattern.
+
+Cookies
+```````
+
+To access cookies you can use the :attr:`~flask.Request.cookies`
+attribute. To set cookies you can use the
+:attr:`~flask.Response.set_cookie` method of response objects. The
+:attr:`~flask.Request.cookies` attribute of request objects is a
+dictionary with all the cookies the client transmits. If you want to use
+sessions, do not use the cookies directly but instead use the
+:ref:`sessions` in Flask that add some security on top of cookies for you.
+
+Reading cookies::
+
+ from flask import request
+
+ @app.route('/')
+ def index():
+ username = request.cookies.get('username')
+ # use cookies.get(key) instead of cookies[key] to not get a
+ # KeyError if the cookie is missing.
+
+Storing cookies::
+
+ from flask import make_response
+
+ @app.route('/')
+ def index():
+ resp = make_response(render_template(...))
+ resp.set_cookie('username', 'the username')
+ return resp
+
+Note that cookies are set on response objects. Since you normally you
+just return strings from the view functions Flask will convert them into
+response objects for you. If you explicitly want to do that you can use
+the :meth:`~flask.make_response` function and then modify it.
+
+Sometimes you might want to set a cookie at a point where the response
+object does not exist yet. This is possible by utilizing the
+:ref:`deferred-callbacks` pattern.
+
+For this also see :ref:`about-responses`.
+
+Redirects and Errors
+--------------------
+
+To redirect a user to somewhere else you can use the
+:func:`~flask.redirect` function. To abort a request early with an error
+code use the :func:`~flask.abort` function. Here an example how this works::
+
+ from flask import abort, redirect, url_for
+
+ @app.route('/')
+ def index():
+ return redirect(url_for('login'))
+
+ @app.route('/login')
+ def login():
+ abort(401)
+ this_is_never_executed()
+
+This is a rather pointless example because a user will be redirected from
+the index to a page they cannot access (401 means access denied) but it
+shows how that works.
+
+By default a black and white error page is shown for each error code. If
+you want to customize the error page, you can use the
+:meth:`~flask.Flask.errorhandler` decorator::
+
+ from flask import render_template
+
+ @app.errorhandler(404)
+ def page_not_found(error):
+ return render_template('page_not_found.html'), 404
+
+Note the ``404`` after the :func:`~flask.render_template` call. This
+tells Flask that the status code of that page should be 404 which means
+not found. By default 200 is assumed which translates to: all went well.
+
+.. _about-responses:
+
+About Responses
+---------------
+
+The return value from a view function is automatically converted into a
+response object for you. If the return value is a string it's converted
+into a response object with the string as response body, an ``200 OK``
+error code and a ``text/html`` mimetype. The logic that Flask applies to
+converting return values into response objects is as follows:
+
+1. If a response object of the correct type is returned it's directly
+ returned from the view.
+2. If it's a string, a response object is created with that data and the
+ default parameters.
+3. If a tuple is returned the response object is created by passing the
+ tuple as arguments to the response object's constructor.
+4. If neither of that works, Flask will assume the return value is a
+ valid WSGI application and converts that into a response object.
+
+If you want to get hold of the resulting response object inside the view
+you can use the :func:`~flask.make_response` function.
+
+Imagine you have a view like this:
+
+.. sourcecode:: python
+
+ @app.errorhandler(404)
+ def not_found(error):
+ return render_template('error.html'), 404
+
+You just need to wrap the return expression with
+:func:`~flask.make_response` and get the result object to modify it, then
+return it:
+
+.. sourcecode:: python
+
+ @app.errorhandler(404)
+ def not_found(error):
+ resp = make_response(render_template('error.html'), 404)
+ resp.headers['X-Something'] = 'A value'
+ return resp
+
+.. _sessions:
+
+Sessions
+--------
+
+Besides the request object there is also a second object called
+:class:`~flask.session` that allows you to store information specific to a
+user from one request to the next. This is implemented on top of cookies
+for you and signs the cookies cryptographically. What this means is that
+the user could look at the contents of your cookie but not modify it,
+unless they know the secret key used for signing.
+
+In order to use sessions you have to set a secret key. Here is how
+sessions work::
+
+ from flask import Flask, session, redirect, url_for, escape, request
+
+ app = Flask(__name__)
+
+ @app.route('/')
+ def index():
+ if 'username' in session:
+ return 'Logged in as %s' % escape(session['username'])
+ return 'You are not logged in'
+
+ @app.route('/login', methods=['GET', 'POST'])
+ def login():
+ if request.method == 'POST':
+ session['username'] = request.form['username']
+ return redirect(url_for('index'))
+ return '''
+ <form action="" method="post">
+ <p><input type=text name=username>
+ <p><input type=submit value=Login>
+ </form>
+ '''
+
+ @app.route('/logout')
+ def logout():
+ # remove the username from the session if its there
+ session.pop('username', None)
+ return redirect(url_for('index'))
+
+ # set the secret key. keep this really secret:
+ app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
+
+The here mentioned :func:`~flask.escape` does escaping for you if you are
+not using the template engine (like in this example).
+
+.. admonition:: How to generate good secret keys
+
+ The problem with random is that it's hard to judge what random is. And
+ a secret key should be as random as possible. Your operating system
+ has ways to generate pretty random stuff based on a cryptographic
+ random generator which can be used to get such a key:
+
+ >>> import os
+ >>> os.urandom(24)
+ '\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
+
+ Just take that thing and copy/paste it into your code and you're done.
+
+Message Flashing
+----------------
+
+Good applications and user interfaces are all about feedback. If the user
+does not get enough feedback they will probably end up hating the
+application. Flask provides a really simple way to give feedback to a
+user with the flashing system. The flashing system basically makes it
+possible to record a message at the end of a request and access it next
+request and only next request. This is usually combined with a layout
+template that does this.
+
+To flash a message use the :func:`~flask.flash` method, to get hold of the
+messages you can use :func:`~flask.get_flashed_messages` which is also
+available in the templates. Check out the :ref:`message-flashing-pattern`
+for a full example.
+
+Logging
+-------
+
+.. versionadded:: 0.3
+
+Sometimes you might be in a situation where you deal with data that
+should be correct, but actually is not. For example you may have some client
+side code that sends an HTTP request to the server but it's obviously
+malformed. This might be caused by a user tempering with the data, or the
+client code failing. Most of the time, it's okay to reply with ``400 Bad
+Request`` in that situation, but sometimes that won't do and the code has
+to continue working.
+
+You may still want to log that something fishy happened. This is where
+loggers come in handy. As of Flask 0.3 a logger is preconfigured for you
+to use.
+
+Here are some example log calls::
+
+ app.logger.debug('A value for debugging')
+ app.logger.warning('A warning occurred (%d apples)', 42)
+ app.logger.error('An error occurred')
+
+The attached :attr:`~flask.Flask.logger` is a standard logging
+:class:`~logging.Logger`, so head over to the official `logging
+documentation <http://docs.python.org/library/logging.html>`_ for more
+information.
+
+Hooking in WSGI Middlewares
+---------------------------
+
+If you want to add a WSGI middleware to your application you can wrap the
+internal WSGI application. For example if you want to use one of the
+middlewares from the Werkzeug package to work around bugs in lighttpd, you
+can do it like this::
+
+ from werkzeug.contrib.fixers import LighttpdCGIRootFix
+ app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)
diff --git a/app/static/doc/flask-docs/_sources/reqcontext.txt b/app/static/doc/flask-docs/_sources/reqcontext.txt
new file mode 100644
index 0000000..0249b88
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/reqcontext.txt
@@ -0,0 +1,239 @@
+.. _request-context:
+
+The Request Context
+===================
+
+This document describes the behavior in Flask 0.7 which is mostly in line
+with the old behavior but has some small, subtle differences.
+
+One of the design ideas behind Flask is that there are two different
+“states” in which code is executed. The application setup state in which
+the application implicitly is on the module level. It starts when the
+:class:`Flask` object is instantiated, and it implicitly ends when the
+first request comes in. While the application is in this state a few
+assumptions are true:
+
+- the programmer can modify the application object safely.
+- no request handling happened so far
+- you have to have a reference to the application object in order to
+ modify it, there is no magic proxy that can give you a reference to
+ the application object you're currently creating or modifying.
+
+On the contrast, during request handling, a couple of other rules exist:
+
+- while a request is active, the context local objects
+ (:data:`flask.request` and others) point to the current request.
+- any code can get hold of these objects at any time.
+
+The magic that makes this works is internally referred in Flask as the
+“request context”.
+
+Diving into Context Locals
+--------------------------
+
+Say you have a utility function that returns the URL the user should be
+redirected to. Imagine it would always redirect to the URL's ``next``
+parameter or the HTTP referrer or the index page::
+
+ from flask import request, url_for
+
+ def redirect_url():
+ return request.args.get('next') or \
+ request.referrer or \
+ url_for('index')
+
+As you can see, it accesses the request object. If you try to run this
+from a plain Python shell, this is the exception you will see:
+
+>>> redirect_url()
+Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+AttributeError: 'NoneType' object has no attribute 'request'
+
+That makes a lot of sense because we currently do not have a request we
+could access. So we have to make a request and bind it to the current
+context. The :attr:`~flask.Flask.test_request_context` method can create
+us a :class:`~flask.ctx.RequestContext`:
+
+>>> ctx = app.test_request_context('/?next=http://example.com/')
+
+This context can be used in two ways. Either with the `with` statement
+or by calling the :meth:`~flask.ctx.RequestContext.push` and
+:meth:`~flask.ctx.RequestContext.pop` methods:
+
+>>> ctx.push()
+
+From that point onwards you can work with the request object:
+
+>>> redirect_url()
+u'http://example.com/'
+
+Until you call `pop`:
+
+>>> ctx.pop()
+
+Because the request context is internally maintained as a stack you can
+push and pop multiple times. This is very handy to implement things like
+internal redirects.
+
+For more information of how to utilize the request context from the
+interactive Python shell, head over to the :ref:`shell` chapter.
+
+How the Context Works
+---------------------
+
+If you look into how the Flask WSGI application internally works, you will
+find a piece of code that looks very much like this::
+
+ def wsgi_app(self, environ):
+ with self.request_context(environ):
+ try:
+ response = self.full_dispatch_request()
+ except Exception, e:
+ response = self.make_response(self.handle_exception(e))
+ return response(environ, start_response)
+
+The method :meth:`~Flask.request_context` returns a new
+:class:`~flask.ctx.RequestContext` object and uses it in combination with
+the `with` statement to bind the context. Everything that is called from
+the same thread from this point onwards until the end of the `with`
+statement will have access to the request globals (:data:`flask.request`
+and others).
+
+The request context internally works like a stack: The topmost level on
+the stack is the current active request.
+:meth:`~flask.ctx.RequestContext.push` adds the context to the stack on
+the very top, :meth:`~flask.ctx.RequestContext.pop` removes it from the
+stack again. On popping the application's
+:func:`~flask.Flask.teardown_request` functions are also executed.
+
+.. _callbacks-and-errors:
+
+Callbacks and Errors
+--------------------
+
+What happens if an error occurs in Flask during request processing? This
+particular behavior changed in 0.7 because we wanted to make it easier to
+understand what is actually happening. The new behavior is quite simple:
+
+1. Before each request, :meth:`~flask.Flask.before_request` functions are
+ executed. If one of these functions return a response, the other
+ functions are no longer called. In any case however the return value
+ is treated as a replacement for the view's return value.
+
+2. If the :meth:`~flask.Flask.before_request` functions did not return a
+ response, the regular request handling kicks in and the view function
+ that was matched has the chance to return a response.
+
+3. The return value of the view is then converted into an actual response
+ object and handed over to the :meth:`~flask.Flask.after_request`
+ functions which have the chance to replace it or modify it in place.
+
+4. At the end of the request the :meth:`~flask.Flask.teardown_request`
+ functions are executed. This always happens, even in case of an
+ unhandled exception down the road or if a before-request handler was
+ not executed yet or at all (for example in test environments sometimes
+ you might want to not execute before-request callbacks).
+
+Now what happens on errors? In production mode if an exception is not
+caught, the 500 internal server handler is called. In development mode
+however the exception is not further processed and bubbles up to the WSGI
+server. That way things like the interactive debugger can provide helpful
+debug information.
+
+An important change in 0.7 is that the internal server error is now no
+longer post processed by the after request callbacks and after request
+callbacks are no longer guaranteed to be executed. This way the internal
+dispatching code looks cleaner and is easier to customize and understand.
+
+The new teardown functions are supposed to be used as a replacement for
+things that absolutely need to happen at the end of request.
+
+Teardown Callbacks
+------------------
+
+The teardown callbacks are special callbacks in that they are executed at
+at different point. Strictly speaking they are independent of the actual
+request handling as they are bound to the lifecycle of the
+:class:`~flask.ctx.RequestContext` object. When the request context is
+popped, the :meth:`~flask.Flask.teardown_request` functions are called.
+
+This is important to know if the life of the request context is prolonged
+by using the test client in a with statement or when using the request
+context from the command line::
+
+ with app.test_client() as client:
+ resp = client.get('/foo')
+ # the teardown functions are still not called at that point
+ # even though the response ended and you have the response
+ # object in your hand
+
+ # only when the code reaches this point the teardown functions
+ # are called. Alternatively the same thing happens if another
+ # request was triggered from the test client
+
+It's easy to see the behavior from the command line:
+
+>>> app = Flask(__name__)
+>>> @app.teardown_request
+... def teardown_request(exception=None):
+... print 'this runs after request'
+...
+>>> ctx = app.test_request_context()
+>>> ctx.push()
+>>> ctx.pop()
+this runs after request
+>>>
+
+Keep in mind that teardown callbacks are always executed, even if
+before-request callbacks were not executed yet but an exception happened.
+Certain parts of the test system might also temporarily create a request
+context without calling the before-request handlers. Make sure to write
+your teardown-request handlers in a way that they will never fail.
+
+.. _notes-on-proxies:
+
+Notes On Proxies
+----------------
+
+Some of the objects provided by Flask are proxies to other objects. The
+reason behind this is that these proxies are shared between threads and
+they have to dispatch to the actual object bound to a thread behind the
+scenes as necessary.
+
+Most of the time you don't have to care about that, but there are some
+exceptions where it is good to know that this object is an actual proxy:
+
+- The proxy objects do not fake their inherited types, so if you want to
+ perform actual instance checks, you have to do that on the instance
+ that is being proxied (see `_get_current_object` below).
+- if the object reference is important (so for example for sending
+ :ref:`signals`)
+
+If you need to get access to the underlying object that is proxied, you
+can use the :meth:`~werkzeug.local.LocalProxy._get_current_object` method::
+
+ app = current_app._get_current_object()
+ my_signal.send(app)
+
+Context Preservation on Error
+-----------------------------
+
+If an error occurs or not, at the end of the request the request context
+is popped and all data associated with it is destroyed. During
+development however that can be problematic as you might want to have the
+information around for a longer time in case an exception occurred. In
+Flask 0.6 and earlier in debug mode, if an exception occurred, the
+request context was not popped so that the interactive debugger can still
+provide you with important information.
+
+Starting with Flask 0.7 you have finer control over that behavior by
+setting the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable. By
+default it's linked to the setting of ``DEBUG``. If the application is in
+debug mode the context is preserved, in production mode it's not.
+
+Do not force activate ``PRESERVE_CONTEXT_ON_EXCEPTION`` in production mode
+as it will cause your application to leak memory on exceptions. However
+it can be useful during development to get the same error preserving
+behavior as in development mode when attempting to debug an error that
+only occurs under production settings.
diff --git a/app/static/doc/flask-docs/_sources/security.txt b/app/static/doc/flask-docs/_sources/security.txt
new file mode 100644
index 0000000..909ef53
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/security.txt
@@ -0,0 +1,175 @@
+Security Considerations
+=======================
+
+Web applications usually face all kinds of security problems and it's very
+hard to get everything right. Flask tries to solve a few of these things
+for you, but there are a couple more you have to take care of yourself.
+
+.. _xss:
+
+Cross-Site Scripting (XSS)
+--------------------------
+
+Cross site scripting is the concept of injecting arbitrary HTML (and with
+it JavaScript) into the context of a website. To remedy this, developers
+have to properly escape text so that it cannot include arbitrary HTML
+tags. For more information on that have a look at the Wikipedia article
+on `Cross-Site Scripting
+<http://en.wikipedia.org/wiki/Cross-site_scripting>`_.
+
+Flask configures Jinja2 to automatically escape all values unless
+explicitly told otherwise. This should rule out all XSS problems caused
+in templates, but there are still other places where you have to be
+careful:
+
+- generating HTML without the help of Jinja2
+- calling :class:`~flask.Markup` on data submitted by users
+- sending out HTML from uploaded files, never do that, use the
+ `Content-Disposition: attachment` header to prevent that problem.
+- sending out textfiles from uploaded files. Some browsers are using
+ content-type guessing based on the first few bytes so users could
+ trick a browser to execute HTML.
+
+Another thing that is very important are unquoted attributes. While
+Jinja2 can protect you from XSS issues by escaping HTML, there is one
+thing it cannot protect you from: XSS by attribute injection. To counter
+this possible attack vector, be sure to always quote your attributes with
+either double or single quotes when using Jinja expressions in them:
+
+.. sourcecode:: html+jinja
+
+ <a href="{{ href }}">the text</a>
+
+Why is this necessary? Because if you would not be doing that, an
+attacker could easily inject custom JavaScript handlers. For example an
+attacker could inject this piece of HTML+JavaScript:
+
+.. sourcecode:: html
+
+ onmouseover=alert(document.cookie)
+
+When the user would then move with the mouse over the link, the cookie
+would be presented to the user in an alert window. But instead of showing
+the cookie to the user, a good attacker might also execute any other
+JavaScript code. In combination with CSS injections the attacker might
+even make the element fill out the entire page so that the user would
+just have to have the mouse anywhere on the page to trigger the attack.
+
+Cross-Site Request Forgery (CSRF)
+---------------------------------
+
+Another big problem is CSRF. This is a very complex topic and I won't
+outline it here in detail just mention what it is and how to theoretically
+prevent it.
+
+If your authentication information is stored in cookies, you have implicit
+state management. The state of "being logged in" is controlled by a
+cookie, and that cookie is sent with each request to a page.
+Unfortunately that includes requests triggered by 3rd party sites. If you
+don't keep that in mind, some people might be able to trick your
+application's users with social engineering to do stupid things without
+them knowing.
+
+Say you have a specific URL that, when you sent `POST` requests to will
+delete a user's profile (say `http://example.com/user/delete`). If an
+attacker now creates a page that sends a post request to that page with
+some JavaScript they just has to trick some users to load that page and
+their profiles will end up being deleted.
+
+Imagine you were to run Facebook with millions of concurrent users and
+someone would send out links to images of little kittens. When users
+would go to that page, their profiles would get deleted while they are
+looking at images of fluffy cats.
+
+How can you prevent that? Basically for each request that modifies
+content on the server you would have to either use a one-time token and
+store that in the cookie **and** also transmit it with the form data.
+After receiving the data on the server again, you would then have to
+compare the two tokens and ensure they are equal.
+
+Why does Flask not do that for you? The ideal place for this to happen is
+the form validation framework, which does not exist in Flask.
+
+.. _json-security:
+
+JSON Security
+-------------
+
+.. admonition:: ECMAScript 5 Changes
+
+ Starting with ECMAScript 5 the behavior of literals changed. Now they
+ are not constructed with the constructor of ``Array`` and others, but
+ with the builtin constructor of ``Array`` which closes this particular
+ attack vector.
+
+JSON itself is a high-level serialization format, so there is barely
+anything that could cause security problems, right? You can't declare
+recursive structures that could cause problems and the only thing that
+could possibly break are very large responses that can cause some kind of
+denial of service at the receiver's side.
+
+However there is a catch. Due to how browsers work the CSRF issue comes
+up with JSON unfortunately. Fortunately there is also a weird part of the
+JavaScript specification that can be used to solve that problem easily and
+Flask is kinda doing that for you by preventing you from doing dangerous
+stuff. Unfortunately that protection is only there for
+:func:`~flask.jsonify` so you are still at risk when using other ways to
+generate JSON.
+
+So what is the issue and how to avoid it? The problem are arrays at
+top-level in JSON. Imagine you send the following data out in a JSON
+request. Say that's exporting the names and email addresses of all your
+friends for a part of the user interface that is written in JavaScript.
+Not very uncommon:
+
+.. sourcecode:: javascript
+
+ [
+ {"username": "admin",
+ "email": "admin@localhost"}
+ ]
+
+And it is doing that of course only as long as you are logged in and only
+for you. And it is doing that for all `GET` requests to a certain URL,
+say the URL for that request is
+``http://example.com/api/get_friends.json``.
+
+So now what happens if a clever hacker is embedding this to his website
+and social engineers a victim to visiting his site:
+
+.. sourcecode:: html
+
+ <script type=text/javascript>
+ var captured = [];
+ var oldArray = Array;
+ function Array() {
+ var obj = this, id = 0, capture = function(value) {
+ obj.__defineSetter__(id++, capture);
+ if (value)
+ captured.push(value);
+ };
+ capture();
+ }
+ </script>
+ <script type=text/javascript
+ src=http://example.com/api/get_friends.json></script>
+ <script type=text/javascript>
+ Array = oldArray;
+ // now we have all the data in the captured array.
+ </script>
+
+If you know a bit of JavaScript internals you might know that it's
+possible to patch constructors and register callbacks for setters. An
+attacker can use this (like above) to get all the data you exported in
+your JSON file. The browser will totally ignore the ``application/json``
+mimetype if ``text/javascript`` is defined as content type in the script
+tag and evaluate that as JavaScript. Because top-level array elements are
+allowed (albeit useless) and we hooked in our own constructor, after that
+page loaded the data from the JSON response is in the `captured` array.
+
+Because it is a syntax error in JavaScript to have an object literal
+(``{...}``) toplevel an attacker could not just do a request to an
+external URL with the script tag to load up the data. So what Flask does
+is to only allow objects as toplevel elements when using
+:func:`~flask.jsonify`. Make sure to do the same when using an ordinary
+JSON generate function.
diff --git a/app/static/doc/flask-docs/_sources/shell.txt b/app/static/doc/flask-docs/_sources/shell.txt
new file mode 100644
index 0000000..61b9dc0
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/shell.txt
@@ -0,0 +1,93 @@
+.. _shell:
+
+Working with the Shell
+======================
+
+.. versionadded:: 0.3
+
+One of the reasons everybody loves Python is the interactive shell. It
+basically allows you to execute Python commands in real time and
+immediately get results back. Flask itself does not come with an
+interactive shell, because it does not require any specific setup upfront,
+just import your application and start playing around.
+
+There are however some handy helpers to make playing around in the shell a
+more pleasant experience. The main issue with interactive console
+sessions is that you're not triggering a request like a browser does which
+means that :data:`~flask.g`, :data:`~flask.request` and others are not
+available. But the code you want to test might depend on them, so what
+can you do?
+
+This is where some helper functions come in handy. Keep in mind however
+that these functions are not only there for interactive shell usage, but
+also for unittesting and other situations that require a faked request
+context.
+
+Generally it's recommended that you read the :ref:`request-context`
+chapter of the documentation first.
+
+Creating a Request Context
+--------------------------
+
+The easiest way to create a proper request context from the shell is by
+using the :attr:`~flask.Flask.test_request_context` method which creates
+us a :class:`~flask.ctx.RequestContext`:
+
+>>> ctx = app.test_request_context()
+
+Normally you would use the `with` statement to make this request object
+active, but in the shell it's easier to use the
+:meth:`~flask.ctx.RequestContext.push` and
+:meth:`~flask.ctx.RequestContext.pop` methods by hand:
+
+>>> ctx.push()
+
+From that point onwards you can work with the request object until you
+call `pop`:
+
+>>> ctx.pop()
+
+Firing Before/After Request
+---------------------------
+
+By just creating a request context, you still don't have run the code that
+is normally run before a request. This might result in your database
+being unavailable if you are connecting to the database in a
+before-request callback or the current user not being stored on the
+:data:`~flask.g` object etc.
+
+This however can easily be done yourself. Just call
+:meth:`~flask.Flask.preprocess_request`:
+
+>>> ctx = app.test_request_context()
+>>> ctx.push()
+>>> app.preprocess_request()
+
+Keep in mind that the :meth:`~flask.Flask.preprocess_request` function
+might return a response object, in that case just ignore it.
+
+To shutdown a request, you need to trick a bit before the after request
+functions (triggered by :meth:`~flask.Flask.process_response`) operate on
+a response object:
+
+>>> app.process_response(app.response_class())
+<Response 0 bytes [200 OK]>
+>>> ctx.pop()
+
+The functions registered as :meth:`~flask.Flask.teardown_request` are
+automatically called when the context is popped. So this is the perfect
+place to automatically tear down resources that were needed by the request
+context (such as database connections).
+
+
+Further Improving the Shell Experience
+--------------------------------------
+
+If you like the idea of experimenting in a shell, create yourself a module
+with stuff you want to star import into your interactive session. There
+you could also define some more helper methods for common things such as
+initializing the database, dropping tables etc.
+
+Just put them into a module (like `shelltools` and import from there):
+
+>>> from shelltools import *
diff --git a/app/static/doc/flask-docs/_sources/signals.txt b/app/static/doc/flask-docs/_sources/signals.txt
new file mode 100644
index 0000000..0d1d9ee
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/signals.txt
@@ -0,0 +1,255 @@
+.. _signals:
+
+Signals
+=======
+
+.. versionadded:: 0.6
+
+Starting with Flask 0.6, there is integrated support for signalling in
+Flask. This support is provided by the excellent `blinker`_ library and
+will gracefully fall back if it is not available.
+
+What are signals? Signals help you decouple applications by sending
+notifications when actions occur elsewhere in the core framework or
+another Flask extensions. In short, signals allow certain senders to
+notify subscribers that something happened.
+
+Flask comes with a couple of signals and other extensions might provide
+more. Also keep in mind that signals are intended to notify subscribers
+and should not encourage subscribers to modify data. You will notice that
+there are signals that appear to do the same thing like some of the
+builtin decorators do (eg: :data:`~flask.request_started` is very similar
+to :meth:`~flask.Flask.before_request`). There are however difference in
+how they work. The core :meth:`~flask.Flask.before_request` handler for
+example is executed in a specific order and is able to abort the request
+early by returning a response. In contrast all signal handlers are
+executed in undefined order and do not modify any data.
+
+The big advantage of signals over handlers is that you can safely
+subscribe to them for the split of a second. These temporary
+subscriptions are helpful for unittesting for example. Say you want to
+know what templates were rendered as part of a request: signals allow you
+to do exactly that.
+
+Subscribing to Signals
+----------------------
+
+To subscribe to a signal, you can use the
+:meth:`~blinker.base.Signal.connect` method of a signal. The first
+argument is the function that should be called when the signal is emitted,
+the optional second argument specifies a sender. To unsubscribe from a
+signal, you can use the :meth:`~blinker.base.Signal.disconnect` method.
+
+For all core Flask signals, the sender is the application that issued the
+signal. When you subscribe to a signal, be sure to also provide a sender
+unless you really want to listen for signals of all applications. This is
+especially true if you are developing an extension.
+
+Here for example a helper context manager that can be used to figure out
+in a unittest which templates were rendered and what variables were passed
+to the template::
+
+ from flask import template_rendered
+ from contextlib import contextmanager
+
+ @contextmanager
+ def captured_templates(app):
+ recorded = []
+ def record(sender, template, context):
+ recorded.append((template, context))
+ template_rendered.connect(record, app)
+ try:
+ yield recorded
+ finally:
+ template_rendered.disconnect(record, app)
+
+This can now easily be paired with a test client::
+
+ with captured_templates(app) as templates:
+ rv = app.test_client().get('/')
+ assert rv.status_code == 200
+ assert len(templates) == 1
+ template, context = templates[0]
+ assert template.name == 'index.html'
+ assert len(context['items']) == 10
+
+All the template rendering in the code issued by the application `app`
+in the body of the `with` block will now be recorded in the `templates`
+variable. Whenever a template is rendered, the template object as well as
+context are appended to it.
+
+Additionally there is a convenient helper method
+(:meth:`~blinker.base.Signal.connected_to`). that allows you to
+temporarily subscribe a function to a signal with is a context manager on
+its own. Because the return value of the context manager cannot be
+specified that way one has to pass the list in as argument::
+
+ from flask import template_rendered
+
+ def captured_templates(app, recorded):
+ def record(sender, template, context):
+ recorded.append((template, context))
+ return template_rendered.connected_to(record, app)
+
+The example above would then look like this::
+
+ templates = []
+ with captured_templates(app, templates):
+ ...
+ template, context = templates[0]
+
+.. admonition:: Blinker API Changes
+
+ The :meth:`~blinker.base.Signal.connected_to` method arrived in Blinker
+ with version 1.1.
+
+Creating Signals
+----------------
+
+If you want to use signals in your own application, you can use the
+blinker library directly. The most common use case are named signals in a
+custom :class:`~blinker.base.Namespace`.. This is what is recommended
+most of the time::
+
+ from blinker import Namespace
+ my_signals = Namespace()
+
+Now you can create new signals like this::
+
+ model_saved = my_signals.signal('model-saved')
+
+The name for the signal here makes it unique and also simplifies
+debugging. You can access the name of the signal with the
+:attr:`~blinker.base.NamedSignal.name` attribute.
+
+.. admonition:: For Extension Developers
+
+ If you are writing a Flask extension and you want to gracefully degrade for
+ missing blinker installations, you can do so by using the
+ :class:`flask.signals.Namespace` class.
+
+Sending Signals
+---------------
+
+If you want to emit a signal, you can do so by calling the
+:meth:`~blinker.base.Signal.send` method. It accepts a sender as first
+argument and optionally some keyword arguments that are forwarded to the
+signal subscribers::
+
+ class Model(object):
+ ...
+
+ def save(self):
+ model_saved.send(self)
+
+Try to always pick a good sender. If you have a class that is emitting a
+signal, pass `self` as sender. If you emitting a signal from a random
+function, you can pass ``current_app._get_current_object()`` as sender.
+
+.. admonition:: Passing Proxies as Senders
+
+ Never pass :data:`~flask.current_app` as sender to a signal. Use
+ ``current_app._get_current_object()`` instead. The reason for this is
+ that :data:`~flask.current_app` is a proxy and not the real application
+ object.
+
+Decorator Based Signal Subscriptions
+------------------------------------
+
+With Blinker 1.1 you can also easily subscribe to signals by using the new
+:meth:`~blinker.base.NamedSignal.connect_via` decorator::
+
+ from flask import template_rendered
+
+ @template_rendered.connect_via(app)
+ def when_template_rendered(sender, template, context):
+ print 'Template %s is rendered with %s' % (template.name, context)
+
+Core Signals
+------------
+
+.. when modifying this list, also update the one in api.rst
+
+The following signals exist in Flask:
+
+.. data:: flask.template_rendered
+ :noindex:
+
+ This signal is sent when a template was successfully rendered. The
+ signal is invoked with the instance of the template as `template`
+ and the context as dictionary (named `context`).
+
+ Example subscriber::
+
+ def log_template_renders(sender, template, context):
+ sender.logger.debug('Rendering template "%s" with context %s',
+ template.name or 'string template',
+ context)
+
+ from flask import template_rendered
+ template_rendered.connect(log_template_renders, app)
+
+.. data:: flask.request_started
+ :noindex:
+
+ This signal is sent before any request processing started but when the
+ request context was set up. Because the request context is already
+ bound, the subscriber can access the request with the standard global
+ proxies such as :class:`~flask.request`.
+
+ Example subscriber::
+
+ def log_request(sender):
+ sender.logger.debug('Request context is set up')
+
+ from flask import request_started
+ request_started.connect(log_request, app)
+
+.. data:: flask.request_finished
+ :noindex:
+
+ This signal is sent right before the response is sent to the client.
+ It is passed the response to be sent named `response`.
+
+ Example subscriber::
+
+ def log_response(sender, response):
+ sender.logger.debug('Request context is about to close down. '
+ 'Response: %s', response)
+
+ from flask import request_finished
+ request_finished.connect(log_response, app)
+
+.. data:: flask.got_request_exception
+ :noindex:
+
+ This signal is sent when an exception happens during request processing.
+ It is sent *before* the standard exception handling kicks in and even
+ in debug mode, where no exception handling happens. The exception
+ itself is passed to the subscriber as `exception`.
+
+ Example subscriber::
+
+ def log_exception(sender, exception):
+ sender.logger.debug('Got exception during processing: %s', exception)
+
+ from flask import got_request_exception
+ got_request_exception.connect(log_exception, app)
+
+.. data:: flask.request_tearing_down
+ :noindex:
+
+ This signal is sent when the request is tearing down. This is always
+ called, even if an exception is caused. Currently functions listening
+ to this signal are called after the regular teardown handlers, but this
+ is not something you can rely on.
+
+ Example subscriber::
+
+ def close_db_connection(sender):
+ session.close()
+
+ from flask import request_tearing_down
+ request_tearing_down.connect(close_db_connection, app)
+
+.. _blinker: http://pypi.python.org/pypi/blinker
diff --git a/app/static/doc/flask-docs/_sources/styleguide.txt b/app/static/doc/flask-docs/_sources/styleguide.txt
new file mode 100644
index 0000000..d46ecd0
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/styleguide.txt
@@ -0,0 +1,200 @@
+Pocoo Styleguide
+================
+
+The Pocoo styleguide is the styleguide for all Pocoo Projects, including
+Flask. This styleguide is a requirement for Patches to Flask and a
+recommendation for Flask extensions.
+
+In general the Pocoo Styleguide closely follows :pep:`8` with some small
+differences and extensions.
+
+General Layout
+--------------
+
+Indentation:
+ 4 real spaces. No tabs, no exceptions.
+
+Maximum line length:
+ 79 characters with a soft limit for 84 if absolutely necessary. Try
+ to avoid too nested code by cleverly placing `break`, `continue` and
+ `return` statements.
+
+Continuing long statements:
+ To continue a statement you can use backslashes in which case you should
+ align the next line with the last dot or equal sign, or indent four
+ spaces::
+
+ this_is_a_very_long(function_call, 'with many parameters') \
+ .that_returns_an_object_with_an_attribute
+
+ MyModel.query.filter(MyModel.scalar > 120) \
+ .order_by(MyModel.name.desc()) \
+ .limit(10)
+
+ If you break in a statement with parentheses or braces, align to the
+ braces::
+
+ this_is_a_very_long(function_call, 'with many parameters',
+ 23, 42, 'and even more')
+
+ For lists or tuples with many items, break immediately after the
+ opening brace::
+
+ items = [
+ 'this is the first', 'set of items', 'with more items',
+ 'to come in this line', 'like this'
+ ]
+
+Blank lines:
+ Top level functions and classes are separated by two lines, everything
+ else by one. Do not use too many blank lines to separate logical
+ segments in code. Example::
+
+ def hello(name):
+ print 'Hello %s!' % name
+
+
+ def goodbye(name):
+ print 'See you %s.' % name
+
+
+ class MyClass(object):
+ """This is a simple docstring"""
+
+ def __init__(self, name):
+ self.name = name
+
+ def get_annoying_name(self):
+ return self.name.upper() + '!!!!111'
+
+Expressions and Statements
+--------------------------
+
+General whitespace rules:
+ - No whitespace for unary operators that are not words
+ (e.g.: ``-``, ``~`` etc.) as well on the inner side of parentheses.
+ - Whitespace is placed between binary operators.
+
+ Good::
+
+ exp = -1.05
+ value = (item_value / item_count) * offset / exp
+ value = my_list[index]
+ value = my_dict['key']
+
+ Bad::
+
+ exp = - 1.05
+ value = ( item_value / item_count ) * offset / exp
+ value = (item_value/item_count)*offset/exp
+ value=( item_value/item_count ) * offset/exp
+ value = my_list[ index ]
+ value = my_dict ['key']
+
+Yoda statements are a no-go:
+ Never compare constant with variable, always variable with constant:
+
+ Good::
+
+ if method == 'md5':
+ pass
+
+ Bad::
+
+ if 'md5' == method:
+ pass
+
+Comparisons:
+ - against arbitrary types: ``==`` and ``!=``
+ - against singletons with ``is`` and ``is not`` (eg: ``foo is not
+ None``)
+ - never compare something with `True` or `False` (for example never
+ do ``foo == False``, do ``not foo`` instead)
+
+Negated containment checks:
+ use ``foo not in bar`` instead of ``not foo in bar``
+
+Instance checks:
+ ``isinstance(a, C)`` instead of ``type(A) is C``, but try to avoid
+ instance checks in general. Check for features.
+
+
+Naming Conventions
+------------------
+
+- Class names: ``CamelCase``, with acronyms kept uppercase (``HTTPWriter``
+ and not ``HttpWriter``)
+- Variable names: ``lowercase_with_underscores``
+- Method and function names: ``lowercase_with_underscores``
+- Constants: ``UPPERCASE_WITH_UNDERSCORES``
+- precompiled regular expressions: ``name_re``
+
+Protected members are prefixed with a single underscore. Double
+underscores are reserved for mixin classes.
+
+On classes with keywords, trailing underscores are appended. Clashes with
+builtins are allowed and **must not** be resolved by appending an
+underline to the variable name. If the function needs to access a
+shadowed builtin, rebind the builtin to a different name instead.
+
+Function and method arguments:
+ - class methods: ``cls`` as first parameter
+ - instance methods: ``self`` as first parameter
+ - lambdas for properties might have the first parameter replaced
+ with ``x`` like in ``display_name = property(lambda x: x.real_name
+ or x.username)``
+
+
+Docstrings
+----------
+
+Docstring conventions:
+ All docstrings are formatted with reStructuredText as understood by
+ Sphinx. Depending on the number of lines in the docstring, they are
+ laid out differently. If it's just one line, the closing triple
+ quote is on the same line as the opening, otherwise the text is on
+ the same line as the opening quote and the triple quote that closes
+ the string on its own line::
+
+ def foo():
+ """This is a simple docstring"""
+
+
+ def bar():
+ """This is a longer docstring with so much information in there
+ that it spans three lines. In this case the closing triple quote
+ is on its own line.
+ """
+
+Module header:
+ The module header consists of an utf-8 encoding declaration (if non
+ ASCII letters are used, but it is recommended all the time) and a
+ standard docstring::
+
+ # -*- coding: utf-8 -*-
+ """
+ package.module
+ ~~~~~~~~~~~~~~
+
+ A brief description goes here.
+
+ :copyright: (c) YEAR by AUTHOR.
+ :license: LICENSE_NAME, see LICENSE_FILE for more details.
+ """
+
+ Please keep in mind that proper copyrights and license files are a
+ requirement for approved Flask extensions.
+
+
+Comments
+--------
+
+Rules for comments are similar to docstrings. Both are formatted with
+reStructuredText. If a comment is used to document an attribute, put a
+colon after the opening pound sign (``#``)::
+
+ class User(object):
+ #: the name of the user as unicode string
+ name = Column(String)
+ #: the sha1 hash of the password + inline salt
+ pw_hash = Column(String)
diff --git a/app/static/doc/flask-docs/_sources/templating.txt b/app/static/doc/flask-docs/_sources/templating.txt
new file mode 100644
index 0000000..bd940b0
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/templating.txt
@@ -0,0 +1,188 @@
+Templates
+=========
+
+Flask leverages Jinja2 as template engine. You are obviously free to use
+a different template engine, but you still have to install Jinja2 to run
+Flask itself. This requirement is necessary to enable rich extensions.
+An extension can depend on Jinja2 being present.
+
+This section only gives a very quick introduction into how Jinja2
+is integrated into Flask. If you want information on the template
+engine's syntax itself, head over to the official `Jinja2 Template
+Documentation <http://jinja.pocoo.org/2/documentation/templates>`_ for
+more information.
+
+Jinja Setup
+-----------
+
+Unless customized, Jinja2 is configured by Flask as follows:
+
+- autoescaping is enabled for all templates ending in ``.html``,
+ ``.htm``, ``.xml`` as well as ``.xhtml``
+- a template has the ability to opt in/out autoescaping with the
+ ``{% autoescape %}`` tag.
+- Flask inserts a couple of global functions and helpers into the
+ Jinja2 context, additionally to the values that are present by
+ default.
+
+Standard Context
+----------------
+
+The following global variables are available within Jinja2 templates
+by default:
+
+.. data:: config
+ :noindex:
+
+ The current configuration object (:data:`flask.config`)
+
+ .. versionadded:: 0.6
+
+.. data:: request
+ :noindex:
+
+ The current request object (:class:`flask.request`)
+
+.. data:: session
+ :noindex:
+
+ The current session object (:class:`flask.session`)
+
+.. data:: g
+ :noindex:
+
+ The request-bound object for global variables (:data:`flask.g`)
+
+.. function:: url_for
+ :noindex:
+
+ The :func:`flask.url_for` function.
+
+.. function:: get_flashed_messages
+ :noindex:
+
+ The :func:`flask.get_flashed_messages` function.
+
+.. admonition:: The Jinja Context Behaviour
+
+ These variables are added to the context of variables, they are not
+ global variables. The difference is that by default these will not
+ show up in the context of imported templates. This is partially caused
+ by performance considerations, partially to keep things explicit.
+
+ What does this mean for you? If you have a macro you want to import,
+ that needs to access the request object you have two possibilities:
+
+ 1. you explicitly pass the request to the macro as parameter, or
+ the attribute of the request object you are interested in.
+ 2. you import the macro "with context".
+
+ Importing with context looks like this:
+
+ .. sourcecode:: jinja
+
+ {% from '_helpers.html' import my_macro with context %}
+
+Standard Filters
+----------------
+
+These filters are available in Jinja2 additionally to the filters provided
+by Jinja2 itself:
+
+.. function:: tojson
+ :noindex:
+
+ This function converts the given object into JSON representation. This
+ is for example very helpful if you try to generate JavaScript on the
+ fly.
+
+ Note that inside `script` tags no escaping must take place, so make
+ sure to disable escaping with ``|safe`` if you intend to use it inside
+ `script` tags:
+
+ .. sourcecode:: html+jinja
+
+ <script type=text/javascript>
+ doSomethingWith({{ user.username|tojson|safe }});
+ </script>
+
+ That the ``|tojson`` filter escapes forward slashes properly for you.
+
+Controlling Autoescaping
+------------------------
+
+Autoescaping is the concept of automatically escaping special characters
+of you. Special characters in the sense of HTML (or XML, and thus XHTML)
+are ``&``, ``>``, ``<``, ``"`` as well as ``'``. Because these characters
+carry specific meanings in documents on their own you have to replace them
+by so called "entities" if you want to use them for text. Not doing so
+would not only cause user frustration by the inability to use these
+characters in text, but can also lead to security problems. (see
+:ref:`xss`)
+
+Sometimes however you will need to disable autoescaping in templates.
+This can be the case if you want to explicitly inject HTML into pages, for
+example if they come from a system that generate secure HTML like a
+markdown to HTML converter.
+
+There are three ways to accomplish that:
+
+- In the Python code, wrap the HTML string in a :class:`~flask.Markup`
+ object before passing it to the template. This is in general the
+ recommended way.
+- Inside the template, use the ``|safe`` filter to explicitly mark a
+ string as safe HTML (``{{ myvariable|safe }}``)
+- Temporarily disable the autoescape system altogether.
+
+To disable the autoescape system in templates, you can use the ``{%
+autoescape %}`` block:
+
+.. sourcecode:: html+jinja
+
+ {% autoescape false %}
+ <p>autoescaping is disabled here
+ <p>{{ will_not_be_escaped }}
+ {% endautoescape %}
+
+Whenever you do this, please be very cautious about the variables you are
+using in this block.
+
+Registering Filters
+-------------------
+
+If you want to register your own filters in Jinja2 you have two ways to do
+that. You can either put them by hand into the
+:attr:`~flask.Flask.jinja_env` of the application or use the
+:meth:`~flask.Flask.template_filter` decorator.
+
+The two following examples work the same and both reverse an object::
+
+ @app.template_filter('reverse')
+ def reverse_filter(s):
+ return s[::-1]
+
+ def reverse_filter(s):
+ return s[::-1]
+ app.jinja_env.filters['reverse'] = reverse_filter
+
+In case of the decorator the argument is optional if you want to use the
+function name as name of the filter.
+
+Context Processors
+------------------
+
+To inject new variables automatically into the context of a template
+context processors exist in Flask. Context processors run before the
+template is rendered and have the ability to inject new values into the
+template context. A context processor is a function that returns a
+dictionary. The keys and values of this dictionary are then merged with
+the template context::
+
+ @app.context_processor
+ def inject_user():
+ return dict(user=g.user)
+
+The context processor above makes a variable called `user` available in
+the template with the value of `g.user`. This example is not very
+interesting because `g` is available in templates anyways, but it gives an
+idea how this works.
diff --git a/app/static/doc/flask-docs/_sources/testing.txt b/app/static/doc/flask-docs/_sources/testing.txt
new file mode 100644
index 0000000..1e00fe8
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/testing.txt
@@ -0,0 +1,307 @@
+.. _testing:
+
+Testing Flask Applications
+==========================
+
+ **Something that is untested is broken.**
+
+The origin of this quote is unknown and while it is not entirely correct, it is also
+not far from the truth. Untested applications make it hard to
+improve existing code and developers of untested applications tend to
+become pretty paranoid. If an application has automated tests, you can
+safely make changes and instantly know if anything breaks.
+
+Flask provides a way to test your application by exposing the Werkzeug
+test :class:`~werkzeug.test.Client` and handling the context locals for you.
+You can then use that with your favourite testing solution. In this documentation
+we will use the :mod:`unittest` package that comes pre-installed with Python.
+
+The Application
+---------------
+
+First, we need an application to test; we will use the application from
+the :ref:`tutorial`. If you don't have that application yet, get the
+sources from `the examples`_.
+
+.. _the examples:
+ http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/
+
+The Testing Skeleton
+--------------------
+
+In order to test the application, we add a second module
+(`flaskr_tests.py`) and create a unittest skeleton there::
+
+ import os
+ import flaskr
+ import unittest
+ import tempfile
+
+ class FlaskrTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
+ flaskr.app.config['TESTING'] = True
+ self.app = flaskr.app.test_client()
+ flaskr.init_db()
+
+ def tearDown(self):
+ os.close(self.db_fd)
+ os.unlink(flaskr.app.config['DATABASE'])
+
+ if __name__ == '__main__':
+ unittest.main()
+
+The code in the :meth:`~unittest.TestCase.setUp` method creates a new test
+client and initializes a new database. This function is called before
+each individual test function is run. To delete the database after the
+test, we close the file and remove it from the filesystem in the
+:meth:`~unittest.TestCase.tearDown` method. Additionally during setup the
+``TESTING`` config flag is activated. What it does is disabling the error
+catching during request handling so that you get better error reports when
+performing test requests against the application.
+
+This test client will give us a simple interface to the application. We can
+trigger test requests to the application, and the client will also keep track
+of cookies for us.
+
+Because SQLite3 is filesystem-based we can easily use the tempfile module
+to create a temporary database and initialize it. The
+:func:`~tempfile.mkstemp` function does two things for us: it returns a
+low-level file handle and a random file name, the latter we use as
+database name. We just have to keep the `db_fd` around so that we can use
+the :func:`os.close` function to close the file.
+
+If we now run the test suite, we should see the following output::
+
+ $ python flaskr_tests.py
+
+ ----------------------------------------------------------------------
+ Ran 0 tests in 0.000s
+
+ OK
+
+Even though it did not run any actual tests, we already know that our flaskr
+application is syntactically valid, otherwise the import would have died
+with an exception.
+
+The First Test
+--------------
+
+Now it's time to start testing the functionality of the application.
+Let's check that the application shows "No entries here so far" if we
+access the root of the application (``/``). To do this, we add a new
+test method to our class, like this::
+
+ class FlaskrTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
+ self.app = flaskr.app.test_client()
+ flaskr.init_db()
+
+ def tearDown(self):
+ os.close(self.db_fd)
+ os.unlink(flaskr.DATABASE)
+
+ def test_empty_db(self):
+ rv = self.app.get('/')
+ assert 'No entries here so far' in rv.data
+
+Notice that our test functions begin with the word `test`; this allows
+:mod:`unittest` to automatically identify the method as a test to run.
+
+By using `self.app.get` we can send an HTTP `GET` request to the application with
+the given path. The return value will be a :class:`~flask.Flask.response_class` object.
+We can now use the :attr:`~werkzeug.wrappers.BaseResponse.data` attribute to inspect
+the return value (as string) from the application. In this case, we ensure that
+``'No entries here so far'`` is part of the output.
+
+Run it again and you should see one passing test::
+
+ $ python flaskr_tests.py
+ .
+ ----------------------------------------------------------------------
+ Ran 1 test in 0.034s
+
+ OK
+
+Logging In and Out
+------------------
+
+The majority of the functionality of our application is only available for
+the administrative user, so we need a way to log our test client in and out
+of the application. To do this, we fire some requests to the login and logout
+pages with the required form data (username and password). And because the
+login and logout pages redirect, we tell the client to `follow_redirects`.
+
+Add the following two methods to your `FlaskrTestCase` class::
+
+ def login(self, username, password):
+ return self.app.post('/login', data=dict(
+ username=username,
+ password=password
+ ), follow_redirects=True)
+
+ def logout(self):
+ return self.app.get('/logout', follow_redirects=True)
+
+Now we can easily test that logging in and out works and that it fails with
+invalid credentials. Add this new test to the class::
+
+ def test_login_logout(self):
+ rv = self.login('admin', 'default')
+ assert 'You were logged in' in rv.data
+ rv = self.logout()
+ assert 'You were logged out' in rv.data
+ rv = self.login('adminx', 'default')
+ assert 'Invalid username' in rv.data
+ rv = self.login('admin', 'defaultx')
+ assert 'Invalid password' in rv.data
+
+Test Adding Messages
+--------------------
+
+We should also test that adding messages works. Add a new test method
+like this::
+
+ def test_messages(self):
+ self.login('admin', 'default')
+ rv = self.app.post('/add', data=dict(
+ title='<Hello>',
+ text='<strong>HTML</strong> allowed here'
+ ), follow_redirects=True)
+ assert 'No entries here so far' not in rv.data
+ assert '&lt;Hello&gt;' in rv.data
+ assert '<strong>HTML</strong> allowed here' in rv.data
+
+Here we check that HTML is allowed in the text but not in the title,
+which is the intended behavior.
+
+Running that should now give us three passing tests::
+
+ $ python flaskr_tests.py
+ ...
+ ----------------------------------------------------------------------
+ Ran 3 tests in 0.332s
+
+ OK
+
+For more complex tests with headers and status codes, check out the
+`MiniTwit Example`_ from the sources which contains a larger test
+suite.
+
+
+.. _MiniTwit Example:
+ http://github.com/mitsuhiko/flask/tree/master/examples/minitwit/
+
+
+Other Testing Tricks
+--------------------
+
+Besides using the test client as shown above, there is also the
+:meth:`~flask.Flask.test_request_context` method that can be used
+in combination with the `with` statement to activate a request context
+temporarily. With this you can access the :class:`~flask.request`,
+:class:`~flask.g` and :class:`~flask.session` objects like in view
+functions. Here is a full example that demonstrates this approach::
+
+ app = flask.Flask(__name__)
+
+ with app.test_request_context('/?name=Peter'):
+ assert flask.request.path == '/'
+ assert flask.request.args['name'] == 'Peter'
+
+All the other objects that are context bound can be used in the same
+way.
+
+If you want to test your application with different configurations and
+there does not seem to be a good way to do that, consider switching to
+application factories (see :ref:`app-factories`).
+
+Note however that if you are using a test request context, the
+:meth:`~flask.Flask.before_request` functions are not automatically called
+same for :meth:`~flask.Flask.after_request` functions. However
+:meth:`~flask.Flask.teardown_request` functions are indeed executed when
+the test request context leaves the `with` block. If you do want the
+:meth:`~flask.Flask.before_request` functions to be called as well, you
+need to call :meth:`~flask.Flask.preprocess_request` yourself::
+
+ app = flask.Flask(__name__)
+
+ with app.test_request_context('/?name=Peter'):
+ app.preprocess_request()
+ ...
+
+This can be necessary to open database connections or something similar
+depending on how your application was designed.
+
+If you want to call the :meth:`~flask.Flask.after_request` functions you
+need to call into :meth:`~flask.Flask.process_response` which however
+requires that you pass it a response object::
+
+ app = flask.Flask(__name__)
+
+ with app.test_request_context('/?name=Peter'):
+ resp = Response('...')
+ resp = app.process_response(resp)
+ ...
+
+This in general is less useful because at that point you can directly
+start using the test client.
+
+
+Keeping the Context Around
+--------------------------
+
+.. versionadded:: 0.4
+
+Sometimes it is helpful to trigger a regular request but still keep the
+context around for a little longer so that additional introspection can
+happen. With Flask 0.4 this is possible by using the
+:meth:`~flask.Flask.test_client` with a `with` block::
+
+ app = flask.Flask(__name__)
+
+ with app.test_client() as c:
+ rv = c.get('/?tequila=42')
+ assert request.args['tequila'] == '42'
+
+If you were to use just the :meth:`~flask.Flask.test_client` without
+the `with` block, the `assert` would fail with an error because `request`
+is no longer available (because you are trying to use it outside of the actual request).
+However, keep in mind that any :meth:`~flask.Flask.after_request` functions
+are already called at this point so your database connection and
+everything involved is probably already closed down.
+
+
+Accessing and Modifying Sessions
+--------------------------------
+
+.. versionadded:: 0.8
+
+Sometimes it can be very helpful to access or modify the sessions from the
+test client. Generally there are two ways for this. If you just want to
+ensure that a session has certain keys set to certain values you can just
+keep the context around and access :data:`flask.session`::
+
+ with app.test_client() as c:
+ rv = c.get('/')
+ assert flask.session['foo'] == 42
+
+This however does not make it possible to also modify the session or to
+access the session before a request was fired. Starting with Flask 0.8 we
+provide a so called “session transaction” which simulates the appropriate
+calls to open a session in the context of the test client and to modify
+it. At the end of the transaction the session is stored. This works
+independently of the session backend used::
+
+ with app.test_client() as c:
+ with c.session_transaction() as sess:
+ sess['a_key'] = 'a value'
+
+ # once this is reached the session was stored
+
+Note that in this case you have to use the ``sess`` object instead of the
+:data:`flask.session` proxy. The object however itself will provide the
+same interface.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/css.txt b/app/static/doc/flask-docs/_sources/tutorial/css.txt
new file mode 100644
index 0000000..03f62ed
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/css.txt
@@ -0,0 +1,31 @@
+.. _tutorial-css:
+
+Step 7: Adding Style
+====================
+
+Now that everything else works, it's time to add some style to the
+application. Just create a stylesheet called `style.css` in the `static`
+folder we created before:
+
+.. sourcecode:: css
+
+ body { font-family: sans-serif; background: #eee; }
+ a, h1, h2 { color: #377BA8; }
+ h1, h2 { font-family: 'Georgia', serif; margin: 0; }
+ h1 { border-bottom: 2px solid #eee; }
+ h2 { font-size: 1.2em; }
+
+ .page { margin: 2em auto; width: 35em; border: 5px solid #ccc;
+ padding: 0.8em; background: white; }
+ .entries { list-style: none; margin: 0; padding: 0; }
+ .entries li { margin: 0.8em 1.2em; }
+ .entries li h2 { margin-left: -1em; }
+ .add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; }
+ .add-entry dl { font-weight: bold; }
+ .metanav { text-align: right; font-size: 0.8em; padding: 0.3em;
+ margin-bottom: 1em; background: #fafafa; }
+ .flash { background: #CEE5F5; padding: 0.5em;
+ border: 1px solid #AACBE2; }
+ .error { background: #F0D6D6; padding: 0.5em; }
+
+Continue with :ref:`tutorial-testing`.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/dbcon.txt b/app/static/doc/flask-docs/_sources/tutorial/dbcon.txt
new file mode 100644
index 0000000..99391a2
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/dbcon.txt
@@ -0,0 +1,57 @@
+.. _tutorial-dbcon:
+
+Step 4: Request Database Connections
+------------------------------------
+
+Now we know how we can open database connections and use them for scripts,
+but how can we elegantly do that for requests? We will need the database
+connection in all our functions so it makes sense to initialize them
+before each request and shut them down afterwards.
+
+Flask allows us to do that with the :meth:`~flask.Flask.before_request`,
+:meth:`~flask.Flask.after_request` and :meth:`~flask.Flask.teardown_request`
+decorators::
+
+ @app.before_request
+ def before_request():
+ g.db = connect_db()
+
+ @app.teardown_request
+ def teardown_request(exception):
+ g.db.close()
+
+Functions marked with :meth:`~flask.Flask.before_request` are called before
+a request and passed no arguments. Functions marked with
+:meth:`~flask.Flask.after_request` are called after a request and
+passed the response that will be sent to the client. They have to return
+that response object or a different one. They are however not guaranteed
+to be executed if an exception is raised, this is where functions marked with
+:meth:`~flask.Flask.teardown_request` come in. They get called after the
+response has been constructed. They are not allowed to modify the request, and
+their return values are ignored. If an exception occurred while the request was
+being processed, it is passed to each function; otherwise, `None` is passed in.
+
+We store our current database connection on the special :data:`~flask.g`
+object that Flask provides for us. This object stores information for one
+request only and is available from within each function. Never store such
+things on other objects because this would not work with threaded
+environments. That special :data:`~flask.g` object does some magic behind
+the scenes to ensure it does the right thing.
+
+Continue to :ref:`tutorial-views`.
+
+.. hint:: Where do I put this code?
+
+ If you've been following along in this tutorial, you might be wondering
+ where to put the code from this step and the next. A logical place is to
+ group these module-level functions together, and put your new
+ ``before_request`` and ``teardown_request`` functions below your existing
+ ``init_db`` function (following the tutorial line-by-line).
+
+ If you need a moment to find your bearings, take a look at how the `example
+ source`_ is organized. In Flask, you can put all of your application code
+ into a single Python module. You don't have to, and if your app :ref:`grows
+ larger <larger-applications>`, it's a good idea not to.
+
+.. _example source:
+ http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/
diff --git a/app/static/doc/flask-docs/_sources/tutorial/dbinit.txt b/app/static/doc/flask-docs/_sources/tutorial/dbinit.txt
new file mode 100644
index 0000000..b546a1a
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/dbinit.txt
@@ -0,0 +1,67 @@
+.. _tutorial-dbinit:
+
+Step 3: Creating The Database
+=============================
+
+Flaskr is a database powered application as outlined earlier, and more
+precisely, an application powered by a relational database system. Such
+systems need a schema that tells them how to store that information. So
+before starting the server for the first time it's important to create
+that schema.
+
+Such a schema can be created by piping the `schema.sql` file into the
+`sqlite3` command as follows::
+
+ sqlite3 /tmp/flaskr.db < schema.sql
+
+The downside of this is that it requires the sqlite3 command to be
+installed which is not necessarily the case on every system. Also one has
+to provide the path to the database there which leaves some place for
+errors. It's a good idea to add a function that initializes the database
+for you to the application.
+
+If you want to do that, you first have to import the
+:func:`contextlib.closing` function from the contextlib package. If you
+want to use Python 2.5 it's also necessary to enable the `with` statement
+first (`__future__` imports must be the very first import)::
+
+ from __future__ import with_statement
+ from contextlib import closing
+
+Next we can create a function called `init_db` that initializes the
+database. For this we can use the `connect_db` function we defined
+earlier. Just add that function below the `connect_db` function::
+
+ def init_db():
+ with closing(connect_db()) as db:
+ with app.open_resource('schema.sql') as f:
+ db.cursor().executescript(f.read())
+ db.commit()
+
+The :func:`~contextlib.closing` helper function allows us to keep a
+connection open for the duration of the `with` block. The
+:func:`~flask.Flask.open_resource` method of the application object
+supports that functionality out of the box, so it can be used in the
+`with` block directly. This function opens a file from the resource
+location (your `flaskr` folder) and allows you to read from it. We are
+using this here to execute a script on the database connection.
+
+When we connect to a database we get a connection object (here called
+`db`) that can give us a cursor. On that cursor there is a method to
+execute a complete script. Finally we only have to commit the changes.
+SQLite 3 and other transactional databases will not commit unless you
+explicitly tell it to.
+
+Now it is possible to create a database by starting up a Python shell and
+importing and calling that function::
+
+>>> from flaskr import init_db
+>>> init_db()
+
+.. admonition:: Troubleshooting
+
+ If you get an exception later that a table cannot be found check that
+ you did call the `init_db` function and that your table names are
+ correct (singular vs. plural for example).
+
+Continue with :ref:`tutorial-dbcon`
diff --git a/app/static/doc/flask-docs/_sources/tutorial/folders.txt b/app/static/doc/flask-docs/_sources/tutorial/folders.txt
new file mode 100644
index 0000000..6108093
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/folders.txt
@@ -0,0 +1,23 @@
+.. _tutorial-folders:
+
+Step 0: Creating The Folders
+============================
+
+Before we get started, let's create the folders needed for this
+application::
+
+ /flaskr
+ /static
+ /templates
+
+The `flaskr` folder is not a python package, but just something where we
+drop our files. Directly into this folder we will then put our database
+schema as well as main module in the following steps. The files inside
+the `static` folder are available to users of the application via `HTTP`.
+This is the place where css and javascript files go. Inside the
+`templates` folder Flask will look for `Jinja2`_ templates. The
+templates you create later in the tutorial will go in this directory.
+
+Continue with :ref:`tutorial-schema`.
+
+.. _Jinja2: http://jinja.pocoo.org/2/
diff --git a/app/static/doc/flask-docs/_sources/tutorial/index.txt b/app/static/doc/flask-docs/_sources/tutorial/index.txt
new file mode 100644
index 0000000..3f2d659
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/index.txt
@@ -0,0 +1,32 @@
+.. _tutorial:
+
+Tutorial
+========
+
+You want to develop an application with Python and Flask? Here you have
+the chance to learn that by example. In this tutorial we will create a
+simple microblog application. It only supports one user that can create
+text-only entries and there are no feeds or comments, but it still
+features everything you need to get started. We will use Flask and SQLite
+as database which comes out of the box with Python, so there is nothing
+else you need.
+
+If you want the full sourcecode in advance or for comparison, check out
+the `example source`_.
+
+.. _example source:
+ http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/
+
+.. toctree::
+ :maxdepth: 2
+
+ introduction
+ folders
+ schema
+ setup
+ dbinit
+ dbcon
+ views
+ templates
+ css
+ testing
diff --git a/app/static/doc/flask-docs/_sources/tutorial/introduction.txt b/app/static/doc/flask-docs/_sources/tutorial/introduction.txt
new file mode 100644
index 0000000..c72bbd7
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/introduction.txt
@@ -0,0 +1,33 @@
+.. _tutorial-introduction:
+
+Introducing Flaskr
+==================
+
+We will call our blogging application flaskr here, feel free to chose a
+less web-2.0-ish name ;) Basically we want it to do the following things:
+
+1. let the user sign in and out with credentials specified in the
+ configuration. Only one user is supported.
+2. when the user is logged in they can add new entries to the page
+ consisting of a text-only title and some HTML for the text. This HTML
+ is not sanitized because we trust the user here.
+3. the page shows all entries so far in reverse order (newest on top) and
+ the user can add new ones from there if logged in.
+
+We will be using SQLite3 directly for that application because it's good
+enough for an application of that size. For larger applications however
+it makes a lot of sense to use `SQLAlchemy`_ that handles database
+connections in a more intelligent way, allows you to target different
+relational databases at once and more. You might also want to consider
+one of the popular NoSQL databases if your data is more suited for those.
+
+Here a screenshot from the final application:
+
+.. image:: ../_static/flaskr.png
+ :align: center
+ :class: screenshot
+ :alt: screenshot of the final application
+
+Continue with :ref:`tutorial-folders`.
+
+.. _SQLAlchemy: http://www.sqlalchemy.org/
diff --git a/app/static/doc/flask-docs/_sources/tutorial/schema.txt b/app/static/doc/flask-docs/_sources/tutorial/schema.txt
new file mode 100644
index 0000000..c078667
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/schema.txt
@@ -0,0 +1,25 @@
+.. _tutorial-schema:
+
+Step 1: Database Schema
+=======================
+
+First we want to create the database schema. For this application only a
+single table is needed and we only want to support SQLite so that is quite
+easy. Just put the following contents into a file named `schema.sql` in
+the just created `flaskr` folder:
+
+.. sourcecode:: sql
+
+ drop table if exists entries;
+ create table entries (
+ id integer primary key autoincrement,
+ title string not null,
+ text string not null
+ );
+
+This schema consists of a single table called `entries` and each row in
+this table has an `id`, a `title` and a `text`. The `id` is an
+automatically incrementing integer and a primary key, the other two are
+strings that must not be null.
+
+Continue with :ref:`tutorial-setup`.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/setup.txt b/app/static/doc/flask-docs/_sources/tutorial/setup.txt
new file mode 100644
index 0000000..e9e4d67
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/setup.txt
@@ -0,0 +1,90 @@
+.. _tutorial-setup:
+
+Step 2: Application Setup Code
+==============================
+
+Now that we have the schema in place we can create the application module.
+Let's call it `flaskr.py` inside the `flaskr` folder. For starters we
+will add the imports we will need as well as the config section. For
+small applications it's a possibility to drop the configuration directly
+into the module which we will be doing here. However a cleaner solution
+would be to create a separate `.ini` or `.py` file and load that or import
+the values from there.
+
+::
+
+ # all the imports
+ import sqlite3
+ from flask import Flask, request, session, g, redirect, url_for, \
+ abort, render_template, flash
+
+ # configuration
+ DATABASE = '/tmp/flaskr.db'
+ DEBUG = True
+ SECRET_KEY = 'development key'
+ USERNAME = 'admin'
+ PASSWORD = 'default'
+
+Next we can create our actual application and initialize it with the
+config from the same file::
+
+ # create our little application :)
+ app = Flask(__name__)
+ app.config.from_object(__name__)
+
+:meth:`~flask.Config.from_object` will look at the given object (if it's a
+string it will import it) and then look for all uppercase variables
+defined there. In our case, the configuration we just wrote a few lines
+of code above. You can also move that into a separate file.
+
+It is also a good idea to be able to load a configuration from a
+configurable file. This is what :meth:`~flask.Config.from_envvar` can
+do::
+
+ app.config.from_envvar('FLASKR_SETTINGS', silent=True)
+
+That way someone can set an environment variable called
+:envvar:`FLASKR_SETTINGS` to specify a config file to be loaded which will
+then override the default values. The silent switch just tells Flask to
+not complain if no such environment key is set.
+
+The `secret_key` is needed to keep the client-side sessions secure.
+Choose that key wisely and as hard to guess and complex as possible. The
+debug flag enables or disables the interactive debugger. Never leave
+debug mode activated in a production system because it will allow users to
+execute code on the server!
+
+We also add a method to easily connect to the database specified. That
+can be used to open a connection on request and also from the interactive
+Python shell or a script. This will come in handy later.
+
+::
+
+ def connect_db():
+ return sqlite3.connect(app.config['DATABASE'])
+
+Finally we just add a line to the bottom of the file that fires up the
+server if we want to run that file as a standalone application::
+
+ if __name__ == '__main__':
+ app.run()
+
+With that out of the way you should be able to start up the application
+without problems. Do this with the following command::
+
+ python flaskr.py
+
+You will see a message telling you that server has started along with
+the address at which you can access it.
+
+When you head over to the server in your browser you will get an 404
+page not found error because we don't have any views yet. But we will
+focus on that a little later. First we should get the database working.
+
+.. admonition:: Externally Visible Server
+
+ Want your server to be publicly available? Check out the
+ :ref:`externally visible server <public-server>` section for more
+ information.
+
+Continue with :ref:`tutorial-dbinit`.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/templates.txt b/app/static/doc/flask-docs/_sources/tutorial/templates.txt
new file mode 100644
index 0000000..5ec5584
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/templates.txt
@@ -0,0 +1,111 @@
+.. _tutorial-templates:
+
+Step 6: The Templates
+=====================
+
+Now we should start working on the templates. If we request the URLs now
+we would only get an exception that Flask cannot find the templates. The
+templates are using `Jinja2`_ syntax and have autoescaping enabled by
+default. This means that unless you mark a value in the code with
+:class:`~flask.Markup` or with the ``|safe`` filter in the template,
+Jinja2 will ensure that special characters such as ``<`` or ``>`` are
+escaped with their XML equivalents.
+
+We are also using template inheritance which makes it possible to reuse
+the layout of the website in all pages.
+
+Put the following templates into the `templates` folder:
+
+.. _Jinja2: http://jinja.pocoo.org/2/documentation/templates
+
+layout.html
+-----------
+
+This template contains the HTML skeleton, the header and a link to log in
+(or log out if the user was already logged in). It also displays the
+flashed messages if there are any. The ``{% block body %}`` block can be
+replaced by a block of the same name (``body``) in a child template.
+
+The :class:`~flask.session` dict is available in the template as well and
+you can use that to check if the user is logged in or not. Note that in
+Jinja you can access missing attributes and items of objects / dicts which
+makes the following code work, even if there is no ``'logged_in'`` key in
+the session:
+
+.. sourcecode:: html+jinja
+
+ <!doctype html>
+ <title>Flaskr</title>
+ <link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
+ <div class=page>
+ <h1>Flaskr</h1>
+ <div class=metanav>
+ {% if not session.logged_in %}
+ <a href="{{ url_for('login') }}">log in</a>
+ {% else %}
+ <a href="{{ url_for('logout') }}">log out</a>
+ {% endif %}
+ </div>
+ {% for message in get_flashed_messages() %}
+ <div class=flash>{{ message }}</div>
+ {% endfor %}
+ {% block body %}{% endblock %}
+ </div>
+
+show_entries.html
+-----------------
+
+This template extends the `layout.html` template from above to display the
+messages. Note that the `for` loop iterates over the messages we passed
+in with the :func:`~flask.render_template` function. We also tell the
+form to submit to your `add_entry` function and use `POST` as `HTTP`
+method:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block body %}
+ {% if session.logged_in %}
+ <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
+ <dl>
+ <dt>Title:
+ <dd><input type=text size=30 name=title>
+ <dt>Text:
+ <dd><textarea name=text rows=5 cols=40></textarea>
+ <dd><input type=submit value=Share>
+ </dl>
+ </form>
+ {% endif %}
+ <ul class=entries>
+ {% for entry in entries %}
+ <li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
+ {% else %}
+ <li><em>Unbelievable. No entries here so far</em>
+ {% endfor %}
+ </ul>
+ {% endblock %}
+
+login.html
+----------
+
+Finally the login template which basically just displays a form to allow
+the user to login:
+
+.. sourcecode:: html+jinja
+
+ {% extends "layout.html" %}
+ {% block body %}
+ <h2>Login</h2>
+ {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
+ <form action="{{ url_for('login') }}" method=post>
+ <dl>
+ <dt>Username:
+ <dd><input type=text name=username>
+ <dt>Password:
+ <dd><input type=password name=password>
+ <dd><input type=submit value=Login>
+ </dl>
+ </form>
+ {% endblock %}
+
+Continue with :ref:`tutorial-css`.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/testing.txt b/app/static/doc/flask-docs/_sources/tutorial/testing.txt
new file mode 100644
index 0000000..34edd79
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/testing.txt
@@ -0,0 +1,10 @@
+.. _tutorial-testing:
+
+Bonus: Testing the Application
+==============================
+
+Now that you have finished the application and everything works as
+expected, it's probably not a bad idea to add automated tests to simplify
+modifications in the future. The application above is used as a basic
+example of how to perform unittesting in the :ref:`testing` section of the
+documentation. Go there to see how easy it is to test Flask applications.
diff --git a/app/static/doc/flask-docs/_sources/tutorial/views.txt b/app/static/doc/flask-docs/_sources/tutorial/views.txt
new file mode 100644
index 0000000..93bec3b
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/tutorial/views.txt
@@ -0,0 +1,98 @@
+.. _tutorial-views:
+
+Step 5: The View Functions
+==========================
+
+Now that the database connections are working we can start writing the
+view functions. We will need four of them:
+
+Show Entries
+------------
+
+This view shows all the entries stored in the database. It listens on the
+root of the application and will select title and text from the database.
+The one with the highest id (the newest entry) will be on top. The rows
+returned from the cursor are tuples with the columns ordered like specified
+in the select statement. This is good enough for small applications like
+here, but you might want to convert them into a dict. If you are
+interested in how to do that, check out the :ref:`easy-querying` example.
+
+The view function will pass the entries as dicts to the
+`show_entries.html` template and return the rendered one::
+
+ @app.route('/')
+ def show_entries():
+ cur = g.db.execute('select title, text from entries order by id desc')
+ entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
+ return render_template('show_entries.html', entries=entries)
+
+Add New Entry
+-------------
+
+This view lets the user add new entries if they are logged in. This only
+responds to `POST` requests, the actual form is shown on the
+`show_entries` page. If everything worked out well we will
+:func:`~flask.flash` an information message to the next request and
+redirect back to the `show_entries` page::
+
+ @app.route('/add', methods=['POST'])
+ def add_entry():
+ if not session.get('logged_in'):
+ abort(401)
+ g.db.execute('insert into entries (title, text) values (?, ?)',
+ [request.form['title'], request.form['text']])
+ g.db.commit()
+ flash('New entry was successfully posted')
+ return redirect(url_for('show_entries'))
+
+Note that we check that the user is logged in here (the `logged_in` key is
+present in the session and `True`).
+
+.. admonition:: Security Note
+
+ Be sure to use question marks when building SQL statements, as done in the
+ example above. Otherwise, your app will be vulnerable to SQL injection when
+ you use string formatting to build SQL statements.
+ See :ref:`sqlite3` for more.
+
+Login and Logout
+----------------
+
+These functions are used to sign the user in and out. Login checks the
+username and password against the ones from the configuration and sets the
+`logged_in` key in the session. If the user logged in successfully, that
+key is set to `True`, and the user is redirected back to the `show_entries`
+page. In addition, a message is flashed that informs the user that he or
+she was logged in successfully. If an error occurred, the template is
+notified about that, and the user is asked again::
+
+ @app.route('/login', methods=['GET', 'POST'])
+ def login():
+ error = None
+ if request.method == 'POST':
+ if request.form['username'] != app.config['USERNAME']:
+ error = 'Invalid username'
+ elif request.form['password'] != app.config['PASSWORD']:
+ error = 'Invalid password'
+ else:
+ session['logged_in'] = True
+ flash('You were logged in')
+ return redirect(url_for('show_entries'))
+ return render_template('login.html', error=error)
+
+The logout function, on the other hand, removes that key from the session
+again. We use a neat trick here: if you use the :meth:`~dict.pop` method
+of the dict and pass a second parameter to it (the default), the method
+will delete the key from the dictionary if present or do nothing when that
+key is not in there. This is helpful because now we don't have to check
+if the user was logged in.
+
+::
+
+ @app.route('/logout')
+ def logout():
+ session.pop('logged_in', None)
+ flash('You were logged out')
+ return redirect(url_for('show_entries'))
+
+Continue with :ref:`tutorial-templates`.
diff --git a/app/static/doc/flask-docs/_sources/unicode.txt b/app/static/doc/flask-docs/_sources/unicode.txt
new file mode 100644
index 0000000..413ea84
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/unicode.txt
@@ -0,0 +1,107 @@
+Unicode in Flask
+================
+
+Flask like Jinja2 and Werkzeug is totally Unicode based when it comes to
+text. Not only these libraries, also the majority of web related Python
+libraries that deal with text. If you don't know Unicode so far, you
+should probably read `The Absolute Minimum Every Software Developer
+Absolutely, Positively Must Know About Unicode and Character Sets
+<http://www.joelonsoftware.com/articles/Unicode.html>`_. This part of the
+documentation just tries to cover the very basics so that you have a
+pleasant experience with Unicode related things.
+
+Automatic Conversion
+--------------------
+
+Flask has a few assumptions about your application (which you can change
+of course) that give you basic and painless Unicode support:
+
+- the encoding for text on your website is UTF-8
+- internally you will always use Unicode exclusively for text except
+ for literal strings with only ASCII character points.
+- encoding and decoding happens whenever you are talking over a protocol
+ that requires bytes to be transmitted.
+
+So what does this mean to you?
+
+HTTP is based on bytes. Not only the protocol, also the system used to
+address documents on servers (so called URIs or URLs). However HTML which
+is usually transmitted on top of HTTP supports a large variety of
+character sets and which ones are used, are transmitted in an HTTP header.
+To not make this too complex Flask just assumes that if you are sending
+Unicode out you want it to be UTF-8 encoded. Flask will do the encoding
+and setting of the appropriate headers for you.
+
+The same is true if you are talking to databases with the help of
+SQLAlchemy or a similar ORM system. Some databases have a protocol that
+already transmits Unicode and if they do not, SQLAlchemy or your other ORM
+should take care of that.
+
+The Golden Rule
+---------------
+
+So the rule of thumb: if you are not dealing with binary data, work with
+Unicode. What does working with Unicode in Python 2.x mean?
+
+- as long as you are using ASCII charpoints only (basically numbers,
+ some special characters of latin letters without umlauts or anything
+ fancy) you can use regular string literals (``'Hello World'``).
+- if you need anything else than ASCII in a string you have to mark
+ this string as Unicode string by prefixing it with a lowercase `u`.
+ (like ``u'Hänsel und Gretel'``)
+- if you are using non-Unicode characters in your Python files you have
+ to tell Python which encoding your file uses. Again, I recommend
+ UTF-8 for this purpose. To tell the interpreter your encoding you can
+ put the ``# -*- coding: utf-8 -*-`` into the first or second line of
+ your Python source file.
+- Jinja is configured to decode the template files from UTF-8. So make
+ sure to tell your editor to save the file as UTF-8 there as well.
+
+Encoding and Decoding Yourself
+------------------------------
+
+If you are talking with a filesystem or something that is not really based
+on Unicode you will have to ensure that you decode properly when working
+with Unicode interface. So for example if you want to load a file on the
+filesystem and embed it into a Jinja2 template you will have to decode it
+from the encoding of that file. Here the old problem that text files do
+not specify their encoding comes into play. So do yourself a favour and
+limit yourself to UTF-8 for text files as well.
+
+Anyways. To load such a file with Unicode you can use the built-in
+:meth:`str.decode` method::
+
+ def read_file(filename, charset='utf-8'):
+ with open(filename, 'r') as f:
+ return f.read().decode(charset)
+
+To go from Unicode into a specific charset such as UTF-8 you can use the
+:meth:`unicode.encode` method::
+
+ def write_file(filename, contents, charset='utf-8'):
+ with open(filename, 'w') as f:
+ f.write(contents.encode(charset))
+
+Configuring Editors
+-------------------
+
+Most editors save as UTF-8 by default nowadays but in case your editor is
+not configured to do this you have to change it. Here some common ways to
+set your editor to store as UTF-8:
+
+- Vim: put ``set enc=utf-8`` to your ``.vimrc`` file.
+
+- Emacs: either use an encoding cookie or put this into your ``.emacs``
+ file::
+
+ (prefer-coding-system 'utf-8)
+ (setq default-buffer-file-coding-system 'utf-8)
+
+- Notepad++:
+
+ 1. Go to *Settings -> Preferences ...*
+ 2. Select the "New Document/Default Directory" tab
+ 3. Select "UTF-8 without BOM" as encoding
+
+ It is also recommended to use the Unix newline format, you can select
+ it in the same panel but this is not a requirement.
diff --git a/app/static/doc/flask-docs/_sources/upgrading.txt b/app/static/doc/flask-docs/_sources/upgrading.txt
new file mode 100644
index 0000000..0ba46c1
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/upgrading.txt
@@ -0,0 +1,324 @@
+Upgrading to Newer Releases
+===========================
+
+Flask itself is changing like any software is changing over time. Most of
+the changes are the nice kind, the kind where you don't have to change
+anything in your code to profit from a new release.
+
+However every once in a while there are changes that do require some
+changes in your code or there are changes that make it possible for you to
+improve your own code quality by taking advantage of new features in
+Flask.
+
+This section of the documentation enumerates all the changes in Flask from
+release to release and how you can change your code to have a painless
+updating experience.
+
+If you want to use the `easy_install` command to upgrade your Flask
+installation, make sure to pass it the ``-U`` parameter::
+
+ $ easy_install -U Flask
+
+Version 0.8
+-----------
+
+Flask introduced a new session interface system. We also noticed that
+there was a naming collision between `flask.session` the module that
+implements sessions and :data:`flask.session` which is the global session
+object. With that introduction we moved the implementation details for
+the session system into a new module called :mod:`flask.sessions`. If you
+used the previously undocumented session support we urge you to upgrade.
+
+If invalid JSON data was submitted Flask will now raise a
+:exc:`~werkzeug.exceptions.BadRequest` exception instead of letting the
+default :exc:`ValueError` bubble up. This has the advantage that you no
+longer have to handle that error to avoid an internal server error showing
+up for the user. If you were catching this down explicitly in the past
+as `ValueError` you will need to change this.
+
+Due to a bug in the test client Flask 0.7 did not trigger teardown
+handlers when the test client was used in a with statement. This was
+since fixed but might require some changes in your testsuites if you
+relied on this behavior.
+
+Version 0.7
+-----------
+
+In Flask 0.7 we cleaned up the code base internally a lot and did some
+backwards incompatible changes that make it easier to implement larger
+applications with Flask. Because we want to make upgrading as easy as
+possible we tried to counter the problems arising from these changes by
+providing a script that can ease the transition.
+
+The script scans your whole application and generates an unified diff with
+changes it assumes are safe to apply. However as this is an automated
+tool it won't be able to find all use cases and it might miss some. We
+internally spread a lot of deprecation warnings all over the place to make
+it easy to find pieces of code that it was unable to upgrade.
+
+We strongly recommend that you hand review the generated patchfile and
+only apply the chunks that look good.
+
+If you are using git as version control system for your project we
+recommend applying the patch with ``path -p1 < patchfile.diff`` and then
+using the interactive commit feature to only apply the chunks that look
+good.
+
+To apply the upgrade script do the following:
+
+1. Download the script: `flask-07-upgrade.py
+ <https://raw.github.com/mitsuhiko/flask/master/scripts/flask-07-upgrade.py>`_
+2. Run it in the directory of your application::
+
+ python flask-07-upgrade.py > patchfile.diff
+
+3. Review the generated patchfile.
+4. Apply the patch::
+
+ patch -p1 < patchfile.diff
+
+5. If you were using per-module template folders you need to move some
+ templates around. Previously if you had a folder named ``templates``
+ next to a blueprint named ``admin`` the implicit template path
+ automatically was ``admin/index.html`` for a template file called
+ ``templates/index.html``. This no longer is the case. Now you need
+ to name the template ``templates/admin/index.html``. The tool will
+ not detect this so you will have to do that on your own.
+
+Please note that deprecation warnings are disabled by default starting
+with Python 2.7. In order to see the deprecation warnings that might be
+emitted you have to enabled them with the :mod:`warnings` module.
+
+If you are working with windows and you lack the `patch` command line
+utility you can get it as part of various Unix runtime environments for
+windows including cygwin, msysgit or ming32. Also source control systems
+like svn, hg or git have builtin support for applying unified diffs as
+generated by the tool. Check the manual of your version control system
+for more information.
+
+Bug in Request Locals
+`````````````````````
+
+Due to a bug in earlier implementations the request local proxies now
+raise a :exc:`RuntimeError` instead of an :exc:`AttributeError` when they
+are unbound. If you caught these exceptions with :exc:`AttributeError`
+before, you should catch them with :exc:`RuntimeError` now.
+
+Additionally the :func:`~flask.send_file` function is now issuing
+deprecation warnings if you depend on functionality that will be removed
+in Flask 1.0. Previously it was possible to use etags and mimetypes
+when file objects were passed. This was unreliable and caused issues
+for a few setups. If you get a deprecation warning, make sure to
+update your application to work with either filenames there or disable
+etag attaching and attach them yourself.
+
+Old code::
+
+ return send_file(my_file_object)
+ return send_file(my_file_object)
+
+New code::
+
+ return send_file(my_file_object, add_etags=False)
+
+.. _upgrading-to-new-teardown-handling:
+
+Upgrading to new Teardown Handling
+``````````````````````````````````
+
+We streamlined the behavior of the callbacks for request handling. For
+things that modify the response the :meth:`~flask.Flask.after_request`
+decorators continue to work as expected, but for things that absolutely
+must happen at the end of request we introduced the new
+:meth:`~flask.Flask.teardown_request` decorator. Unfortunately that
+change also made after-request work differently under error conditions.
+It's not consistently skipped if exceptions happen whereas previously it
+might have been called twice to ensure it is executed at the end of the
+request.
+
+If you have database connection code that looks like this::
+
+ @app.after_request
+ def after_request(response):
+ g.db.close()
+ return response
+
+You are now encouraged to use this instead::
+
+ @app.teardown_request
+ def after_request(exception):
+ if hasattr(g, 'db'):
+ g.db.close()
+
+On the upside this change greatly improves the internal code flow and
+makes it easier to customize the dispatching and error handling. This
+makes it now a lot easier to write unit tests as you can prevent closing
+down of database connections for a while. You can take advantage of the
+fact that the teardown callbacks are called when the response context is
+removed from the stack so a test can query the database after request
+handling::
+
+ with app.test_client() as client:
+ resp = client.get('/')
+ # g.db is still bound if there is such a thing
+
+ # and here it's gone
+
+Manual Error Handler Attaching
+``````````````````````````````
+
+While it is still possible to attach error handlers to
+:attr:`Flask.error_handlers` it's discouraged to do so and in fact
+deprecated. In generaly we no longer recommend custom error handler
+attaching via assignments to the underlying dictionary due to the more
+complex internal handling to support arbitrary exception classes and
+blueprints. See :meth:`Flask.errorhandler` for more information.
+
+The proper upgrade is to change this::
+
+ app.error_handlers[403] = handle_error
+
+Into this::
+
+ app.register_error_handler(403, handle_error)
+
+Alternatively you should just attach the function with a decorator::
+
+ @app.errorhandler(403)
+ def handle_error(e):
+ ...
+
+(Note that :meth:`register_error_handler` is new in Flask 0.7)
+
+Blueprint Support
+`````````````````
+
+Blueprints replace the previous concept of “Modules” in Flask. They
+provide better semantics for various features and work better with large
+applications. The update script provided should be able to upgrade your
+applications automatically, but there might be some cases where it fails
+to upgrade. What changed?
+
+- Blueprints need explicit names. Modules had an automatic name
+ guesssing scheme where the shortname for the module was taken from the
+ last part of the import module. The upgrade script tries to guess
+ that name but it might fail as this information could change at
+ runtime.
+- Blueprints have an inverse behavior for :meth:`url_for`. Previously
+ ``.foo`` told :meth:`url_for` that it should look for the endpoint
+ `foo` on the application. Now it means “relative to current module”.
+ The script will inverse all calls to :meth:`url_for` automatically for
+ you. It will do this in a very eager way so you might end up with
+ some unnecessary leading dots in your code if you're not using
+ modules.
+- Blueprints do not automatically provide static folders. They will
+ also no longer automatically export templates from a folder called
+ `templates` next to their location however but it can be enabled from
+ the constructor. Same with static files: if you want to continue
+ serving static files you need to tell the constructor explicitly the
+ path to the static folder (which can be relative to the blueprint's
+ module path).
+- Rendering templates was simplified. Now the blueprints can provide
+ template folders which are added to a general template searchpath.
+ This means that you need to add another subfolder with the blueprint's
+ name into that folder if you want ``blueprintname/template.html`` as
+ the template name.
+
+If you continue to use the `Module` object which is deprecated, Flask will
+restore the previous behavior as good as possible. However we strongly
+recommend upgrading to the new blueprints as they provide a lot of useful
+improvement such as the ability to attach a blueprint multiple times,
+blueprint specific error handlers and a lot more.
+
+
+Version 0.6
+-----------
+
+Flask 0.6 comes with a backwards incompatible change which affects the
+order of after-request handlers. Previously they were called in the order
+of the registration, now they are called in reverse order. This change
+was made so that Flask behaves more like people expected it to work and
+how other systems handle request pre- and postprocessing. If you
+depend on the order of execution of post-request functions, be sure to
+change the order.
+
+Another change that breaks backwards compatibility is that context
+processors will no longer override values passed directly to the template
+rendering function. If for example `request` is as variable passed
+directly to the template, the default context processor will not override
+it with the current request object. This makes it easier to extend
+context processors later to inject additional variables without breaking
+existing template not expecting them.
+
+Version 0.5
+-----------
+
+Flask 0.5 is the first release that comes as a Python package instead of a
+single module. There were a couple of internal refactoring so if you
+depend on undocumented internal details you probably have to adapt the
+imports.
+
+The following changes may be relevant to your application:
+
+- autoescaping no longer happens for all templates. Instead it is
+ configured to only happen on files ending with ``.html``, ``.htm``,
+ ``.xml`` and ``.xhtml``. If you have templates with different
+ extensions you should override the
+ :meth:`~flask.Flask.select_jinja_autoescape` method.
+- Flask no longer supports zipped applications in this release. This
+ functionality might come back in future releases if there is demand
+ for this feature. Removing support for this makes the Flask internal
+ code easier to understand and fixes a couple of small issues that make
+ debugging harder than necessary.
+- The `create_jinja_loader` function is gone. If you want to customize
+ the Jinja loader now, use the
+ :meth:`~flask.Flask.create_jinja_environment` method instead.
+
+Version 0.4
+-----------
+
+For application developers there are no changes that require changes in
+your code. In case you are developing on a Flask extension however, and
+that extension has a unittest-mode you might want to link the activation
+of that mode to the new ``TESTING`` flag.
+
+Version 0.3
+-----------
+
+Flask 0.3 introduces configuration support and logging as well as
+categories for flashing messages. All these are features that are 100%
+backwards compatible but you might want to take advantage of them.
+
+Configuration Support
+`````````````````````
+
+The configuration support makes it easier to write any kind of application
+that requires some sort of configuration. (Which most likely is the case
+for any application out there).
+
+If you previously had code like this::
+
+ app.debug = DEBUG
+ app.secret_key = SECRET_KEY
+
+You no longer have to do that, instead you can just load a configuration
+into the config object. How this works is outlined in :ref:`config`.
+
+Logging Integration
+```````````````````
+
+Flask now configures a logger for you with some basic and useful defaults.
+If you run your application in production and want to profit from
+automatic error logging, you might be interested in attaching a proper log
+handler. Also you can start logging warnings and errors into the logger
+when appropriately. For more information on that, read
+:ref:`application-errors`.
+
+Categories for Flash Messages
+`````````````````````````````
+
+Flash messages can now have categories attached. This makes it possible
+to render errors, warnings or regular messages differently for example.
+This is an opt-in feature because it requires some rethinking in the code.
+
+Read all about that in the :ref:`message-flashing-pattern` pattern.
diff --git a/app/static/doc/flask-docs/_sources/views.txt b/app/static/doc/flask-docs/_sources/views.txt
new file mode 100644
index 0000000..441620a
--- /dev/null
+++ b/app/static/doc/flask-docs/_sources/views.txt
@@ -0,0 +1,227 @@
+.. _views:
+
+Pluggable Views
+===============
+
+.. versionadded:: 0.7
+
+Flask 0.7 introduces pluggable views inspired by the generic views from
+Django which are based on classes instead of functions. The main
+intention is that you can replace parts of the implementations and this
+way have customizable pluggable views.
+
+Basic Principle
+---------------
+
+Consider you have a function that loads a list of objects from the
+database and renders into a template::
+
+ @app.route('/users/')
+ def show_users(page):
+ users = User.query.all()
+ return render_template('users.html', users=users)
+
+This is simple and flexible, but if you want to provide this view in a
+generic fashion that can be adapted to other models and templates as well
+you might want more flexibility. This is where pluggable class based
+views come into place. As the first step to convert this into a class
+based view you would do this::
+
+
+ from flask.views import View
+
+ class ShowUsers(View):
+
+ def dispatch_request(self):
+ users = User.query.all()
+ return render_template('users.html', objects=users)
+
+ app.add_url_rule('/users/', ShowUsers.as_view('show_users'))
+
+As you can see what you have to do is to create a subclass of
+:class:`flask.views.View` and implement
+:meth:`~flask.views.View.dispatch_request`. Then we have to convert that
+class into an actual view function by using the
+:meth:`~flask.views.View.as_view` class method. The string you pass to
+that function is the name of the endpoint that view will then have. But
+this by itself is not helpful, so let's refactor the code a bit::
+
+
+ from flask.views import View
+
+ class ListView(View):
+
+ def get_template_name(self):
+ raise NotImplementedError()
+
+ def render_template(self, context):
+ return render_template(self.get_template_name(), **context)
+
+ def dispatch_request(self):
+ context = {'objects': self.get_objects()}
+ return self.render_template(context)
+
+ class UserView(ListView):
+
+ def get_template_name(self):
+ return 'users.html'
+
+ def get_objects(self):
+ return User.query.all()
+
+This of course is not that helpful for such a small example, but it's good
+enough to explain the basic principle. When you have a class based view
+the question comes up what `self` points to. The way this works is that
+whenever the request is dispatched a new instance of the class is created
+and the :meth:`~flask.views.View.dispatch_request` method is called with
+the parameters from the URL rule. The class itself is instanciated with
+the parameters passed to the :meth:`~flask.views.View.as_view` function.
+For instance you can write a class like this::
+
+ class RenderTemplateView(View):
+ def __init__(self, template_name):
+ self.template_name = template_name
+ def dispatch_request(self):
+ return render_template(self.template_name)
+
+And then you can register it like this::
+
+ app.add_url_rule('/about', view_func=RenderTemplateView.as_view(
+ 'about_page', template_name='about.html'))
+
+Method Hints
+------------
+
+Pluggable views are attached to the application like a regular function by
+either using :func:`~flask.Flask.route` or better
+:meth:`~flask.Flask.add_url_rule`. That however also means that you would
+have to provide the names of the HTTP methods the view supports when you
+attach this. In order to move that information to the class you can
+provide a :attr:`~flask.views.View.methods` attribute that has this
+information::
+
+ class MyView(View):
+ methods = ['GET', 'POST']
+
+ def dispatch_request(self):
+ if request.method == 'POST':
+ ...
+ ...
+
+ app.add_url_rule('/myview', view_func=MyView.as_view('myview'))
+
+Method Based Dispatching
+------------------------
+
+For RESTful APIs it's especially helpful to execute a different function
+for each HTTP method. With the :class:`flask.views.MethodView` you can
+easily do that. Each HTTP method maps to a function with the same name
+(just in lowercase)::
+
+ from flask.views import MethodView
+
+ class UserAPI(MethodView):
+
+ def get(self):
+ users = User.query.all()
+ ...
+
+ def post(self):
+ user = User.from_form_data(request.form)
+ ...
+
+ app.add_url_rule('/users/', view_func=UserAPI.as_view('users'))
+
+That way you also don't have to provide the
+:attr:`~flask.views.View.methods` attribute. It's automatically set based
+on the methods defined in the class.
+
+Decorating Views
+----------------
+
+Since the view class itself is not the view function that is added to the
+routing system it does not make much sense to decorate the class itself.
+Instead you either have to decorate the return value of
+:meth:`~flask.views.View.as_view` by hand::
+
+ view = rate_limited(UserAPI.as_view('users'))
+ app.add_url_rule('/users/', view_func=view)
+
+Starting with Flask 0.8 there is also an alternative way where you can
+specify a list of decorators to apply in the class declaration::
+
+ class UserAPI(MethodView):
+ decorators = [rate_limited]
+
+Due to the implicit self from the caller's perspective you cannot use
+regular view decorators on the individual methods of the view however,
+keep this in mind.
+
+Method Views for APIs
+---------------------
+
+Web APIs are often working very closely with HTTP verbs so it makes a lot
+of sense to implement such an API based on the
+:class:`~flask.views.MethodView`. That said, you will notice that the API
+will require different URL rules that go to the same method view most of
+the time. For instance consider that you are exposing a user object on
+the web:
+
+=============== =============== ======================================
+URL Method Description
+--------------- --------------- --------------------------------------
+``/users/`` ``GET`` Gives a list of all users
+``/users/`` ``POST`` Creates a new user
+``/users/<id>`` ``GET`` Shows a single user
+``/users/<id>`` ``PUT`` Updates a single user
+``/users/<id>`` ``DELETE`` Deletes a single user
+=============== =============== ======================================
+
+So how would you go about doing that with the
+:class:`~flask.views.MethodView`? The trick is to take advantage of the
+fact that you can provide multiple rules to the same view.
+
+Let's assume for the moment the view would look like this::
+
+ class UserAPI(MethodView):
+
+ def get(self, user_id):
+ if user_id is None:
+ # return a list of users
+ pass
+ else:
+ # expose a single user
+ pass
+
+ def post(self):
+ # create a new user
+ pass
+
+ def delete(self, user_id):
+ # delete a single user
+ pass
+
+ def put(self, user_id):
+ # update a single user
+ pass
+
+So how do we hook this up with the routing system? By adding two rules
+and explicitly mentioning the methods for each::
+
+ user_view = UserAPI.as_view('user_api')
+ app.add_url_rule('/users/', defaults={'user_id': None},
+ view_func=user_view, methods=['GET', 'POST'])
+ app.add_url_rule('/users/<int:user_id>', view_func=user_view,
+ methods=['GET', 'PUT', 'DELETE'])
+
+If you have a lot of APIs that look similar you can refactor that
+registration code::
+
+ def register_api(view, endpoint, url, pk='id', pk_type='int'):
+ view_func = view.as_view(endpoint)
+ app.add_url_rule(url, defaults={pk: None},
+ view_func=view_func, methods=['GET', 'POST'])
+ app.add_url_rule('%s<%s:%s>' % (url, pk), view_func=view_func,
+ methods=['GET', 'PUT', 'DELETE'])
+
+ register_api(UserAPI, 'user_api', '/users/', pk='user_id')