| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
- <title>flask.app — proxypool documentation</title>
-
- <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
- <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
-
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true
- };
- </script>
- <script type="text/javascript" src="../../_static/jquery.js"></script>
- <script type="text/javascript" src="../../_static/underscore.js"></script>
- <script type="text/javascript" src="../../_static/doctools.js"></script>
- <link rel="index" title="Index" href="../../genindex.html" />
- <link rel="search" title="Search" href="../../search.html" />
- <link rel="top" title="proxypool documentation" href="../../index.html" />
- <link rel="up" title="Module code" href="../index.html" />
-
- <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
-
-
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body role="document">
-
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body" role="main">
-
- <h1>Source code for flask.app</h1><div class="highlight"><pre>
- <span></span><span class="c1"># -*- coding: utf-8 -*-</span>
- <span class="sd">"""</span>
- <span class="sd"> flask.app</span>
- <span class="sd"> ~~~~~~~~~</span>
- <span class="sd"> This module implements the central WSGI application object.</span>
- <span class="sd"> :copyright: (c) 2015 by Armin Ronacher.</span>
- <span class="sd"> :license: BSD, see LICENSE for more details.</span>
- <span class="sd">"""</span>
- <span class="kn">import</span> <span class="nn">os</span>
- <span class="kn">import</span> <span class="nn">sys</span>
- <span class="kn">from</span> <span class="nn">threading</span> <span class="k">import</span> <span class="n">Lock</span>
- <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span>
- <span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">chain</span>
- <span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">update_wrapper</span>
- <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">deque</span>
- <span class="kn">from</span> <span class="nn">werkzeug.datastructures</span> <span class="k">import</span> <span class="n">ImmutableDict</span>
- <span class="kn">from</span> <span class="nn">werkzeug.routing</span> <span class="k">import</span> <span class="n">Map</span><span class="p">,</span> <span class="n">Rule</span><span class="p">,</span> <span class="n">RequestRedirect</span><span class="p">,</span> <span class="n">BuildError</span>
- <span class="kn">from</span> <span class="nn">werkzeug.exceptions</span> <span class="k">import</span> <span class="n">HTTPException</span><span class="p">,</span> <span class="n">InternalServerError</span><span class="p">,</span> \
- <span class="n">MethodNotAllowed</span><span class="p">,</span> <span class="n">BadRequest</span><span class="p">,</span> <span class="n">default_exceptions</span>
- <span class="kn">from</span> <span class="nn">.helpers</span> <span class="k">import</span> <span class="n">_PackageBoundObject</span><span class="p">,</span> <span class="n">url_for</span><span class="p">,</span> <span class="n">get_flashed_messages</span><span class="p">,</span> \
- <span class="n">locked_cached_property</span><span class="p">,</span> <span class="n">_endpoint_from_view_func</span><span class="p">,</span> <span class="n">find_package</span><span class="p">,</span> \
- <span class="n">get_debug_flag</span>
- <span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">json</span><span class="p">,</span> <span class="n">cli</span>
- <span class="kn">from</span> <span class="nn">.wrappers</span> <span class="k">import</span> <span class="n">Request</span><span class="p">,</span> <span class="n">Response</span>
- <span class="kn">from</span> <span class="nn">.config</span> <span class="k">import</span> <span class="n">ConfigAttribute</span><span class="p">,</span> <span class="n">Config</span>
- <span class="kn">from</span> <span class="nn">.ctx</span> <span class="k">import</span> <span class="n">RequestContext</span><span class="p">,</span> <span class="n">AppContext</span><span class="p">,</span> <span class="n">_AppCtxGlobals</span>
- <span class="kn">from</span> <span class="nn">.globals</span> <span class="k">import</span> <span class="n">_request_ctx_stack</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">g</span>
- <span class="kn">from</span> <span class="nn">.sessions</span> <span class="k">import</span> <span class="n">SecureCookieSessionInterface</span>
- <span class="kn">from</span> <span class="nn">.templating</span> <span class="k">import</span> <span class="n">DispatchingJinjaLoader</span><span class="p">,</span> <span class="n">Environment</span><span class="p">,</span> \
- <span class="n">_default_template_ctx_processor</span>
- <span class="kn">from</span> <span class="nn">.signals</span> <span class="k">import</span> <span class="n">request_started</span><span class="p">,</span> <span class="n">request_finished</span><span class="p">,</span> <span class="n">got_request_exception</span><span class="p">,</span> \
- <span class="n">request_tearing_down</span><span class="p">,</span> <span class="n">appcontext_tearing_down</span>
- <span class="kn">from</span> <span class="nn">._compat</span> <span class="k">import</span> <span class="n">reraise</span><span class="p">,</span> <span class="n">string_types</span><span class="p">,</span> <span class="n">text_type</span><span class="p">,</span> <span class="n">integer_types</span>
- <span class="c1"># a lock used for logger initialization</span>
- <span class="n">_logger_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
- <span class="c1"># a singleton sentinel value for parameter defaults</span>
- <span class="n">_sentinel</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
- <span class="k">def</span> <span class="nf">_make_timedelta</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">timedelta</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">value</span>
- <div class="viewcode-block" id="setupmethod"><a class="viewcode-back" href="../../flask/flask.html#flask.app.setupmethod">[docs]</a><span class="k">def</span> <span class="nf">setupmethod</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Wraps a method so that it performs a check in debug mode if the</span>
- <span class="sd"> first request was already handled.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">wrapper_func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="s1">'A setup function was called after the '</span>
- <span class="s1">'first request was handled. This usually indicates a bug '</span>
- <span class="s1">'in the application where a module was not imported '</span>
- <span class="s1">'and decorators or other functionality was called too late.</span><span class="se">\n</span><span class="s1">'</span>
- <span class="s1">'To fix this make sure to import all your view modules, '</span>
- <span class="s1">'database models and everything related at a central place '</span>
- <span class="s1">'before the application starts serving requests.'</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">update_wrapper</span><span class="p">(</span><span class="n">wrapper_func</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask">[docs]</a><span class="k">class</span> <span class="nc">Flask</span><span class="p">(</span><span class="n">_PackageBoundObject</span><span class="p">):</span>
- <span class="sd">"""The flask object implements a WSGI application and acts as the central</span>
- <span class="sd"> object. It is passed the name of the module or package of the</span>
- <span class="sd"> application. Once it is created it will act as a central registry for</span>
- <span class="sd"> the view functions, the URL rules, template configuration and much more.</span>
- <span class="sd"> The name of the package is used to resolve resources from inside the</span>
- <span class="sd"> package or the folder the module is contained in depending on if the</span>
- <span class="sd"> package parameter resolves to an actual python package (a folder with</span>
- <span class="sd"> an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file).</span>
- <span class="sd"> For more information about resource loading, see :func:`open_resource`.</span>
- <span class="sd"> Usually you create a :class:`Flask` instance in your main module or</span>
- <span class="sd"> in the :file:`__init__.py` file of your package like this::</span>
- <span class="sd"> from flask import Flask</span>
- <span class="sd"> app = Flask(__name__)</span>
- <span class="sd"> .. admonition:: About the First Parameter</span>
- <span class="sd"> The idea of the first parameter is to give Flask an idea of what</span>
- <span class="sd"> belongs to your application. This name is used to find resources</span>
- <span class="sd"> on the filesystem, can be used by extensions to improve debugging</span>
- <span class="sd"> information and a lot more.</span>
- <span class="sd"> So it's important what you provide there. If you are using a single</span>
- <span class="sd"> module, `__name__` is always the correct value. If you however are</span>
- <span class="sd"> using a package, it's usually recommended to hardcode the name of</span>
- <span class="sd"> your package there.</span>
- <span class="sd"> For example if your application is defined in :file:`yourapplication/app.py`</span>
- <span class="sd"> you should create it with one of the two versions below::</span>
- <span class="sd"> app = Flask('yourapplication')</span>
- <span class="sd"> app = Flask(__name__.split('.')[0])</span>
- <span class="sd"> Why is that? The application will work even with `__name__`, thanks</span>
- <span class="sd"> to how resources are looked up. However it will make debugging more</span>
- <span class="sd"> painful. Certain extensions can make assumptions based on the</span>
- <span class="sd"> import name of your application. For example the Flask-SQLAlchemy</span>
- <span class="sd"> extension will look for the code in your application that triggered</span>
- <span class="sd"> an SQL query in debug mode. If the import name is not properly set</span>
- <span class="sd"> up, that debugging information is lost. (For example it would only</span>
- <span class="sd"> pick up SQL queries in `yourapplication.app` and not</span>
- <span class="sd"> `yourapplication.views.frontend`)</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> The `static_url_path`, `static_folder`, and `template_folder`</span>
- <span class="sd"> parameters were added.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> The `instance_path` and `instance_relative_config` parameters were</span>
- <span class="sd"> added.</span>
- <span class="sd"> .. versionadded:: 0.11</span>
- <span class="sd"> The `root_path` parameter was added.</span>
- <span class="sd"> :param import_name: the name of the application package</span>
- <span class="sd"> :param static_url_path: can be used to specify a different path for the</span>
- <span class="sd"> static files on the web. Defaults to the name</span>
- <span class="sd"> of the `static_folder` folder.</span>
- <span class="sd"> :param static_folder: the folder with static files that should be served</span>
- <span class="sd"> at `static_url_path`. Defaults to the ``'static'``</span>
- <span class="sd"> folder in the root path of the application.</span>
- <span class="sd"> :param template_folder: the folder that contains the templates that should</span>
- <span class="sd"> be used by the application. Defaults to</span>
- <span class="sd"> ``'templates'`` folder in the root path of the</span>
- <span class="sd"> application.</span>
- <span class="sd"> :param instance_path: An alternative instance path for the application.</span>
- <span class="sd"> By default the folder ``'instance'`` next to the</span>
- <span class="sd"> package or module is assumed to be the instance</span>
- <span class="sd"> path.</span>
- <span class="sd"> :param instance_relative_config: if set to ``True`` relative filenames</span>
- <span class="sd"> for loading the config are assumed to</span>
- <span class="sd"> be relative to the instance path instead</span>
- <span class="sd"> of the application root.</span>
- <span class="sd"> :param root_path: Flask by default will automatically calculate the path</span>
- <span class="sd"> to the root of the application. In certain situations</span>
- <span class="sd"> this cannot be achieved (for instance if the package</span>
- <span class="sd"> is a Python 3 namespace package) and needs to be</span>
- <span class="sd"> manually defined.</span>
- <span class="sd"> """</span>
- <span class="c1">#: The class that is used for request objects. See :class:`~flask.Request`</span>
- <span class="c1">#: for more information.</span>
- <span class="n">request_class</span> <span class="o">=</span> <span class="n">Request</span>
- <span class="c1">#: The class that is used for response objects. See</span>
- <span class="c1">#: :class:`~flask.Response` for more information.</span>
- <span class="n">response_class</span> <span class="o">=</span> <span class="n">Response</span>
- <span class="c1">#: The class that is used for the Jinja environment.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.11</span>
- <span class="n">jinja_environment</span> <span class="o">=</span> <span class="n">Environment</span>
- <span class="c1">#: The class that is used for the :data:`~flask.g` instance.</span>
- <span class="c1">#:</span>
- <span class="c1">#: Example use cases for a custom class:</span>
- <span class="c1">#:</span>
- <span class="c1">#: 1. Store arbitrary attributes on flask.g.</span>
- <span class="c1">#: 2. Add a property for lazy per-request database connectors.</span>
- <span class="c1">#: 3. Return None instead of AttributeError on unexpected attributes.</span>
- <span class="c1">#: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g.</span>
- <span class="c1">#:</span>
- <span class="c1">#: In Flask 0.9 this property was called `request_globals_class` but it</span>
- <span class="c1">#: was changed in 0.10 to :attr:`app_ctx_globals_class` because the</span>
- <span class="c1">#: flask.g object is now application context scoped.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.10</span>
- <span class="n">app_ctx_globals_class</span> <span class="o">=</span> <span class="n">_AppCtxGlobals</span>
- <span class="c1"># Backwards compatibility support</span>
- <span class="k">def</span> <span class="nf">_get_request_globals_class</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">app_ctx_globals_class</span>
- <span class="k">def</span> <span class="nf">_set_request_globals_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
- <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
- <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">'request_globals_class attribute is now '</span>
- <span class="s1">'called app_ctx_globals_class'</span><span class="p">))</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">app_ctx_globals_class</span> <span class="o">=</span> <span class="n">value</span>
- <span class="n">request_globals_class</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_request_globals_class</span><span class="p">,</span>
- <span class="n">_set_request_globals_class</span><span class="p">)</span>
- <span class="k">del</span> <span class="n">_get_request_globals_class</span><span class="p">,</span> <span class="n">_set_request_globals_class</span>
- <span class="c1">#: The class that is used for the ``config`` attribute of this app.</span>
- <span class="c1">#: Defaults to :class:`~flask.Config`.</span>
- <span class="c1">#:</span>
- <span class="c1">#: Example use cases for a custom class:</span>
- <span class="c1">#:</span>
- <span class="c1">#: 1. Default values for certain config options.</span>
- <span class="c1">#: 2. Access to config values through attributes in addition to keys.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.11</span>
- <span class="n">config_class</span> <span class="o">=</span> <span class="n">Config</span>
- <span class="c1">#: The debug flag. Set this to ``True`` to enable debugging of the</span>
- <span class="c1">#: application. In debug mode the debugger will kick in when an unhandled</span>
- <span class="c1">#: exception occurs and the integrated server will automatically reload</span>
- <span class="c1">#: the application if changes in the code are detected.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the ``DEBUG``</span>
- <span class="c1">#: configuration key. Defaults to ``False``.</span>
- <span class="n">debug</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'DEBUG'</span><span class="p">)</span>
- <span class="c1">#: The testing flag. Set this to ``True`` to enable the test mode of</span>
- <span class="c1">#: Flask extensions (and in the future probably also Flask itself).</span>
- <span class="c1">#: For example this might activate unittest helpers that have an</span>
- <span class="c1">#: additional runtime cost which should not be enabled by default.</span>
- <span class="c1">#:</span>
- <span class="c1">#: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the</span>
- <span class="c1">#: default it's implicitly enabled.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``TESTING`` configuration key. Defaults to ``False``.</span>
- <span class="n">testing</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'TESTING'</span><span class="p">)</span>
- <span class="c1">#: If a secret key is set, cryptographic components can use this to</span>
- <span class="c1">#: sign cookies and other things. Set this to a complex random value</span>
- <span class="c1">#: when you want to use the secure cookie for instance.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``SECRET_KEY`` configuration key. Defaults to ``None``.</span>
- <span class="n">secret_key</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'SECRET_KEY'</span><span class="p">)</span>
- <span class="c1">#: The secure cookie uses this for the name of the session cookie.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'``</span>
- <span class="n">session_cookie_name</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'SESSION_COOKIE_NAME'</span><span class="p">)</span>
- <span class="c1">#: A :class:`~datetime.timedelta` which is used to set the expiration</span>
- <span class="c1">#: date of a permanent session. The default is 31 days which makes a</span>
- <span class="c1">#: permanent session survive for roughly one month.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to</span>
- <span class="c1">#: ``timedelta(days=31)``</span>
- <span class="n">permanent_session_lifetime</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'PERMANENT_SESSION_LIFETIME'</span><span class="p">,</span>
- <span class="n">get_converter</span><span class="o">=</span><span class="n">_make_timedelta</span><span class="p">)</span>
- <span class="c1">#: A :class:`~datetime.timedelta` which is used as default cache_timeout</span>
- <span class="c1">#: for the :func:`send_file` functions. The default is 12 hours.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration</span>
- <span class="c1">#: variable can also be set with an integer value used as seconds.</span>
- <span class="c1">#: Defaults to ``timedelta(hours=12)``</span>
- <span class="n">send_file_max_age_default</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'SEND_FILE_MAX_AGE_DEFAULT'</span><span class="p">,</span>
- <span class="n">get_converter</span><span class="o">=</span><span class="n">_make_timedelta</span><span class="p">)</span>
- <span class="c1">#: Enable this if you want to use the X-Sendfile feature. Keep in</span>
- <span class="c1">#: mind that the server has to support this. This only affects files</span>
- <span class="c1">#: sent with the :func:`send_file` method.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.2</span>
- <span class="c1">#:</span>
- <span class="c1">#: This attribute can also be configured from the config with the</span>
- <span class="c1">#: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``.</span>
- <span class="n">use_x_sendfile</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'USE_X_SENDFILE'</span><span class="p">)</span>
- <span class="c1">#: The name of the logger to use. By default the logger name is the</span>
- <span class="c1">#: package name passed to the constructor.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.4</span>
- <span class="n">logger_name</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">'LOGGER_NAME'</span><span class="p">)</span>
- <span class="c1">#: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.10</span>
- <span class="n">json_encoder</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span>
- <span class="c1">#: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.10</span>
- <span class="n">json_decoder</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecoder</span>
- <span class="c1">#: Options that are passed directly to the Jinja2 environment.</span>
- <span class="n">jinja_options</span> <span class="o">=</span> <span class="n">ImmutableDict</span><span class="p">(</span>
- <span class="n">extensions</span><span class="o">=</span><span class="p">[</span><span class="s1">'jinja2.ext.autoescape'</span><span class="p">,</span> <span class="s1">'jinja2.ext.with_'</span><span class="p">]</span>
- <span class="p">)</span>
- <span class="c1">#: Default configuration parameters.</span>
- <span class="n">default_config</span> <span class="o">=</span> <span class="n">ImmutableDict</span><span class="p">({</span>
- <span class="s1">'DEBUG'</span><span class="p">:</span> <span class="n">get_debug_flag</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span>
- <span class="s1">'TESTING'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'PROPAGATE_EXCEPTIONS'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'PRESERVE_CONTEXT_ON_EXCEPTION'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'SECRET_KEY'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'PERMANENT_SESSION_LIFETIME'</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">31</span><span class="p">),</span>
- <span class="s1">'USE_X_SENDFILE'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'LOGGER_NAME'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'LOGGER_HANDLER_POLICY'</span><span class="p">:</span> <span class="s1">'always'</span><span class="p">,</span>
- <span class="s1">'SERVER_NAME'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'APPLICATION_ROOT'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'SESSION_COOKIE_NAME'</span><span class="p">:</span> <span class="s1">'session'</span><span class="p">,</span>
- <span class="s1">'SESSION_COOKIE_DOMAIN'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'SESSION_COOKIE_PATH'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'SESSION_COOKIE_HTTPONLY'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
- <span class="s1">'SESSION_COOKIE_SECURE'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'SESSION_REFRESH_EACH_REQUEST'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
- <span class="s1">'MAX_CONTENT_LENGTH'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="s1">'SEND_FILE_MAX_AGE_DEFAULT'</span><span class="p">:</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">12</span><span class="p">),</span>
- <span class="s1">'TRAP_BAD_REQUEST_ERRORS'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'TRAP_HTTP_EXCEPTIONS'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'EXPLAIN_TEMPLATE_LOADING'</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
- <span class="s1">'PREFERRED_URL_SCHEME'</span><span class="p">:</span> <span class="s1">'http'</span><span class="p">,</span>
- <span class="s1">'JSON_AS_ASCII'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
- <span class="s1">'JSON_SORT_KEYS'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
- <span class="s1">'JSONIFY_PRETTYPRINT_REGULAR'</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
- <span class="s1">'JSONIFY_MIMETYPE'</span><span class="p">:</span> <span class="s1">'application/json'</span><span class="p">,</span>
- <span class="s1">'TEMPLATES_AUTO_RELOAD'</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
- <span class="p">})</span>
- <span class="c1">#: The rule object to use for URL rules created. This is used by</span>
- <span class="c1">#: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="n">url_rule_class</span> <span class="o">=</span> <span class="n">Rule</span>
- <span class="c1">#: the test client that is used with when `test_client` is used.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="n">test_client_class</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="c1">#: the session interface to use. By default an instance of</span>
- <span class="c1">#: :class:`~flask.sessions.SecureCookieSessionInterface` is used here.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.8</span>
- <span class="n">session_interface</span> <span class="o">=</span> <span class="n">SecureCookieSessionInterface</span><span class="p">()</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">import_name</span><span class="p">,</span> <span class="n">static_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">static_url_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
- <span class="n">static_folder</span><span class="o">=</span><span class="s1">'static'</span><span class="p">,</span> <span class="n">template_folder</span><span class="o">=</span><span class="s1">'templates'</span><span class="p">,</span>
- <span class="n">instance_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">instance_relative_config</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
- <span class="n">root_path</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="n">_PackageBoundObject</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">import_name</span><span class="p">,</span>
- <span class="n">template_folder</span><span class="o">=</span><span class="n">template_folder</span><span class="p">,</span>
- <span class="n">root_path</span><span class="o">=</span><span class="n">root_path</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">static_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
- <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">'static_path is now called '</span>
- <span class="s1">'static_url_path'</span><span class="p">),</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
- <span class="n">static_url_path</span> <span class="o">=</span> <span class="n">static_path</span>
- <span class="k">if</span> <span class="n">static_url_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">static_url_path</span> <span class="o">=</span> <span class="n">static_url_path</span>
- <span class="k">if</span> <span class="n">static_folder</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">static_folder</span> <span class="o">=</span> <span class="n">static_folder</span>
- <span class="k">if</span> <span class="n">instance_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">instance_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_find_instance_path</span><span class="p">()</span>
- <span class="k">elif</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">instance_path</span><span class="p">):</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'If an instance path is provided it must be '</span>
- <span class="s1">'absolute. A relative path was given instead.'</span><span class="p">)</span>
- <span class="c1">#: Holds the path to the instance folder.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.8</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">instance_path</span> <span class="o">=</span> <span class="n">instance_path</span>
- <span class="c1">#: The configuration dictionary as :class:`Config`. This behaves</span>
- <span class="c1">#: exactly like a regular dictionary but supports additional methods</span>
- <span class="c1">#: to load a config from files.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_config</span><span class="p">(</span><span class="n">instance_relative_config</span><span class="p">)</span>
- <span class="c1"># Prepare the deferred setup of the logger.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">logger_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">import_name</span>
- <span class="c1">#: A dictionary of all view functions registered. The keys will</span>
- <span class="c1">#: be function names which are also used to generate URLs and</span>
- <span class="c1">#: the values are the function objects themselves.</span>
- <span class="c1">#: To register a view function, use the :meth:`route` decorator.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1"># support for the now deprecated `error_handlers` attribute. The</span>
- <span class="c1"># :attr:`error_handler_spec` shall be used now.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A dictionary of all registered error handlers. The key is ``None``</span>
- <span class="c1">#: for error handlers active on the application, otherwise the key is</span>
- <span class="c1">#: the name of the blueprint. Each key points to another dictionary</span>
- <span class="c1">#: where the key is the status code of the http exception. The</span>
- <span class="c1">#: special key ``None`` points to a list of tuples where the first item</span>
- <span class="c1">#: is the class for the instance check and the second the error handler</span>
- <span class="c1">#: function.</span>
- <span class="c1">#:</span>
- <span class="c1">#: To register a error handler, use the :meth:`errorhandler`</span>
- <span class="c1">#: decorator.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">error_handler_spec</span> <span class="o">=</span> <span class="p">{</span><span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span><span class="p">}</span>
- <span class="c1">#: A list of functions that are called when :meth:`url_for` raises a</span>
- <span class="c1">#: :exc:`~werkzeug.routing.BuildError`. Each function registered here</span>
- <span class="c1">#: is called with `error`, `endpoint` and `values`. If a function</span>
- <span class="c1">#: returns ``None`` or raises a :exc:`BuildError` the next function is</span>
- <span class="c1">#: tried.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.9</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_build_error_handlers</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1">#: A dictionary with lists of functions that should be called at the</span>
- <span class="c1">#: beginning of the request. The key of the dictionary is the name of</span>
- <span class="c1">#: the blueprint this function is active for, ``None`` for all requests.</span>
- <span class="c1">#: This can for example be used to open database connections or</span>
- <span class="c1">#: getting hold of the currently logged in user. To register a</span>
- <span class="c1">#: function here, use the :meth:`before_request` decorator.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A lists of functions that should be called at the beginning of the</span>
- <span class="c1">#: first request to this instance. To register a function here, use</span>
- <span class="c1">#: the :meth:`before_first_request` decorator.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.8</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">before_first_request_funcs</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1">#: A dictionary with lists of functions that should be called after</span>
- <span class="c1">#: each request. The key of the dictionary is the name of the blueprint</span>
- <span class="c1">#: this function is active for, ``None`` for all requests. This can for</span>
- <span class="c1">#: example be used to close database connections. To register a function</span>
- <span class="c1">#: here, use the :meth:`after_request` decorator.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A dictionary with lists of functions that are called after</span>
- <span class="c1">#: each request, even if an exception has occurred. The key of the</span>
- <span class="c1">#: dictionary is the name of the blueprint this function is active for,</span>
- <span class="c1">#: ``None`` for all requests. These functions are not allowed to modify</span>
- <span class="c1">#: the request, and their return values are ignored. If an exception</span>
- <span class="c1">#: occurred while processing the request, it gets passed to each</span>
- <span class="c1">#: teardown_request function. To register a function here, use the</span>
- <span class="c1">#: :meth:`teardown_request` decorator.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A list of functions that are called when the application context</span>
- <span class="c1">#: is destroyed. Since the application context is also torn down</span>
- <span class="c1">#: if the request ends this is the place to store code that disconnects</span>
- <span class="c1">#: from databases.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.9</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">teardown_appcontext_funcs</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1">#: A dictionary with lists of functions that can be used as URL</span>
- <span class="c1">#: value processor functions. Whenever a URL is built these functions</span>
- <span class="c1">#: are called to modify the dictionary of values in place. The key</span>
- <span class="c1">#: ``None`` here is used for application wide</span>
- <span class="c1">#: callbacks, otherwise the key is the name of the blueprint.</span>
- <span class="c1">#: Each of these functions has the chance to modify the dictionary</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A dictionary with lists of functions that can be used as URL value</span>
- <span class="c1">#: preprocessors. The key ``None`` here is used for application wide</span>
- <span class="c1">#: callbacks, otherwise the key is the name of the blueprint.</span>
- <span class="c1">#: Each of these functions has the chance to modify the dictionary</span>
- <span class="c1">#: of URL values before they are used as the keyword arguments of the</span>
- <span class="c1">#: view function. For each function registered this one should also</span>
- <span class="c1">#: provide a :meth:`url_defaults` function that adds the parameters</span>
- <span class="c1">#: automatically again that were removed that way.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_default_functions</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: A dictionary with list of functions that are called without argument</span>
- <span class="c1">#: to populate the template context. The key of the dictionary is the</span>
- <span class="c1">#: name of the blueprint this function is active for, ``None`` for all</span>
- <span class="c1">#: requests. Each returns a dictionary that the template context is</span>
- <span class="c1">#: updated with. To register a function here, use the</span>
- <span class="c1">#: :meth:`context_processor` decorator.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span> <span class="o">=</span> <span class="p">{</span>
- <span class="kc">None</span><span class="p">:</span> <span class="p">[</span><span class="n">_default_template_ctx_processor</span><span class="p">]</span>
- <span class="p">}</span>
- <span class="c1">#: A list of shell context processor functions that should be run</span>
- <span class="c1">#: when a shell context is created.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.11</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">shell_context_processors</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1">#: all the attached blueprints in a dictionary by name. Blueprints</span>
- <span class="c1">#: can be attached multiple times so this dictionary does not tell</span>
- <span class="c1">#: you how often they got attached.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_blueprint_order</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1">#: a place where extensions can store application specific state. For</span>
- <span class="c1">#: example this is where an extension could store database engines and</span>
- <span class="c1">#: similar things. For backwards compatibility extensions should register</span>
- <span class="c1">#: themselves like this::</span>
- <span class="c1">#:</span>
- <span class="c1">#: if not hasattr(app, 'extensions'):</span>
- <span class="c1">#: app.extensions = {}</span>
- <span class="c1">#: app.extensions['extensionname'] = SomeObject()</span>
- <span class="c1">#:</span>
- <span class="c1">#: The key must match the name of the extension module. For example in</span>
- <span class="c1">#: case of a "Flask-Foo" extension in `flask_foo`, the key would be</span>
- <span class="c1">#: ``'foo'``.</span>
- <span class="c1">#:</span>
- <span class="c1">#: .. versionadded:: 0.7</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">extensions</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="c1">#: The :class:`~werkzeug.routing.Map` for this instance. You can use</span>
- <span class="c1">#: this to change the routing converters after the class was created</span>
- <span class="c1">#: but before any routes are connected. Example::</span>
- <span class="c1">#:</span>
- <span class="c1">#: from werkzeug.routing import BaseConverter</span>
- <span class="c1">#:</span>
- <span class="c1">#: class ListConverter(BaseConverter):</span>
- <span class="c1">#: def to_python(self, value):</span>
- <span class="c1">#: return value.split(',')</span>
- <span class="c1">#: def to_url(self, values):</span>
- <span class="c1">#: return ','.join(BaseConverter.to_url(value)</span>
- <span class="c1">#: for value in values)</span>
- <span class="c1">#:</span>
- <span class="c1">#: app = Flask(__name__)</span>
- <span class="c1">#: app.url_map.converters['list'] = ListConverter</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_map</span> <span class="o">=</span> <span class="n">Map</span><span class="p">()</span>
- <span class="c1"># tracks internally if the application already handled at least one</span>
- <span class="c1"># request.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_before_request_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
- <span class="c1"># register the static folder for the application. Do that even</span>
- <span class="c1"># if the folder does not exist. First of all it might be created</span>
- <span class="c1"># while the server is running (usually happens during development)</span>
- <span class="c1"># but also because google appengine stores static files somewhere</span>
- <span class="c1"># else when mapped with the .yml file.</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_static_folder</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_url_rule</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">static_url_path</span> <span class="o">+</span> <span class="s1">'/<path:filename>'</span><span class="p">,</span>
- <span class="n">endpoint</span><span class="o">=</span><span class="s1">'static'</span><span class="p">,</span>
- <span class="n">view_func</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">send_static_file</span><span class="p">)</span>
- <span class="c1">#: The click command line context for this application. Commands</span>
- <span class="c1">#: registered here show up in the :command:`flask` command once the</span>
- <span class="c1">#: application has been discovered. The default commands are</span>
- <span class="c1">#: provided by Flask itself and can be overridden.</span>
- <span class="c1">#:</span>
- <span class="c1">#: This is an instance of a :class:`click.Group` object.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cli</span> <span class="o">=</span> <span class="n">cli</span><span class="o">.</span><span class="n">AppGroup</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">_get_error_handlers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
- <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">'error_handlers is deprecated, use the '</span>
- <span class="s1">'new error_handler_spec attribute instead.'</span><span class="p">),</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span>
- <span class="k">def</span> <span class="nf">_set_error_handlers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span> <span class="o">=</span> <span class="n">value</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">error_handler_spec</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
- <span class="n">error_handlers</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_error_handlers</span><span class="p">,</span> <span class="n">_set_error_handlers</span><span class="p">)</span>
- <span class="k">del</span> <span class="n">_get_error_handlers</span><span class="p">,</span> <span class="n">_set_error_handlers</span>
- <span class="nd">@locked_cached_property</span>
- <div class="viewcode-block" id="Flask.name"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.name">[docs]</a> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""The name of the application. This is usually the import name</span>
- <span class="sd"> with the difference that it's guessed from the run file if the</span>
- <span class="sd"> import name is main. This name is used as a display name when</span>
- <span class="sd"> Flask needs the name of the application. It can be set and overridden</span>
- <span class="sd"> to change the value.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">import_name</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
- <span class="n">fn</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="p">[</span><span class="s1">'__main__'</span><span class="p">],</span> <span class="s1">'__file__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">fn</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">'__main__'</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">fn</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">import_name</span></div>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">propagate_exceptions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration</span>
- <span class="sd"> value in case it's set, otherwise a sensible default is returned.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'PROPAGATE_EXCEPTIONS'</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">rv</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">testing</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">preserve_context_on_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION``</span>
- <span class="sd"> configuration value in case it's set, otherwise a sensible default</span>
- <span class="sd"> is returned.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'PRESERVE_CONTEXT_ON_EXCEPTION'</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">rv</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""A :class:`logging.Logger` object for this application. The</span>
- <span class="sd"> default configuration is to log to stderr if the application is</span>
- <span class="sd"> in debug mode. This logger can be used to (surprise) log messages.</span>
- <span class="sd"> Here some examples::</span>
- <span class="sd"> app.logger.debug('A value for debugging')</span>
- <span class="sd"> app.logger.warning('A warning occurred (%d apples)', 42)</span>
- <span class="sd"> app.logger.error('An error occurred')</span>
- <span class="sd"> .. versionadded:: 0.3</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">logger_name</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span>
- <span class="k">with</span> <span class="n">_logger_lock</span><span class="p">:</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">logger_name</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span>
- <span class="kn">from</span> <span class="nn">flask.logging</span> <span class="k">import</span> <span class="n">create_logger</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="o">=</span> <span class="n">rv</span> <span class="o">=</span> <span class="n">create_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">rv</span>
- <span class="nd">@locked_cached_property</span>
- <div class="viewcode-block" id="Flask.jinja_env"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.jinja_env">[docs]</a> <span class="k">def</span> <span class="nf">jinja_env</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""The Jinja2 environment used to load templates."""</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_jinja_environment</span><span class="p">()</span></div>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">got_first_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""This attribute is set to ``True`` if the application started</span>
- <span class="sd"> handling the first request.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span>
- <div class="viewcode-block" id="Flask.make_config"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.make_config">[docs]</a> <span class="k">def</span> <span class="nf">make_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_relative</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
- <span class="sd">"""Used to create the config attribute by the Flask constructor.</span>
- <span class="sd"> The `instance_relative` parameter is passed in from the constructor</span>
- <span class="sd"> of Flask (there named `instance_relative_config`) and indicates if</span>
- <span class="sd"> the config should be relative to the instance path or the root path</span>
- <span class="sd"> of the application.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="n">root_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">root_path</span>
- <span class="k">if</span> <span class="n">instance_relative</span><span class="p">:</span>
- <span class="n">root_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance_path</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_class</span><span class="p">(</span><span class="n">root_path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_config</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.auto_find_instance_path"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.auto_find_instance_path">[docs]</a> <span class="k">def</span> <span class="nf">auto_find_instance_path</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Tries to locate the instance path if it was not provided to the</span>
- <span class="sd"> constructor of the application class. It will basically calculate</span>
- <span class="sd"> the path to a folder named ``instance`` next to your main file or</span>
- <span class="sd"> the package.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="n">prefix</span><span class="p">,</span> <span class="n">package_path</span> <span class="o">=</span> <span class="n">find_package</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">import_name</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">package_path</span><span class="p">,</span> <span class="s1">'instance'</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="s1">'var'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">+</span> <span class="s1">'-instance'</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.open_instance_resource"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.open_instance_resource">[docs]</a> <span class="k">def</span> <span class="nf">open_instance_resource</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resource</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'rb'</span><span class="p">):</span>
- <span class="sd">"""Opens a resource from the application's instance folder</span>
- <span class="sd"> (:attr:`instance_path`). Otherwise works like</span>
- <span class="sd"> :meth:`open_resource`. Instance resources can also be opened for</span>
- <span class="sd"> writing.</span>
- <span class="sd"> :param resource: the name of the resource. To access resources within</span>
- <span class="sd"> subfolders use forward slashes as separator.</span>
- <span class="sd"> :param mode: resource file opening mode, default is 'rb'.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance_path</span><span class="p">,</span> <span class="n">resource</span><span class="p">),</span> <span class="n">mode</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.create_jinja_environment"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.create_jinja_environment">[docs]</a> <span class="k">def</span> <span class="nf">create_jinja_environment</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Creates the Jinja2 environment based on :attr:`jinja_options`</span>
- <span class="sd"> and :meth:`select_jinja_autoescape`. Since 0.7 this also adds</span>
- <span class="sd"> the Jinja2 globals and filters after initialization. Override</span>
- <span class="sd"> this function to customize the behavior.</span>
- <span class="sd"> .. versionadded:: 0.5</span>
- <span class="sd"> .. versionchanged:: 0.11</span>
- <span class="sd"> ``Environment.auto_reload`` set in accordance with</span>
- <span class="sd"> ``TEMPLATES_AUTO_RELOAD`` configuration option.</span>
- <span class="sd"> """</span>
- <span class="n">options</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">jinja_options</span><span class="p">)</span>
- <span class="k">if</span> <span class="s1">'autoescape'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
- <span class="n">options</span><span class="p">[</span><span class="s1">'autoescape'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">select_jinja_autoescape</span>
- <span class="k">if</span> <span class="s1">'auto_reload'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'TEMPLATES_AUTO_RELOAD'</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">options</span><span class="p">[</span><span class="s1">'auto_reload'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'TEMPLATES_AUTO_RELOAD'</span><span class="p">]</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">options</span><span class="p">[</span><span class="s1">'auto_reload'</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">jinja_environment</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">globals</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
- <span class="n">url_for</span><span class="o">=</span><span class="n">url_for</span><span class="p">,</span>
- <span class="n">get_flashed_messages</span><span class="o">=</span><span class="n">get_flashed_messages</span><span class="p">,</span>
- <span class="n">config</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">,</span>
- <span class="c1"># request, session and g are normally added with the</span>
- <span class="c1"># context processor for efficiency reasons but for imported</span>
- <span class="c1"># templates we also want the proxies in there.</span>
- <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span>
- <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
- <span class="n">g</span><span class="o">=</span><span class="n">g</span>
- <span class="p">)</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">filters</span><span class="p">[</span><span class="s1">'tojson'</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">tojson_filter</span>
- <span class="k">return</span> <span class="n">rv</span></div>
- <div class="viewcode-block" id="Flask.create_global_jinja_loader"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.create_global_jinja_loader">[docs]</a> <span class="k">def</span> <span class="nf">create_global_jinja_loader</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Creates the loader for the Jinja2 environment. Can be used to</span>
- <span class="sd"> override just the loader and keeping the rest unchanged. It's</span>
- <span class="sd"> discouraged to override this function. Instead one should override</span>
- <span class="sd"> the :meth:`jinja_loader` function instead.</span>
- <span class="sd"> The global loader dispatches between the loaders of the application</span>
- <span class="sd"> and the individual blueprints.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">DispatchingJinjaLoader</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.init_jinja_globals"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.init_jinja_globals">[docs]</a> <span class="k">def</span> <span class="nf">init_jinja_globals</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Deprecated. Used to initialize the Jinja2 globals.</span>
- <span class="sd"> .. versionadded:: 0.5</span>
- <span class="sd"> .. versionchanged:: 0.7</span>
- <span class="sd"> This method is deprecated with 0.7. Override</span>
- <span class="sd"> :meth:`create_jinja_environment` instead.</span>
- <span class="sd"> """</span></div>
- <div class="viewcode-block" id="Flask.select_jinja_autoescape"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.select_jinja_autoescape">[docs]</a> <span class="k">def</span> <span class="nf">select_jinja_autoescape</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
- <span class="sd">"""Returns ``True`` if autoescaping should be active for the given</span>
- <span class="sd"> template name. If no template name is given, returns `True`.</span>
- <span class="sd"> .. versionadded:: 0.5</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">return</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">((</span><span class="s1">'.html'</span><span class="p">,</span> <span class="s1">'.htm'</span><span class="p">,</span> <span class="s1">'.xml'</span><span class="p">,</span> <span class="s1">'.xhtml'</span><span class="p">))</span></div>
- <div class="viewcode-block" id="Flask.update_template_context"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.update_template_context">[docs]</a> <span class="k">def</span> <span class="nf">update_template_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
- <span class="sd">"""Update the template context with some commonly used variables.</span>
- <span class="sd"> This injects request, session, config and g into the template</span>
- <span class="sd"> context as well as everything template context processors want</span>
- <span class="sd"> to inject. Note that the as of Flask 0.6, the original values</span>
- <span class="sd"> in the context will not be overridden if a context processor</span>
- <span class="sd"> decides to return a value with the same key.</span>
- <span class="sd"> :param context: the context as a dictionary that is updated in place</span>
- <span class="sd"> to add extra variables.</span>
- <span class="sd"> """</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span>
- <span class="n">reqctx</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span>
- <span class="k">if</span> <span class="n">reqctx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">bp</span> <span class="o">=</span> <span class="n">reqctx</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">blueprint</span>
- <span class="k">if</span> <span class="n">bp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span><span class="p">[</span><span class="n">bp</span><span class="p">])</span>
- <span class="n">orig_ctx</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">func</span><span class="p">())</span>
- <span class="c1"># make sure the original values win. This makes it possible to</span>
- <span class="c1"># easier add new variables in context processors without breaking</span>
- <span class="c1"># existing views.</span>
- <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">orig_ctx</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.make_shell_context"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.make_shell_context">[docs]</a> <span class="k">def</span> <span class="nf">make_shell_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Returns the shell context for an interactive shell for this</span>
- <span class="sd"> application. This runs all the registered shell context</span>
- <span class="sd"> processors.</span>
- <span class="sd"> .. versionadded:: 0.11</span>
- <span class="sd"> """</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'app'</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span> <span class="s1">'g'</span><span class="p">:</span> <span class="n">g</span><span class="p">}</span>
- <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">shell_context_processors</span><span class="p">:</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">processor</span><span class="p">())</span>
- <span class="k">return</span> <span class="n">rv</span></div>
- <div class="viewcode-block" id="Flask.run"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.run">[docs]</a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">debug</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">):</span>
- <span class="sd">"""Runs the application on a local development server.</span>
- <span class="sd"> Do not use ``run()`` in a production setting. It is not intended to</span>
- <span class="sd"> meet security and performance requirements for a production server.</span>
- <span class="sd"> Instead, see :ref:`deployment` for WSGI server recommendations.</span>
- <span class="sd"> If the :attr:`debug` flag is set the server will automatically reload</span>
- <span class="sd"> for code changes and show a debugger in case an exception happened.</span>
- <span class="sd"> If you want to run the application in debug mode, but disable the</span>
- <span class="sd"> code execution on the interactive debugger, you can pass</span>
- <span class="sd"> ``use_evalex=False`` as parameter. This will keep the debugger's</span>
- <span class="sd"> traceback screen active, but disable code execution.</span>
- <span class="sd"> It is not recommended to use this function for development with</span>
- <span class="sd"> automatic reloading as this is badly supported. Instead you should</span>
- <span class="sd"> be using the :command:`flask` command line script's ``run`` support.</span>
- <span class="sd"> .. admonition:: Keep in Mind</span>
- <span class="sd"> Flask will suppress any server error with a generic error page</span>
- <span class="sd"> unless it is in debug mode. As such to enable just the</span>
- <span class="sd"> interactive debugger without the code reloading, you have to</span>
- <span class="sd"> invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``.</span>
- <span class="sd"> Setting ``use_debugger`` to ``True`` without being in debug mode</span>
- <span class="sd"> won't catch any exceptions because there won't be any to</span>
- <span class="sd"> catch.</span>
- <span class="sd"> .. versionchanged:: 0.10</span>
- <span class="sd"> The default port is now picked from the ``SERVER_NAME`` variable.</span>
- <span class="sd"> :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to</span>
- <span class="sd"> have the server available externally as well. Defaults to</span>
- <span class="sd"> ``'127.0.0.1'``.</span>
- <span class="sd"> :param port: the port of the webserver. Defaults to ``5000`` or the</span>
- <span class="sd"> port defined in the ``SERVER_NAME`` config variable if</span>
- <span class="sd"> present.</span>
- <span class="sd"> :param debug: if given, enable or disable debug mode.</span>
- <span class="sd"> See :attr:`debug`.</span>
- <span class="sd"> :param options: the options to be forwarded to the underlying</span>
- <span class="sd"> Werkzeug server. See</span>
- <span class="sd"> :func:`werkzeug.serving.run_simple` for more</span>
- <span class="sd"> information.</span>
- <span class="sd"> """</span>
- <span class="kn">from</span> <span class="nn">werkzeug.serving</span> <span class="k">import</span> <span class="n">run_simple</span>
- <span class="k">if</span> <span class="n">host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">host</span> <span class="o">=</span> <span class="s1">'127.0.0.1'</span>
- <span class="k">if</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">server_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SERVER_NAME'</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">server_name</span> <span class="ow">and</span> <span class="s1">':'</span> <span class="ow">in</span> <span class="n">server_name</span><span class="p">:</span>
- <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">server_name</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">':'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">])</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">port</span> <span class="o">=</span> <span class="mi">5000</span>
- <span class="k">if</span> <span class="n">debug</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">debug</span><span class="p">)</span>
- <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'use_reloader'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">)</span>
- <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'use_debugger'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">)</span>
- <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'passthrough_errors'</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">run_simple</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="c1"># reset the first request information if the development server</span>
- <span class="c1"># resetted normally. This makes it possible to restart the server</span>
- <span class="c1"># without reloader and that stuff from an interactive shell.</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span> <span class="o">=</span> <span class="kc">False</span></div>
- <div class="viewcode-block" id="Flask.test_client"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.test_client">[docs]</a> <span class="k">def</span> <span class="nf">test_client</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">use_cookies</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="sd">"""Creates a test client for this application. For information</span>
- <span class="sd"> about unit testing head over to :ref:`testing`.</span>
- <span class="sd"> Note that if you are testing for assertions or exceptions in your</span>
- <span class="sd"> application code, you must set ``app.testing = True`` in order for the</span>
- <span class="sd"> exceptions to propagate to the test client. Otherwise, the exception</span>
- <span class="sd"> will be handled by the application (not visible to the test client) and</span>
- <span class="sd"> the only indication of an AssertionError or other exception will be a</span>
- <span class="sd"> 500 status code response to the test client. See the :attr:`testing`</span>
- <span class="sd"> attribute. For example::</span>
- <span class="sd"> app.testing = True</span>
- <span class="sd"> client = app.test_client()</span>
- <span class="sd"> The test client can be used in a ``with`` block to defer the closing down</span>
- <span class="sd"> of the context until the end of the ``with`` block. This is useful if</span>
- <span class="sd"> you want to access the context locals for testing::</span>
- <span class="sd"> with app.test_client() as c:</span>
- <span class="sd"> rv = c.get('/?vodka=42')</span>
- <span class="sd"> assert request.args['vodka'] == '42'</span>
- <span class="sd"> Additionally, you may pass optional keyword arguments that will then</span>
- <span class="sd"> be passed to the application's :attr:`test_client_class` constructor.</span>
- <span class="sd"> For example::</span>
- <span class="sd"> from flask.testing import FlaskClient</span>
- <span class="sd"> class CustomClient(FlaskClient):</span>
- <span class="sd"> def __init__(self, authentication=None, *args, **kwargs):</span>
- <span class="sd"> FlaskClient.__init__(*args, **kwargs)</span>
- <span class="sd"> self._authentication = authentication</span>
- <span class="sd"> app.test_client_class = CustomClient</span>
- <span class="sd"> client = app.test_client(authentication='Basic ....')</span>
- <span class="sd"> See :class:`~flask.testing.FlaskClient` for more information.</span>
- <span class="sd"> .. versionchanged:: 0.4</span>
- <span class="sd"> added support for ``with`` block usage for the client.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> The `use_cookies` parameter was added as well as the ability</span>
- <span class="sd"> to override the client to be used by setting the</span>
- <span class="sd"> :attr:`test_client_class` attribute.</span>
- <span class="sd"> .. versionchanged:: 0.11</span>
- <span class="sd"> Added `**kwargs` to support passing additional keyword arguments to</span>
- <span class="sd"> the constructor of :attr:`test_client_class`.</span>
- <span class="sd"> """</span>
- <span class="n">cls</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">test_client_class</span>
- <span class="k">if</span> <span class="n">cls</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">flask.testing</span> <span class="k">import</span> <span class="n">FlaskClient</span> <span class="k">as</span> <span class="n">cls</span>
- <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">,</span> <span class="n">use_cookies</span><span class="o">=</span><span class="n">use_cookies</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.open_session"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.open_session">[docs]</a> <span class="k">def</span> <span class="nf">open_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
- <span class="sd">"""Creates or opens a new session. Default implementation stores all</span>
- <span class="sd"> session data in a signed cookie. This requires that the</span>
- <span class="sd"> :attr:`secret_key` is set. Instead of overriding this method</span>
- <span class="sd"> we recommend replacing the :class:`session_interface`.</span>
- <span class="sd"> :param request: an instance of :attr:`request_class`.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_interface</span><span class="o">.</span><span class="n">open_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.save_session"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.save_session">[docs]</a> <span class="k">def</span> <span class="nf">save_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
- <span class="sd">"""Saves the session if it needs updates. For the default</span>
- <span class="sd"> implementation, check :meth:`open_session`. Instead of overriding this</span>
- <span class="sd"> method we recommend replacing the :class:`session_interface`.</span>
- <span class="sd"> :param session: the session to be saved (a</span>
- <span class="sd"> :class:`~werkzeug.contrib.securecookie.SecureCookie`</span>
- <span class="sd"> object)</span>
- <span class="sd"> :param response: an instance of :attr:`response_class`</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_interface</span><span class="o">.</span><span class="n">save_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.make_null_session"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.make_null_session">[docs]</a> <span class="k">def</span> <span class="nf">make_null_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Creates a new instance of a missing session. Instead of overriding</span>
- <span class="sd"> this method we recommend replacing the :class:`session_interface`.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_interface</span><span class="o">.</span><span class="n">make_null_session</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.register_blueprint"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.register_blueprint">[docs]</a> <span class="k">def</span> <span class="nf">register_blueprint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">blueprint</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">):</span>
- <span class="sd">"""Register a blueprint on the application. For information about </span>
- <span class="sd"> blueprints head over to :ref:`blueprints`.</span>
- <span class="sd"> The blueprint name is passed in as the first argument. </span>
- <span class="sd"> Options are passed as additional keyword arguments and forwarded to </span>
- <span class="sd"> `blueprints` in an "options" dictionary.</span>
- <span class="sd"> :param subdomain: set a subdomain for the blueprint</span>
- <span class="sd"> :param url_prefix: set the prefix for all URLs defined on the blueprint.</span>
- <span class="sd"> ``(url_prefix='/<lang code>')``</span>
- <span class="sd"> :param url_defaults: a dictionary with URL defaults that is added to </span>
- <span class="sd"> each and every URL defined with this blueprint</span>
- <span class="sd"> :param static_folder: add a static folder to urls in this blueprint</span>
- <span class="sd"> :param static_url_path: add a static url path to urls in this blueprint</span>
- <span class="sd"> :param template_folder: set an alternate template folder</span>
- <span class="sd"> :param root_path: set an alternate root path for this blueprint</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">first_registration</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">if</span> <span class="n">blueprint</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span><span class="p">:</span>
- <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span><span class="p">[</span><span class="n">blueprint</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="ow">is</span> <span class="n">blueprint</span><span class="p">,</span> \
- <span class="s1">'A blueprint</span><span class="se">\'</span><span class="s1">s name collision occurred between </span><span class="si">%r</span><span class="s1"> and '</span> \
- <span class="s1">'</span><span class="si">%r</span><span class="s1">. Both share the same name "</span><span class="si">%s</span><span class="s1">". Blueprints that '</span> \
- <span class="s1">'are created on the fly need unique names.'</span> <span class="o">%</span> \
- <span class="p">(</span><span class="n">blueprint</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span><span class="p">[</span><span class="n">blueprint</span><span class="o">.</span><span class="n">name</span><span class="p">],</span> <span class="n">blueprint</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span><span class="p">[</span><span class="n">blueprint</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">blueprint</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_blueprint_order</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">blueprint</span><span class="p">)</span>
- <span class="n">first_registration</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="n">blueprint</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">options</span><span class="p">,</span> <span class="n">first_registration</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.iter_blueprints"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.iter_blueprints">[docs]</a> <span class="k">def</span> <span class="nf">iter_blueprints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Iterates over all blueprints by the order they were registered.</span>
- <span class="sd"> .. versionadded:: 0.11</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_blueprint_order</span><span class="p">)</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.add_url_rule"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.add_url_rule">[docs]</a> <span class="k">def</span> <span class="nf">add_url_rule</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rule</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">view_func</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">):</span>
- <span class="sd">"""Connects a URL rule. Works exactly like the :meth:`route`</span>
- <span class="sd"> decorator. If a view_func is provided it will be registered with the</span>
- <span class="sd"> endpoint.</span>
- <span class="sd"> Basically this example::</span>
- <span class="sd"> @app.route('/')</span>
- <span class="sd"> def index():</span>
- <span class="sd"> pass</span>
- <span class="sd"> Is equivalent to the following::</span>
- <span class="sd"> def index():</span>
- <span class="sd"> pass</span>
- <span class="sd"> app.add_url_rule('/', 'index', index)</span>
- <span class="sd"> If the view_func is not provided you will need to connect the endpoint</span>
- <span class="sd"> to a view function like so::</span>
- <span class="sd"> app.view_functions['index'] = index</span>
- <span class="sd"> Internally :meth:`route` invokes :meth:`add_url_rule` so if you want</span>
- <span class="sd"> to customize the behavior via subclassing you only need to change</span>
- <span class="sd"> this method.</span>
- <span class="sd"> For more information refer to :ref:`url-route-registrations`.</span>
- <span class="sd"> .. versionchanged:: 0.2</span>
- <span class="sd"> `view_func` parameter added.</span>
- <span class="sd"> .. versionchanged:: 0.6</span>
- <span class="sd"> ``OPTIONS`` is added automatically as method.</span>
- <span class="sd"> :param rule: the URL rule as string</span>
- <span class="sd"> :param endpoint: the endpoint for the registered URL rule. Flask</span>
- <span class="sd"> itself assumes the name of the view function as</span>
- <span class="sd"> endpoint</span>
- <span class="sd"> :param view_func: the function to call when serving a request to the</span>
- <span class="sd"> provided endpoint</span>
- <span class="sd"> :param options: the options to be forwarded to the underlying</span>
- <span class="sd"> :class:`~werkzeug.routing.Rule` object. A change</span>
- <span class="sd"> to Werkzeug is handling of method options. methods</span>
- <span class="sd"> is a list of methods this rule should be limited</span>
- <span class="sd"> to (``GET``, ``POST`` etc.). By default a rule</span>
- <span class="sd"> just listens for ``GET`` (and implicitly ``HEAD``).</span>
- <span class="sd"> Starting with Flask 0.6, ``OPTIONS`` is implicitly</span>
- <span class="sd"> added and handled by the standard request handling.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">endpoint</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">endpoint</span> <span class="o">=</span> <span class="n">_endpoint_from_view_func</span><span class="p">(</span><span class="n">view_func</span><span class="p">)</span>
- <span class="n">options</span><span class="p">[</span><span class="s1">'endpoint'</span><span class="p">]</span> <span class="o">=</span> <span class="n">endpoint</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'methods'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="c1"># if the methods are not given and the view_func object knows its</span>
- <span class="c1"># methods we can use that instead. If neither exists, we go with</span>
- <span class="c1"># a tuple of only ``GET`` as default.</span>
- <span class="k">if</span> <span class="n">methods</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">view_func</span><span class="p">,</span> <span class="s1">'methods'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="s1">'GET'</span><span class="p">,)</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">methods</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'Allowed methods have to be iterables of strings, '</span>
- <span class="s1">'for example: @app.route(..., methods=["POST"])'</span><span class="p">)</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">)</span>
- <span class="c1"># Methods that should always be added</span>
- <span class="n">required_methods</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">view_func</span><span class="p">,</span> <span class="s1">'required_methods'</span><span class="p">,</span> <span class="p">()))</span>
- <span class="c1"># starting with Flask 0.8 the view_func object can disable and</span>
- <span class="c1"># force-enable the automatic options handling.</span>
- <span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">view_func</span><span class="p">,</span>
- <span class="s1">'provide_automatic_options'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">provide_automatic_options</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">if</span> <span class="s1">'OPTIONS'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
- <span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="n">required_methods</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s1">'OPTIONS'</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="c1"># Add the required methods now.</span>
- <span class="n">methods</span> <span class="o">|=</span> <span class="n">required_methods</span>
- <span class="n">rule</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_rule_class</span><span class="p">(</span><span class="n">rule</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="n">methods</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
- <span class="n">rule</span><span class="o">.</span><span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="n">provide_automatic_options</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_map</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">view_func</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">old_func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">endpoint</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">old_func</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">old_func</span> <span class="o">!=</span> <span class="n">view_func</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="s1">'View function mapping is overwriting an '</span>
- <span class="s1">'existing endpoint function: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">endpoint</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span><span class="p">[</span><span class="n">endpoint</span><span class="p">]</span> <span class="o">=</span> <span class="n">view_func</span></div>
- <div class="viewcode-block" id="Flask.route"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.route">[docs]</a> <span class="k">def</span> <span class="nf">route</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rule</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">):</span>
- <span class="sd">"""A decorator that is used to register a view function for a</span>
- <span class="sd"> given URL rule. This does the same thing as :meth:`add_url_rule`</span>
- <span class="sd"> but is intended for decorator usage::</span>
- <span class="sd"> @app.route('/')</span>
- <span class="sd"> def index():</span>
- <span class="sd"> return 'Hello World'</span>
- <span class="sd"> For more information refer to :ref:`url-route-registrations`.</span>
- <span class="sd"> :param rule: the URL rule as string</span>
- <span class="sd"> :param endpoint: the endpoint for the registered URL rule. Flask</span>
- <span class="sd"> itself assumes the name of the view function as</span>
- <span class="sd"> endpoint</span>
- <span class="sd"> :param options: the options to be forwarded to the underlying</span>
- <span class="sd"> :class:`~werkzeug.routing.Rule` object. A change</span>
- <span class="sd"> to Werkzeug is handling of method options. methods</span>
- <span class="sd"> is a list of methods this rule should be limited</span>
- <span class="sd"> to (``GET``, ``POST`` etc.). By default a rule</span>
- <span class="sd"> just listens for ``GET`` (and implicitly ``HEAD``).</span>
- <span class="sd"> Starting with Flask 0.6, ``OPTIONS`` is implicitly</span>
- <span class="sd"> added and handled by the standard request handling.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="n">endpoint</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">'endpoint'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_url_rule</span><span class="p">(</span><span class="n">rule</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">options</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.endpoint"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.endpoint">[docs]</a> <span class="k">def</span> <span class="nf">endpoint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
- <span class="sd">"""A decorator to register a function as an endpoint.</span>
- <span class="sd"> Example::</span>
- <span class="sd"> @app.endpoint('example.endpoint')</span>
- <span class="sd"> def example():</span>
- <span class="sd"> return "example"</span>
- <span class="sd"> :param endpoint: the name of the endpoint</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span><span class="p">[</span><span class="n">endpoint</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <span class="nd">@staticmethod</span>
- <span class="k">def</span> <span class="nf">_get_exc_class_and_code</span><span class="p">(</span><span class="n">exc_class_or_code</span><span class="p">):</span>
- <span class="sd">"""Ensure that we register only exceptions as handler keys"""</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc_class_or_code</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">):</span>
- <span class="n">exc_class</span> <span class="o">=</span> <span class="n">default_exceptions</span><span class="p">[</span><span class="n">exc_class_or_code</span><span class="p">]</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">exc_class</span> <span class="o">=</span> <span class="n">exc_class_or_code</span>
- <span class="k">assert</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_class</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_class</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">exc_class</span><span class="p">,</span> <span class="n">exc_class</span><span class="o">.</span><span class="n">code</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">exc_class</span><span class="p">,</span> <span class="kc">None</span>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.errorhandler"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.errorhandler">[docs]</a> <span class="k">def</span> <span class="nf">errorhandler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code_or_exception</span><span class="p">):</span>
- <span class="sd">"""A decorator that is used to register a function give a given</span>
- <span class="sd"> error code. Example::</span>
- <span class="sd"> @app.errorhandler(404)</span>
- <span class="sd"> def page_not_found(error):</span>
- <span class="sd"> return 'This page does not exist', 404</span>
- <span class="sd"> You can also register handlers for arbitrary exceptions::</span>
- <span class="sd"> @app.errorhandler(DatabaseError)</span>
- <span class="sd"> def special_exception_handler(error):</span>
- <span class="sd"> return 'Database connection failed', 500</span>
- <span class="sd"> You can also register a function as error handler without using</span>
- <span class="sd"> the :meth:`errorhandler` decorator. The following example is</span>
- <span class="sd"> equivalent to the one above::</span>
- <span class="sd"> def page_not_found(error):</span>
- <span class="sd"> return 'This page does not exist', 404</span>
- <span class="sd"> app.error_handler_spec[None][404] = page_not_found</span>
- <span class="sd"> Setting error handlers via assignments to :attr:`error_handler_spec`</span>
- <span class="sd"> however is discouraged as it requires fiddling with nested dictionaries</span>
- <span class="sd"> and the special case for arbitrary exception types.</span>
- <span class="sd"> The first ``None`` refers to the active blueprint. If the error</span>
- <span class="sd"> handler should be application wide ``None`` shall be used.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> Use :meth:`register_error_handler` instead of modifying</span>
- <span class="sd"> :attr:`error_handler_spec` directly, for application wide error</span>
- <span class="sd"> handlers.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> One can now additionally also register custom exception types</span>
- <span class="sd"> that do not necessarily have to be a subclass of the</span>
- <span class="sd"> :class:`~werkzeug.exceptions.HTTPException` class.</span>
- <span class="sd"> :param code: the code as integer for the handler</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_register_error_handler</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">code_or_exception</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <div class="viewcode-block" id="Flask.register_error_handler"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.register_error_handler">[docs]</a> <span class="k">def</span> <span class="nf">register_error_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code_or_exception</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Alternative error attach function to the :meth:`errorhandler`</span>
- <span class="sd"> decorator that is more straightforward to use for non decorator</span>
- <span class="sd"> usage.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_register_error_handler</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">code_or_exception</span><span class="p">,</span> <span class="n">f</span><span class="p">)</span></div>
- <span class="nd">@setupmethod</span>
- <span class="k">def</span> <span class="nf">_register_error_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">code_or_exception</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> :type key: None|str</span>
- <span class="sd"> :type code_or_exception: int|T<=Exception</span>
- <span class="sd"> :type f: callable</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">code_or_exception</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">):</span> <span class="c1"># old broken behavior</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
- <span class="s1">'Tried to register a handler for an exception instance </span><span class="si">{0!r}</span><span class="s1">. '</span>
- <span class="s1">'Handlers can only be registered for exception classes or HTTP error codes.'</span>
- <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code_or_exception</span><span class="p">))</span>
- <span class="n">exc_class</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_exc_class_and_code</span><span class="p">(</span><span class="n">code_or_exception</span><span class="p">)</span>
- <span class="n">handlers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_handler_spec</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="p">{})</span>
- <span class="n">handlers</span><span class="p">[</span><span class="n">exc_class</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.template_filter"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.template_filter">[docs]</a> <span class="k">def</span> <span class="nf">template_filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""A decorator that is used to register custom template filter.</span>
- <span class="sd"> You can specify a name for the filter, otherwise the function</span>
- <span class="sd"> name will be used. Example::</span>
- <span class="sd"> @app.template_filter()</span>
- <span class="sd"> def reverse(s):</span>
- <span class="sd"> return s[::-1]</span>
- <span class="sd"> :param name: the optional name of the filter, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_template_filter</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.add_template_filter"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.add_template_filter">[docs]</a> <span class="k">def</span> <span class="nf">add_template_filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""Register a custom template filter. Works exactly like the</span>
- <span class="sd"> :meth:`template_filter` decorator.</span>
- <span class="sd"> :param name: the optional name of the filter, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">jinja_env</span><span class="o">.</span><span class="n">filters</span><span class="p">[</span><span class="n">name</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">__name__</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.template_test"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.template_test">[docs]</a> <span class="k">def</span> <span class="nf">template_test</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""A decorator that is used to register custom template test.</span>
- <span class="sd"> You can specify a name for the test, otherwise the function</span>
- <span class="sd"> name will be used. Example::</span>
- <span class="sd"> @app.template_test()</span>
- <span class="sd"> def is_prime(n):</span>
- <span class="sd"> if n == 2:</span>
- <span class="sd"> return True</span>
- <span class="sd"> for i in range(2, int(math.ceil(math.sqrt(n))) + 1):</span>
- <span class="sd"> if n % i == 0:</span>
- <span class="sd"> return False</span>
- <span class="sd"> return True</span>
- <span class="sd"> .. versionadded:: 0.10</span>
- <span class="sd"> :param name: the optional name of the test, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_template_test</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.add_template_test"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.add_template_test">[docs]</a> <span class="k">def</span> <span class="nf">add_template_test</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""Register a custom template test. Works exactly like the</span>
- <span class="sd"> :meth:`template_test` decorator.</span>
- <span class="sd"> .. versionadded:: 0.10</span>
- <span class="sd"> :param name: the optional name of the test, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">jinja_env</span><span class="o">.</span><span class="n">tests</span><span class="p">[</span><span class="n">name</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">__name__</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.template_global"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.template_global">[docs]</a> <span class="k">def</span> <span class="nf">template_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""A decorator that is used to register a custom template global function.</span>
- <span class="sd"> You can specify a name for the global function, otherwise the function</span>
- <span class="sd"> name will be used. Example::</span>
- <span class="sd"> @app.template_global()</span>
- <span class="sd"> def double(n):</span>
- <span class="sd"> return 2 * n</span>
- <span class="sd"> .. versionadded:: 0.10</span>
- <span class="sd"> :param name: the optional name of the global function, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_template_global</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span>
- <span class="k">return</span> <span class="n">decorator</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.add_template_global"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.add_template_global">[docs]</a> <span class="k">def</span> <span class="nf">add_template_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="sd">"""Register a custom template global function. Works exactly like the</span>
- <span class="sd"> :meth:`template_global` decorator.</span>
- <span class="sd"> .. versionadded:: 0.10</span>
- <span class="sd"> :param name: the optional name of the global function, otherwise the</span>
- <span class="sd"> function name will be used.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">jinja_env</span><span class="o">.</span><span class="n">globals</span><span class="p">[</span><span class="n">name</span> <span class="ow">or</span> <span class="n">f</span><span class="o">.</span><span class="n">__name__</span><span class="p">]</span> <span class="o">=</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.before_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.before_request">[docs]</a> <span class="k">def</span> <span class="nf">before_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a function to run before each request.</span>
- <span class="sd"> The function will be called without any arguments.</span>
- <span class="sd"> If the function returns a non-None value, it's handled as</span>
- <span class="sd"> if it was the return value from the view and further</span>
- <span class="sd"> request handling is stopped.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.before_first_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.before_first_request">[docs]</a> <span class="k">def</span> <span class="nf">before_first_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a function to be run before the first request to this</span>
- <span class="sd"> instance of the application.</span>
- <span class="sd"> The function will be called without any arguments and its return</span>
- <span class="sd"> value is ignored.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">before_first_request_funcs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.after_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.after_request">[docs]</a> <span class="k">def</span> <span class="nf">after_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Register a function to be run after each request.</span>
- <span class="sd"> Your function must take one parameter, an instance of</span>
- <span class="sd"> :attr:`response_class` and return a new response object or the</span>
- <span class="sd"> same (see :meth:`process_response`).</span>
- <span class="sd"> As of Flask 0.7 this function might not be executed at the end of the</span>
- <span class="sd"> request in case an unhandled exception occurred.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.teardown_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.teardown_request">[docs]</a> <span class="k">def</span> <span class="nf">teardown_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Register a function to be run at the end of each request,</span>
- <span class="sd"> regardless of whether there was an exception or not. These functions</span>
- <span class="sd"> are executed when the request context is popped, even if not an</span>
- <span class="sd"> actual request was performed.</span>
- <span class="sd"> Example::</span>
- <span class="sd"> ctx = app.test_request_context()</span>
- <span class="sd"> ctx.push()</span>
- <span class="sd"> ...</span>
- <span class="sd"> ctx.pop()</span>
- <span class="sd"> When ``ctx.pop()`` is executed in the above example, the teardown</span>
- <span class="sd"> functions are called just before the request context moves from the</span>
- <span class="sd"> stack of active contexts. This becomes relevant if you are using</span>
- <span class="sd"> such constructs in tests.</span>
- <span class="sd"> Generally teardown functions must take every necessary step to avoid</span>
- <span class="sd"> that they will fail. If they do execute code that might fail they</span>
- <span class="sd"> will have to surround the execution of these code by try/except</span>
- <span class="sd"> statements and log occurring errors.</span>
- <span class="sd"> When a teardown function was called because of a exception it will</span>
- <span class="sd"> be passed an error object.</span>
- <span class="sd"> The return values of teardown functions are ignored.</span>
- <span class="sd"> .. admonition:: Debug Note</span>
- <span class="sd"> In debug mode Flask will not tear down a request on an exception</span>
- <span class="sd"> immediately. Instead it will keep it alive so that the interactive</span>
- <span class="sd"> debugger can still access it. This behavior can be controlled</span>
- <span class="sd"> by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.teardown_appcontext"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.teardown_appcontext">[docs]</a> <span class="k">def</span> <span class="nf">teardown_appcontext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a function to be called when the application context</span>
- <span class="sd"> ends. These functions are typically also called when the request</span>
- <span class="sd"> context is popped.</span>
- <span class="sd"> Example::</span>
- <span class="sd"> ctx = app.app_context()</span>
- <span class="sd"> ctx.push()</span>
- <span class="sd"> ...</span>
- <span class="sd"> ctx.pop()</span>
- <span class="sd"> When ``ctx.pop()`` is executed in the above example, the teardown</span>
- <span class="sd"> functions are called just before the app context moves from the</span>
- <span class="sd"> stack of active contexts. This becomes relevant if you are using</span>
- <span class="sd"> such constructs in tests.</span>
- <span class="sd"> Since a request context typically also manages an application</span>
- <span class="sd"> context it would also be called when you pop a request context.</span>
- <span class="sd"> When a teardown function was called because of an exception it will</span>
- <span class="sd"> be passed an error object.</span>
- <span class="sd"> The return values of teardown functions are ignored.</span>
- <span class="sd"> .. versionadded:: 0.9</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">teardown_appcontext_funcs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.context_processor"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.context_processor">[docs]</a> <span class="k">def</span> <span class="nf">context_processor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a template context processor function."""</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.shell_context_processor"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.shell_context_processor">[docs]</a> <span class="k">def</span> <span class="nf">shell_context_processor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a shell context processor function.</span>
- <span class="sd"> .. versionadded:: 0.11</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">shell_context_processors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.url_value_preprocessor"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.url_value_preprocessor">[docs]</a> <span class="k">def</span> <span class="nf">url_value_preprocessor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Registers a function as URL value preprocessor for all view</span>
- <span class="sd"> functions of the application. It's called before the view functions</span>
- <span class="sd"> are called and can modify the url values provided.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="nd">@setupmethod</span>
- <div class="viewcode-block" id="Flask.url_defaults"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.url_defaults">[docs]</a> <span class="k">def</span> <span class="nf">url_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">f</span><span class="p">):</span>
- <span class="sd">"""Callback function for URL defaults for all view functions of the</span>
- <span class="sd"> application. It's called with the endpoint and values and should</span>
- <span class="sd"> update the values passed in place.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">url_default_functions</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">f</span></div>
- <span class="k">def</span> <span class="nf">_find_error_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
- <span class="sd">"""Finds a registered error handler for the request’s blueprint.</span>
- <span class="sd"> Otherwise falls back to the app, returns None if not a suitable</span>
- <span class="sd"> handler is found.</span>
- <span class="sd"> """</span>
- <span class="n">exc_class</span><span class="p">,</span> <span class="n">code</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_exc_class_and_code</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
- <span class="k">def</span> <span class="nf">find_handler</span><span class="p">(</span><span class="n">handler_map</span><span class="p">):</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">handler_map</span><span class="p">:</span>
- <span class="k">return</span>
- <span class="n">queue</span> <span class="o">=</span> <span class="n">deque</span><span class="p">(</span><span class="n">exc_class</span><span class="o">.</span><span class="n">__mro__</span><span class="p">)</span>
- <span class="c1"># Protect from geniuses who might create circular references in</span>
- <span class="c1"># __mro__</span>
- <span class="n">done</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
- <span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
- <span class="n">cls</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">cls</span> <span class="ow">in</span> <span class="n">done</span><span class="p">:</span>
- <span class="k">continue</span>
- <span class="n">done</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span>
- <span class="n">handler</span> <span class="o">=</span> <span class="n">handler_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="c1"># cache for next time exc_class is raised</span>
- <span class="n">handler_map</span><span class="p">[</span><span class="n">exc_class</span><span class="p">]</span> <span class="o">=</span> <span class="n">handler</span>
- <span class="k">return</span> <span class="n">handler</span>
- <span class="n">queue</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">__mro__</span><span class="p">)</span>
- <span class="c1"># try blueprint handlers</span>
- <span class="n">handler</span> <span class="o">=</span> <span class="n">find_handler</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">error_handler_spec</span>
- <span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">blueprint</span><span class="p">,</span> <span class="p">{})</span>
- <span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">code</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">handler</span>
- <span class="c1"># fall back to app handlers</span>
- <span class="k">return</span> <span class="n">find_handler</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">error_handler_spec</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">code</span><span class="p">))</span>
- <div class="viewcode-block" id="Flask.handle_http_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.handle_http_exception">[docs]</a> <span class="k">def</span> <span class="nf">handle_http_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
- <span class="sd">"""Handles an HTTP exception. By default this will invoke the</span>
- <span class="sd"> registered error handlers and fall back to returning the</span>
- <span class="sd"> exception as response.</span>
- <span class="sd"> .. versionadded:: 0.3</span>
- <span class="sd"> """</span>
- <span class="c1"># Proxy exceptions don't have error codes. We want to always return</span>
- <span class="c1"># those unchanged as errors</span>
- <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">code</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">e</span>
- <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_error_handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">e</span>
- <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.trap_http_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.trap_http_exception">[docs]</a> <span class="k">def</span> <span class="nf">trap_http_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
- <span class="sd">"""Checks if an HTTP exception should be trapped or not. By default</span>
- <span class="sd"> this will return ``False`` for all exceptions except for a bad request</span>
- <span class="sd"> key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It</span>
- <span class="sd"> also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``.</span>
- <span class="sd"> This is called for all HTTP exceptions raised by a view function.</span>
- <span class="sd"> If it returns ``True`` for any exception the error handler for this</span>
- <span class="sd"> exception is not called and it shows up as regular exception in the</span>
- <span class="sd"> traceback. This is helpful for debugging implicitly raised HTTP</span>
- <span class="sd"> exceptions.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'TRAP_HTTP_EXCEPTIONS'</span><span class="p">]:</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'TRAP_BAD_REQUEST_ERRORS'</span><span class="p">]:</span>
- <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">BadRequest</span><span class="p">)</span>
- <span class="k">return</span> <span class="kc">False</span></div>
- <div class="viewcode-block" id="Flask.handle_user_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.handle_user_exception">[docs]</a> <span class="k">def</span> <span class="nf">handle_user_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
- <span class="sd">"""This method is called whenever an exception occurs that should be</span>
- <span class="sd"> handled. A special case are</span>
- <span class="sd"> :class:`~werkzeug.exception.HTTPException`\s which are forwarded by</span>
- <span class="sd"> this function to the :meth:`handle_http_exception` method. This</span>
- <span class="sd"> function will either return a response value or reraise the</span>
- <span class="sd"> exception with the same traceback.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
- <span class="k">assert</span> <span class="n">exc_value</span> <span class="ow">is</span> <span class="n">e</span>
- <span class="c1"># ensure not to trash sys.exc_info() at that point in case someone</span>
- <span class="c1"># wants the traceback preserved in handle_http_exception. Of course</span>
- <span class="c1"># we cannot prevent users from trashing it themselves in a custom</span>
- <span class="c1"># trap_http_exception method so that's their fault then.</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">trap_http_exception</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_http_exception</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
- <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_error_handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">reraise</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.handle_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.handle_exception">[docs]</a> <span class="k">def</span> <span class="nf">handle_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">e</span><span class="p">):</span>
- <span class="sd">"""Default exception handling that kicks in when an exception</span>
- <span class="sd"> occurs that is not caught. In debug mode the exception will</span>
- <span class="sd"> be re-raised immediately, otherwise it is logged and the handler</span>
- <span class="sd"> for a 500 internal server error is used. If no such handler</span>
- <span class="sd"> exists, a default 500 internal server error message is displayed.</span>
- <span class="sd"> .. versionadded:: 0.3</span>
- <span class="sd"> """</span>
- <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
- <span class="n">got_request_exception</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exception</span><span class="o">=</span><span class="n">e</span><span class="p">)</span>
- <span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_error_handler</span><span class="p">(</span><span class="n">InternalServerError</span><span class="p">())</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">propagate_exceptions</span><span class="p">:</span>
- <span class="c1"># if we want to repropagate the exception, we can attempt to</span>
- <span class="c1"># raise it with the whole traceback in case we can do that</span>
- <span class="c1"># (the function was actually called from the except part)</span>
- <span class="c1"># otherwise, we just raise the error again</span>
- <span class="k">if</span> <span class="n">exc_value</span> <span class="ow">is</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">reraise</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">e</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">log_exception</span><span class="p">((</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">InternalServerError</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.log_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.log_exception">[docs]</a> <span class="k">def</span> <span class="nf">log_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">):</span>
- <span class="sd">"""Logs an exception. This is called by :meth:`handle_exception`</span>
- <span class="sd"> if debugging is disabled and right before the handler is called.</span>
- <span class="sd"> The default implementation logs the exception as error on the</span>
- <span class="sd"> :attr:`logger`.</span>
- <span class="sd"> .. versionadded:: 0.8</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">'Exception on </span><span class="si">%s</span><span class="s1"> [</span><span class="si">%s</span><span class="s1">]'</span> <span class="o">%</span> <span class="p">(</span>
- <span class="n">request</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
- <span class="n">request</span><span class="o">.</span><span class="n">method</span>
- <span class="p">),</span> <span class="n">exc_info</span><span class="o">=</span><span class="n">exc_info</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.raise_routing_exception"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.raise_routing_exception">[docs]</a> <span class="k">def</span> <span class="nf">raise_routing_exception</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
- <span class="sd">"""Exceptions that are recording during routing are reraised with</span>
- <span class="sd"> this method. During debug we are not reraising redirect requests</span>
- <span class="sd"> for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising</span>
- <span class="sd"> a different error instead to help debug situations.</span>
- <span class="sd"> :internal:</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> \
- <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">routing_exception</span><span class="p">,</span> <span class="n">RequestRedirect</span><span class="p">)</span> \
- <span class="ow">or</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'GET'</span><span class="p">,</span> <span class="s1">'HEAD'</span><span class="p">,</span> <span class="s1">'OPTIONS'</span><span class="p">):</span>
- <span class="k">raise</span> <span class="n">request</span><span class="o">.</span><span class="n">routing_exception</span>
- <span class="kn">from</span> <span class="nn">.debughelpers</span> <span class="k">import</span> <span class="n">FormDataRoutingRedirect</span>
- <span class="k">raise</span> <span class="n">FormDataRoutingRedirect</span><span class="p">(</span><span class="n">request</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.dispatch_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.dispatch_request">[docs]</a> <span class="k">def</span> <span class="nf">dispatch_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Does the request dispatching. Matches the URL and returns the</span>
- <span class="sd"> return value of the view or error handler. This does not have to</span>
- <span class="sd"> be a response object. In order to convert the return value to a</span>
- <span class="sd"> proper response object, call :func:`make_response`.</span>
- <span class="sd"> .. versionchanged:: 0.7</span>
- <span class="sd"> This no longer does the exception handling, this code was</span>
- <span class="sd"> moved to the new :meth:`full_dispatch_request`.</span>
- <span class="sd"> """</span>
- <span class="n">req</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span><span class="o">.</span><span class="n">request</span>
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">routing_exception</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">raise_routing_exception</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
- <span class="n">rule</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">url_rule</span>
- <span class="c1"># if we provide automatic options for this URL and the</span>
- <span class="c1"># request came with the OPTIONS method, reply automatically</span>
- <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">rule</span><span class="p">,</span> <span class="s1">'provide_automatic_options'</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> \
- <span class="ow">and</span> <span class="n">req</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'OPTIONS'</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_default_options_response</span><span class="p">()</span>
- <span class="c1"># otherwise dispatch to the handler for that endpoint</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span><span class="p">[</span><span class="n">rule</span><span class="o">.</span><span class="n">endpoint</span><span class="p">](</span><span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">view_args</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.full_dispatch_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.full_dispatch_request">[docs]</a> <span class="k">def</span> <span class="nf">full_dispatch_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Dispatches the request and on top of that performs request</span>
- <span class="sd"> pre and postprocessing as well as HTTP exception catching and</span>
- <span class="sd"> error handling.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">try_trigger_before_first_request_functions</span><span class="p">()</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">request_started</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">preprocess_request</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dispatch_request</span><span class="p">()</span>
- <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_user_exception</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_response</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
- <span class="n">request_finished</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="o">=</span><span class="n">response</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">response</span></div>
- <div class="viewcode-block" id="Flask.try_trigger_before_first_request_functions"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.try_trigger_before_first_request_functions">[docs]</a> <span class="k">def</span> <span class="nf">try_trigger_before_first_request_functions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Called before each request and will ensure that it triggers</span>
- <span class="sd"> the :attr:`before_first_request_funcs` and only exactly once per</span>
- <span class="sd"> application instance (which means process usually).</span>
- <span class="sd"> :internal:</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span><span class="p">:</span>
- <span class="k">return</span>
- <span class="k">with</span> <span class="bp">self</span><span class="o">.</span><span class="n">_before_request_lock</span><span class="p">:</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span><span class="p">:</span>
- <span class="k">return</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">before_first_request_funcs</span><span class="p">:</span>
- <span class="n">func</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span> <span class="o">=</span> <span class="kc">True</span></div>
- <div class="viewcode-block" id="Flask.make_default_options_response"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.make_default_options_response">[docs]</a> <span class="k">def</span> <span class="nf">make_default_options_response</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""This method is called to create the default ``OPTIONS`` response.</span>
- <span class="sd"> This can be changed through subclassing to change the default</span>
- <span class="sd"> behavior of ``OPTIONS`` responses.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">adapter</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span><span class="o">.</span><span class="n">url_adapter</span>
- <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">adapter</span><span class="p">,</span> <span class="s1">'allowed_methods'</span><span class="p">):</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="n">adapter</span><span class="o">.</span><span class="n">allowed_methods</span><span class="p">()</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># fallback for Werkzeug < 0.7</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">adapter</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">'--'</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">MethodNotAllowed</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">methods</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">valid_methods</span>
- <span class="k">except</span> <span class="n">HTTPException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="k">pass</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">()</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">allow</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">methods</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">rv</span></div>
- <div class="viewcode-block" id="Flask.should_ignore_error"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.should_ignore_error">[docs]</a> <span class="k">def</span> <span class="nf">should_ignore_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="p">):</span>
- <span class="sd">"""This is called to figure out if an error should be ignored</span>
- <span class="sd"> or not as far as the teardown system is concerned. If this</span>
- <span class="sd"> function returns ``True`` then the teardown handlers will not be</span>
- <span class="sd"> passed the error.</span>
- <span class="sd"> .. versionadded:: 0.10</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="kc">False</span></div>
- <div class="viewcode-block" id="Flask.make_response"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.make_response">[docs]</a> <span class="k">def</span> <span class="nf">make_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rv</span><span class="p">):</span>
- <span class="sd">"""Converts the return value from a view function to a real</span>
- <span class="sd"> response object that is an instance of :attr:`response_class`.</span>
- <span class="sd"> The following types are allowed for `rv`:</span>
- <span class="sd"> .. tabularcolumns:: |p{3.5cm}|p{9.5cm}|</span>
- <span class="sd"> ======================= ===========================================</span>
- <span class="sd"> :attr:`response_class` the object is returned unchanged</span>
- <span class="sd"> :class:`str` a response object is created with the</span>
- <span class="sd"> string as body</span>
- <span class="sd"> :class:`unicode` a response object is created with the</span>
- <span class="sd"> string encoded to utf-8 as body</span>
- <span class="sd"> a WSGI function the function is called as WSGI application</span>
- <span class="sd"> and buffered as response object</span>
- <span class="sd"> :class:`tuple` A tuple in the form ``(response, status,</span>
- <span class="sd"> headers)`` or ``(response, headers)``</span>
- <span class="sd"> where `response` is any of the</span>
- <span class="sd"> types defined here, `status` is a string</span>
- <span class="sd"> or an integer and `headers` is a list or</span>
- <span class="sd"> a dictionary with header values.</span>
- <span class="sd"> ======================= ===========================================</span>
- <span class="sd"> :param rv: the return value from the view function</span>
- <span class="sd"> .. versionchanged:: 0.9</span>
- <span class="sd"> Previously a tuple was interpreted as the arguments for the</span>
- <span class="sd"> response object.</span>
- <span class="sd"> """</span>
- <span class="n">status_or_headers</span> <span class="o">=</span> <span class="n">headers</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
- <span class="n">rv</span><span class="p">,</span> <span class="n">status_or_headers</span><span class="p">,</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">rv</span> <span class="o">+</span> <span class="p">(</span><span class="kc">None</span><span class="p">,)</span> <span class="o">*</span> <span class="p">(</span><span class="mi">3</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">rv</span><span class="p">))</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'View function did not return a response'</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">status_or_headers</span><span class="p">,</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
- <span class="n">headers</span><span class="p">,</span> <span class="n">status_or_headers</span> <span class="o">=</span> <span class="n">status_or_headers</span><span class="p">,</span> <span class="kc">None</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">):</span>
- <span class="c1"># When we create a response object directly, we let the constructor</span>
- <span class="c1"># set the headers and status. We do this because there can be</span>
- <span class="c1"># some extra logic involved when creating these objects with</span>
- <span class="c1"># specific values (like default content type selection).</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="p">(</span><span class="n">text_type</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span>
- <span class="n">status</span><span class="o">=</span><span class="n">status_or_headers</span><span class="p">)</span>
- <span class="n">headers</span> <span class="o">=</span> <span class="n">status_or_headers</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">response_class</span><span class="o">.</span><span class="n">force_type</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">environ</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">status_or_headers</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">status_or_headers</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">status_or_headers</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">status_code</span> <span class="o">=</span> <span class="n">status_or_headers</span>
- <span class="k">if</span> <span class="n">headers</span><span class="p">:</span>
- <span class="n">rv</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">rv</span></div>
- <div class="viewcode-block" id="Flask.create_url_adapter"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.create_url_adapter">[docs]</a> <span class="k">def</span> <span class="nf">create_url_adapter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
- <span class="sd">"""Creates a URL adapter for the given request. The URL adapter</span>
- <span class="sd"> is created at a point where the request context is not yet set up</span>
- <span class="sd"> so the request is passed explicitly.</span>
- <span class="sd"> .. versionadded:: 0.6</span>
- <span class="sd"> .. versionchanged:: 0.9</span>
- <span class="sd"> This can now also be called without a request object when the</span>
- <span class="sd"> URL adapter is created for the application context.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">request</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_map</span><span class="o">.</span><span class="n">bind_to_environ</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">environ</span><span class="p">,</span>
- <span class="n">server_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SERVER_NAME'</span><span class="p">])</span>
- <span class="c1"># We need at the very least the server name to be set for this</span>
- <span class="c1"># to work.</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SERVER_NAME'</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_map</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SERVER_NAME'</span><span class="p">],</span>
- <span class="n">script_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'APPLICATION_ROOT'</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">'/'</span><span class="p">,</span>
- <span class="n">url_scheme</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'PREFERRED_URL_SCHEME'</span><span class="p">])</span></div>
- <div class="viewcode-block" id="Flask.inject_url_defaults"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.inject_url_defaults">[docs]</a> <span class="k">def</span> <span class="nf">inject_url_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
- <span class="sd">"""Injects the URL defaults for the given endpoint directly into</span>
- <span class="sd"> the values dictionary passed. This is used internally and</span>
- <span class="sd"> automatically called on URL building.</span>
- <span class="sd"> .. versionadded:: 0.7</span>
- <span class="sd"> """</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_default_functions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">())</span>
- <span class="k">if</span> <span class="s1">'.'</span> <span class="ow">in</span> <span class="n">endpoint</span><span class="p">:</span>
- <span class="n">bp</span> <span class="o">=</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s1">'.'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_default_functions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">bp</span><span class="p">,</span> <span class="p">()))</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">func</span><span class="p">(</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.handle_url_build_error"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.handle_url_build_error">[docs]</a> <span class="k">def</span> <span class="nf">handle_url_build_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
- <span class="sd">"""Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`.</span>
- <span class="sd"> """</span>
- <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_build_error_handlers</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="n">handler</span><span class="p">(</span><span class="n">error</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">rv</span>
- <span class="k">except</span> <span class="n">BuildError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="c1"># make error available outside except block (py3)</span>
- <span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
- <span class="c1"># At this point we want to reraise the exception. If the error is</span>
- <span class="c1"># still the same one we can reraise it with the original traceback,</span>
- <span class="c1"># otherwise we raise it from here.</span>
- <span class="k">if</span> <span class="n">error</span> <span class="ow">is</span> <span class="n">exc_value</span><span class="p">:</span>
- <span class="n">reraise</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
- <span class="k">raise</span> <span class="n">error</span></div>
- <div class="viewcode-block" id="Flask.preprocess_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.preprocess_request">[docs]</a> <span class="k">def</span> <span class="nf">preprocess_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Called before the actual request dispatching and will</span>
- <span class="sd"> call each :meth:`before_request` decorated function, passing no</span>
- <span class="sd"> arguments.</span>
- <span class="sd"> If any of these functions returns a value, it's handled as</span>
- <span class="sd"> if it was the return value from the view and further</span>
- <span class="sd"> request handling is stopped.</span>
- <span class="sd"> This also triggers the :meth:`url_value_processor` functions before</span>
- <span class="sd"> the actual :meth:`before_request` functions are called.</span>
- <span class="sd"> """</span>
- <span class="n">bp</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">blueprint</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">())</span>
- <span class="k">if</span> <span class="n">bp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span><span class="p">[</span><span class="n">bp</span><span class="p">])</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">func</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">endpoint</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">view_args</span><span class="p">)</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">())</span>
- <span class="k">if</span> <span class="n">bp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span><span class="p">[</span><span class="n">bp</span><span class="p">])</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">rv</span> <span class="o">=</span> <span class="n">func</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">rv</span></div>
- <div class="viewcode-block" id="Flask.process_response"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.process_response">[docs]</a> <span class="k">def</span> <span class="nf">process_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
- <span class="sd">"""Can be overridden in order to modify the response object</span>
- <span class="sd"> before it's sent to the WSGI server. By default this will</span>
- <span class="sd"> call all the :meth:`after_request` decorated functions.</span>
- <span class="sd"> .. versionchanged:: 0.5</span>
- <span class="sd"> As of Flask 0.5 the functions registered for after request</span>
- <span class="sd"> execution are called in reverse order of registration.</span>
- <span class="sd"> :param response: a :attr:`response_class` object.</span>
- <span class="sd"> :return: a new response object or the same, has to be an</span>
- <span class="sd"> instance of :attr:`response_class`.</span>
- <span class="sd"> """</span>
- <span class="n">ctx</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span>
- <span class="n">bp</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">blueprint</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">ctx</span><span class="o">.</span><span class="n">_after_request_functions</span>
- <span class="k">if</span> <span class="n">bp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span><span class="p">[</span><span class="n">bp</span><span class="p">]))</span>
- <span class="k">if</span> <span class="kc">None</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span><span class="p">[</span><span class="kc">None</span><span class="p">]))</span>
- <span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">response</span> <span class="o">=</span> <span class="n">handler</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_interface</span><span class="o">.</span><span class="n">is_null_session</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">session</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">save_session</span><span class="p">(</span><span class="n">ctx</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">response</span></div>
- <div class="viewcode-block" id="Flask.do_teardown_request"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.do_teardown_request">[docs]</a> <span class="k">def</span> <span class="nf">do_teardown_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">):</span>
- <span class="sd">"""Called after the actual request dispatching and will</span>
- <span class="sd"> call every as :meth:`teardown_request` decorated function. This is</span>
- <span class="sd"> not actually called by the :class:`Flask` object itself but is always</span>
- <span class="sd"> triggered when the request context is popped. That way we have a</span>
- <span class="sd"> tighter control over certain resources under testing environments.</span>
- <span class="sd"> .. versionchanged:: 0.9</span>
- <span class="sd"> Added the `exc` argument. Previously this was always using the</span>
- <span class="sd"> current exception information.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">exc</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
- <span class="n">exc</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">()))</span>
- <span class="n">bp</span> <span class="o">=</span> <span class="n">_request_ctx_stack</span><span class="o">.</span><span class="n">top</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">blueprint</span>
- <span class="k">if</span> <span class="n">bp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">bp</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span><span class="p">:</span>
- <span class="n">funcs</span> <span class="o">=</span> <span class="n">chain</span><span class="p">(</span><span class="n">funcs</span><span class="p">,</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span><span class="p">[</span><span class="n">bp</span><span class="p">]))</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
- <span class="n">func</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
- <span class="n">request_tearing_down</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="o">=</span><span class="n">exc</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.do_teardown_appcontext"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.do_teardown_appcontext">[docs]</a> <span class="k">def</span> <span class="nf">do_teardown_appcontext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">):</span>
- <span class="sd">"""Called when an application context is popped. This works pretty</span>
- <span class="sd"> much the same as :meth:`do_teardown_request` but for the application</span>
- <span class="sd"> context.</span>
- <span class="sd"> .. versionadded:: 0.9</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">exc</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
- <span class="n">exc</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
- <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">teardown_appcontext_funcs</span><span class="p">):</span>
- <span class="n">func</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
- <span class="n">appcontext_tearing_down</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc</span><span class="o">=</span><span class="n">exc</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.app_context"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.app_context">[docs]</a> <span class="k">def</span> <span class="nf">app_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""Binds the application only. For as long as the application is bound</span>
- <span class="sd"> to the current context the :data:`flask.current_app` points to that</span>
- <span class="sd"> application. An application context is automatically created when a</span>
- <span class="sd"> request context is pushed if necessary.</span>
- <span class="sd"> Example usage::</span>
- <span class="sd"> with app.app_context():</span>
- <span class="sd"> ...</span>
- <span class="sd"> .. versionadded:: 0.9</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">AppContext</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.request_context"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.request_context">[docs]</a> <span class="k">def</span> <span class="nf">request_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">):</span>
- <span class="sd">"""Creates a :class:`~flask.ctx.RequestContext` from the given</span>
- <span class="sd"> environment and binds it to the current context. This must be used in</span>
- <span class="sd"> combination with the ``with`` statement because the request is only bound</span>
- <span class="sd"> to the current context for the duration of the ``with`` block.</span>
- <span class="sd"> Example usage::</span>
- <span class="sd"> with app.request_context(environ):</span>
- <span class="sd"> do_something_with(request)</span>
- <span class="sd"> The object returned can also be used without the ``with`` statement</span>
- <span class="sd"> which is useful for working in the shell. The example above is</span>
- <span class="sd"> doing exactly the same as this code::</span>
- <span class="sd"> ctx = app.request_context(environ)</span>
- <span class="sd"> ctx.push()</span>
- <span class="sd"> try:</span>
- <span class="sd"> do_something_with(request)</span>
- <span class="sd"> finally:</span>
- <span class="sd"> ctx.pop()</span>
- <span class="sd"> .. versionchanged:: 0.3</span>
- <span class="sd"> Added support for non-with statement usage and ``with`` statement</span>
- <span class="sd"> is now passed the ctx object.</span>
- <span class="sd"> :param environ: a WSGI environment</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">RequestContext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">)</span></div>
- <div class="viewcode-block" id="Flask.test_request_context"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.test_request_context">[docs]</a> <span class="k">def</span> <span class="nf">test_request_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="sd">"""Creates a WSGI environment from the given values (see</span>
- <span class="sd"> :class:`werkzeug.test.EnvironBuilder` for more information, this</span>
- <span class="sd"> function accepts the same arguments).</span>
- <span class="sd"> """</span>
- <span class="kn">from</span> <span class="nn">flask.testing</span> <span class="k">import</span> <span class="n">make_test_environ_builder</span>
- <span class="n">builder</span> <span class="o">=</span> <span class="n">make_test_environ_builder</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request_context</span><span class="p">(</span><span class="n">builder</span><span class="o">.</span><span class="n">get_environ</span><span class="p">())</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="n">builder</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
- <div class="viewcode-block" id="Flask.wsgi_app"><a class="viewcode-back" href="../../flask/flask.html#flask.app.Flask.wsgi_app">[docs]</a> <span class="k">def</span> <span class="nf">wsgi_app</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">):</span>
- <span class="sd">"""The actual WSGI application. This is not implemented in</span>
- <span class="sd"> `__call__` so that middlewares can be applied without losing a</span>
- <span class="sd"> reference to the class. So instead of doing this::</span>
- <span class="sd"> app = MyMiddleware(app)</span>
- <span class="sd"> It's a better idea to do this instead::</span>
- <span class="sd"> app.wsgi_app = MyMiddleware(app.wsgi_app)</span>
- <span class="sd"> Then you still have the original application object around and</span>
- <span class="sd"> can continue to call methods on it.</span>
- <span class="sd"> .. versionchanged:: 0.7</span>
- <span class="sd"> The behavior of the before and after request callbacks was changed</span>
- <span class="sd"> under error conditions and a new callback was added that will</span>
- <span class="sd"> always execute at the end of the request, independent on if an</span>
- <span class="sd"> error occurred or not. See :ref:`callbacks-and-errors`.</span>
- <span class="sd"> :param environ: a WSGI environment</span>
- <span class="sd"> :param start_response: a callable accepting a status code,</span>
- <span class="sd"> a list of headers and an optional</span>
- <span class="sd"> exception context to start the response</span>
- <span class="sd"> """</span>
- <span class="n">ctx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request_context</span><span class="p">(</span><span class="n">environ</span><span class="p">)</span>
- <span class="n">ctx</span><span class="o">.</span><span class="n">push</span><span class="p">()</span>
- <span class="n">error</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">full_dispatch_request</span><span class="p">()</span>
- <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
- <span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">make_response</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_exception</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
- <span class="k">return</span> <span class="n">response</span><span class="p">(</span><span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">)</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">should_ignore_error</span><span class="p">(</span><span class="n">error</span><span class="p">):</span>
- <span class="n">error</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">ctx</span><span class="o">.</span><span class="n">auto_pop</span><span class="p">(</span><span class="n">error</span><span class="p">)</span></div>
- <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">):</span>
- <span class="sd">"""Shortcut for :attr:`wsgi_app`."""</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">wsgi_app</span><span class="p">(</span><span class="n">environ</span><span class="p">,</span> <span class="n">start_response</span><span class="p">)</span>
- <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s1">'<</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">>'</span> <span class="o">%</span> <span class="p">(</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
- <span class="p">)</span></div>
- </pre></div>
- </div>
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
- <h3>Related Topics</h3>
- <ul>
- <li><a href="../../index.html">Documentation overview</a><ul>
- <li><a href="../index.html">Module code</a><ul>
- </ul></li>
- </ul></li>
- </ul>
- </div>
- <div id="searchbox" style="display: none" role="search">
- <h3>Quick search</h3>
- <form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
- </div>
- <script type="text/javascript">$('#searchbox').show(0);</script>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="footer">
- ©2016, Author.
-
- |
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.4.8</a>
- & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
-
- </div>
-
-
- </body>
- </html>
|