app.html 216 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>flask.app &#8212; proxypool documentation</title>
  7. <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
  8. <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: '../../',
  12. VERSION: '',
  13. COLLAPSE_INDEX: false,
  14. FILE_SUFFIX: '.html',
  15. HAS_SOURCE: true
  16. };
  17. </script>
  18. <script type="text/javascript" src="../../_static/jquery.js"></script>
  19. <script type="text/javascript" src="../../_static/underscore.js"></script>
  20. <script type="text/javascript" src="../../_static/doctools.js"></script>
  21. <link rel="index" title="Index" href="../../genindex.html" />
  22. <link rel="search" title="Search" href="../../search.html" />
  23. <link rel="top" title="proxypool documentation" href="../../index.html" />
  24. <link rel="up" title="Module code" href="../index.html" />
  25. <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
  26. <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
  27. </head>
  28. <body role="document">
  29. <div class="document">
  30. <div class="documentwrapper">
  31. <div class="bodywrapper">
  32. <div class="body" role="main">
  33. <h1>Source code for flask.app</h1><div class="highlight"><pre>
  34. <span></span><span class="c1"># -*- coding: utf-8 -*-</span>
  35. <span class="sd">&quot;&quot;&quot;</span>
  36. <span class="sd"> flask.app</span>
  37. <span class="sd"> ~~~~~~~~~</span>
  38. <span class="sd"> This module implements the central WSGI application object.</span>
  39. <span class="sd"> :copyright: (c) 2015 by Armin Ronacher.</span>
  40. <span class="sd"> :license: BSD, see LICENSE for more details.</span>
  41. <span class="sd">&quot;&quot;&quot;</span>
  42. <span class="kn">import</span> <span class="nn">os</span>
  43. <span class="kn">import</span> <span class="nn">sys</span>
  44. <span class="kn">from</span> <span class="nn">threading</span> <span class="k">import</span> <span class="n">Lock</span>
  45. <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span>
  46. <span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">chain</span>
  47. <span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">update_wrapper</span>
  48. <span class="kn">from</span> <span class="nn">collections</span> <span class="k">import</span> <span class="n">deque</span>
  49. <span class="kn">from</span> <span class="nn">werkzeug.datastructures</span> <span class="k">import</span> <span class="n">ImmutableDict</span>
  50. <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>
  51. <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> \
  52. <span class="n">MethodNotAllowed</span><span class="p">,</span> <span class="n">BadRequest</span><span class="p">,</span> <span class="n">default_exceptions</span>
  53. <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> \
  54. <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> \
  55. <span class="n">get_debug_flag</span>
  56. <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>
  57. <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>
  58. <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>
  59. <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>
  60. <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>
  61. <span class="kn">from</span> <span class="nn">.sessions</span> <span class="k">import</span> <span class="n">SecureCookieSessionInterface</span>
  62. <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> \
  63. <span class="n">_default_template_ctx_processor</span>
  64. <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> \
  65. <span class="n">request_tearing_down</span><span class="p">,</span> <span class="n">appcontext_tearing_down</span>
  66. <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>
  67. <span class="c1"># a lock used for logger initialization</span>
  68. <span class="n">_logger_lock</span> <span class="o">=</span> <span class="n">Lock</span><span class="p">()</span>
  69. <span class="c1"># a singleton sentinel value for parameter defaults</span>
  70. <span class="n">_sentinel</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
  71. <span class="k">def</span> <span class="nf">_make_timedelta</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
  72. <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>
  73. <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>
  74. <span class="k">return</span> <span class="n">value</span>
  75. <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>
  76. <span class="sd">&quot;&quot;&quot;Wraps a method so that it performs a check in debug mode if the</span>
  77. <span class="sd"> first request was already handled.</span>
  78. <span class="sd"> &quot;&quot;&quot;</span>
  79. <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>
  80. <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>
  81. <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="s1">&#39;A setup function was called after the &#39;</span>
  82. <span class="s1">&#39;first request was handled. This usually indicates a bug &#39;</span>
  83. <span class="s1">&#39;in the application where a module was not imported &#39;</span>
  84. <span class="s1">&#39;and decorators or other functionality was called too late.</span><span class="se">\n</span><span class="s1">&#39;</span>
  85. <span class="s1">&#39;To fix this make sure to import all your view modules, &#39;</span>
  86. <span class="s1">&#39;database models and everything related at a central place &#39;</span>
  87. <span class="s1">&#39;before the application starts serving requests.&#39;</span><span class="p">)</span>
  88. <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>
  89. <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>
  90. <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>
  91. <span class="sd">&quot;&quot;&quot;The flask object implements a WSGI application and acts as the central</span>
  92. <span class="sd"> object. It is passed the name of the module or package of the</span>
  93. <span class="sd"> application. Once it is created it will act as a central registry for</span>
  94. <span class="sd"> the view functions, the URL rules, template configuration and much more.</span>
  95. <span class="sd"> The name of the package is used to resolve resources from inside the</span>
  96. <span class="sd"> package or the folder the module is contained in depending on if the</span>
  97. <span class="sd"> package parameter resolves to an actual python package (a folder with</span>
  98. <span class="sd"> an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file).</span>
  99. <span class="sd"> For more information about resource loading, see :func:`open_resource`.</span>
  100. <span class="sd"> Usually you create a :class:`Flask` instance in your main module or</span>
  101. <span class="sd"> in the :file:`__init__.py` file of your package like this::</span>
  102. <span class="sd"> from flask import Flask</span>
  103. <span class="sd"> app = Flask(__name__)</span>
  104. <span class="sd"> .. admonition:: About the First Parameter</span>
  105. <span class="sd"> The idea of the first parameter is to give Flask an idea of what</span>
  106. <span class="sd"> belongs to your application. This name is used to find resources</span>
  107. <span class="sd"> on the filesystem, can be used by extensions to improve debugging</span>
  108. <span class="sd"> information and a lot more.</span>
  109. <span class="sd"> So it&#39;s important what you provide there. If you are using a single</span>
  110. <span class="sd"> module, `__name__` is always the correct value. If you however are</span>
  111. <span class="sd"> using a package, it&#39;s usually recommended to hardcode the name of</span>
  112. <span class="sd"> your package there.</span>
  113. <span class="sd"> For example if your application is defined in :file:`yourapplication/app.py`</span>
  114. <span class="sd"> you should create it with one of the two versions below::</span>
  115. <span class="sd"> app = Flask(&#39;yourapplication&#39;)</span>
  116. <span class="sd"> app = Flask(__name__.split(&#39;.&#39;)[0])</span>
  117. <span class="sd"> Why is that? The application will work even with `__name__`, thanks</span>
  118. <span class="sd"> to how resources are looked up. However it will make debugging more</span>
  119. <span class="sd"> painful. Certain extensions can make assumptions based on the</span>
  120. <span class="sd"> import name of your application. For example the Flask-SQLAlchemy</span>
  121. <span class="sd"> extension will look for the code in your application that triggered</span>
  122. <span class="sd"> an SQL query in debug mode. If the import name is not properly set</span>
  123. <span class="sd"> up, that debugging information is lost. (For example it would only</span>
  124. <span class="sd"> pick up SQL queries in `yourapplication.app` and not</span>
  125. <span class="sd"> `yourapplication.views.frontend`)</span>
  126. <span class="sd"> .. versionadded:: 0.7</span>
  127. <span class="sd"> The `static_url_path`, `static_folder`, and `template_folder`</span>
  128. <span class="sd"> parameters were added.</span>
  129. <span class="sd"> .. versionadded:: 0.8</span>
  130. <span class="sd"> The `instance_path` and `instance_relative_config` parameters were</span>
  131. <span class="sd"> added.</span>
  132. <span class="sd"> .. versionadded:: 0.11</span>
  133. <span class="sd"> The `root_path` parameter was added.</span>
  134. <span class="sd"> :param import_name: the name of the application package</span>
  135. <span class="sd"> :param static_url_path: can be used to specify a different path for the</span>
  136. <span class="sd"> static files on the web. Defaults to the name</span>
  137. <span class="sd"> of the `static_folder` folder.</span>
  138. <span class="sd"> :param static_folder: the folder with static files that should be served</span>
  139. <span class="sd"> at `static_url_path`. Defaults to the ``&#39;static&#39;``</span>
  140. <span class="sd"> folder in the root path of the application.</span>
  141. <span class="sd"> :param template_folder: the folder that contains the templates that should</span>
  142. <span class="sd"> be used by the application. Defaults to</span>
  143. <span class="sd"> ``&#39;templates&#39;`` folder in the root path of the</span>
  144. <span class="sd"> application.</span>
  145. <span class="sd"> :param instance_path: An alternative instance path for the application.</span>
  146. <span class="sd"> By default the folder ``&#39;instance&#39;`` next to the</span>
  147. <span class="sd"> package or module is assumed to be the instance</span>
  148. <span class="sd"> path.</span>
  149. <span class="sd"> :param instance_relative_config: if set to ``True`` relative filenames</span>
  150. <span class="sd"> for loading the config are assumed to</span>
  151. <span class="sd"> be relative to the instance path instead</span>
  152. <span class="sd"> of the application root.</span>
  153. <span class="sd"> :param root_path: Flask by default will automatically calculate the path</span>
  154. <span class="sd"> to the root of the application. In certain situations</span>
  155. <span class="sd"> this cannot be achieved (for instance if the package</span>
  156. <span class="sd"> is a Python 3 namespace package) and needs to be</span>
  157. <span class="sd"> manually defined.</span>
  158. <span class="sd"> &quot;&quot;&quot;</span>
  159. <span class="c1">#: The class that is used for request objects. See :class:`~flask.Request`</span>
  160. <span class="c1">#: for more information.</span>
  161. <span class="n">request_class</span> <span class="o">=</span> <span class="n">Request</span>
  162. <span class="c1">#: The class that is used for response objects. See</span>
  163. <span class="c1">#: :class:`~flask.Response` for more information.</span>
  164. <span class="n">response_class</span> <span class="o">=</span> <span class="n">Response</span>
  165. <span class="c1">#: The class that is used for the Jinja environment.</span>
  166. <span class="c1">#:</span>
  167. <span class="c1">#: .. versionadded:: 0.11</span>
  168. <span class="n">jinja_environment</span> <span class="o">=</span> <span class="n">Environment</span>
  169. <span class="c1">#: The class that is used for the :data:`~flask.g` instance.</span>
  170. <span class="c1">#:</span>
  171. <span class="c1">#: Example use cases for a custom class:</span>
  172. <span class="c1">#:</span>
  173. <span class="c1">#: 1. Store arbitrary attributes on flask.g.</span>
  174. <span class="c1">#: 2. Add a property for lazy per-request database connectors.</span>
  175. <span class="c1">#: 3. Return None instead of AttributeError on unexpected attributes.</span>
  176. <span class="c1">#: 4. Raise exception if an unexpected attr is set, a &quot;controlled&quot; flask.g.</span>
  177. <span class="c1">#:</span>
  178. <span class="c1">#: In Flask 0.9 this property was called `request_globals_class` but it</span>
  179. <span class="c1">#: was changed in 0.10 to :attr:`app_ctx_globals_class` because the</span>
  180. <span class="c1">#: flask.g object is now application context scoped.</span>
  181. <span class="c1">#:</span>
  182. <span class="c1">#: .. versionadded:: 0.10</span>
  183. <span class="n">app_ctx_globals_class</span> <span class="o">=</span> <span class="n">_AppCtxGlobals</span>
  184. <span class="c1"># Backwards compatibility support</span>
  185. <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>
  186. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">app_ctx_globals_class</span>
  187. <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>
  188. <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
  189. <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">&#39;request_globals_class attribute is now &#39;</span>
  190. <span class="s1">&#39;called app_ctx_globals_class&#39;</span><span class="p">))</span>
  191. <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>
  192. <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>
  193. <span class="n">_set_request_globals_class</span><span class="p">)</span>
  194. <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>
  195. <span class="c1">#: The class that is used for the ``config`` attribute of this app.</span>
  196. <span class="c1">#: Defaults to :class:`~flask.Config`.</span>
  197. <span class="c1">#:</span>
  198. <span class="c1">#: Example use cases for a custom class:</span>
  199. <span class="c1">#:</span>
  200. <span class="c1">#: 1. Default values for certain config options.</span>
  201. <span class="c1">#: 2. Access to config values through attributes in addition to keys.</span>
  202. <span class="c1">#:</span>
  203. <span class="c1">#: .. versionadded:: 0.11</span>
  204. <span class="n">config_class</span> <span class="o">=</span> <span class="n">Config</span>
  205. <span class="c1">#: The debug flag. Set this to ``True`` to enable debugging of the</span>
  206. <span class="c1">#: application. In debug mode the debugger will kick in when an unhandled</span>
  207. <span class="c1">#: exception occurs and the integrated server will automatically reload</span>
  208. <span class="c1">#: the application if changes in the code are detected.</span>
  209. <span class="c1">#:</span>
  210. <span class="c1">#: This attribute can also be configured from the config with the ``DEBUG``</span>
  211. <span class="c1">#: configuration key. Defaults to ``False``.</span>
  212. <span class="n">debug</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;DEBUG&#39;</span><span class="p">)</span>
  213. <span class="c1">#: The testing flag. Set this to ``True`` to enable the test mode of</span>
  214. <span class="c1">#: Flask extensions (and in the future probably also Flask itself).</span>
  215. <span class="c1">#: For example this might activate unittest helpers that have an</span>
  216. <span class="c1">#: additional runtime cost which should not be enabled by default.</span>
  217. <span class="c1">#:</span>
  218. <span class="c1">#: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the</span>
  219. <span class="c1">#: default it&#39;s implicitly enabled.</span>
  220. <span class="c1">#:</span>
  221. <span class="c1">#: This attribute can also be configured from the config with the</span>
  222. <span class="c1">#: ``TESTING`` configuration key. Defaults to ``False``.</span>
  223. <span class="n">testing</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;TESTING&#39;</span><span class="p">)</span>
  224. <span class="c1">#: If a secret key is set, cryptographic components can use this to</span>
  225. <span class="c1">#: sign cookies and other things. Set this to a complex random value</span>
  226. <span class="c1">#: when you want to use the secure cookie for instance.</span>
  227. <span class="c1">#:</span>
  228. <span class="c1">#: This attribute can also be configured from the config with the</span>
  229. <span class="c1">#: ``SECRET_KEY`` configuration key. Defaults to ``None``.</span>
  230. <span class="n">secret_key</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;SECRET_KEY&#39;</span><span class="p">)</span>
  231. <span class="c1">#: The secure cookie uses this for the name of the session cookie.</span>
  232. <span class="c1">#:</span>
  233. <span class="c1">#: This attribute can also be configured from the config with the</span>
  234. <span class="c1">#: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``&#39;session&#39;``</span>
  235. <span class="n">session_cookie_name</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;SESSION_COOKIE_NAME&#39;</span><span class="p">)</span>
  236. <span class="c1">#: A :class:`~datetime.timedelta` which is used to set the expiration</span>
  237. <span class="c1">#: date of a permanent session. The default is 31 days which makes a</span>
  238. <span class="c1">#: permanent session survive for roughly one month.</span>
  239. <span class="c1">#:</span>
  240. <span class="c1">#: This attribute can also be configured from the config with the</span>
  241. <span class="c1">#: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to</span>
  242. <span class="c1">#: ``timedelta(days=31)``</span>
  243. <span class="n">permanent_session_lifetime</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;PERMANENT_SESSION_LIFETIME&#39;</span><span class="p">,</span>
  244. <span class="n">get_converter</span><span class="o">=</span><span class="n">_make_timedelta</span><span class="p">)</span>
  245. <span class="c1">#: A :class:`~datetime.timedelta` which is used as default cache_timeout</span>
  246. <span class="c1">#: for the :func:`send_file` functions. The default is 12 hours.</span>
  247. <span class="c1">#:</span>
  248. <span class="c1">#: This attribute can also be configured from the config with the</span>
  249. <span class="c1">#: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration</span>
  250. <span class="c1">#: variable can also be set with an integer value used as seconds.</span>
  251. <span class="c1">#: Defaults to ``timedelta(hours=12)``</span>
  252. <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">&#39;SEND_FILE_MAX_AGE_DEFAULT&#39;</span><span class="p">,</span>
  253. <span class="n">get_converter</span><span class="o">=</span><span class="n">_make_timedelta</span><span class="p">)</span>
  254. <span class="c1">#: Enable this if you want to use the X-Sendfile feature. Keep in</span>
  255. <span class="c1">#: mind that the server has to support this. This only affects files</span>
  256. <span class="c1">#: sent with the :func:`send_file` method.</span>
  257. <span class="c1">#:</span>
  258. <span class="c1">#: .. versionadded:: 0.2</span>
  259. <span class="c1">#:</span>
  260. <span class="c1">#: This attribute can also be configured from the config with the</span>
  261. <span class="c1">#: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``.</span>
  262. <span class="n">use_x_sendfile</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;USE_X_SENDFILE&#39;</span><span class="p">)</span>
  263. <span class="c1">#: The name of the logger to use. By default the logger name is the</span>
  264. <span class="c1">#: package name passed to the constructor.</span>
  265. <span class="c1">#:</span>
  266. <span class="c1">#: .. versionadded:: 0.4</span>
  267. <span class="n">logger_name</span> <span class="o">=</span> <span class="n">ConfigAttribute</span><span class="p">(</span><span class="s1">&#39;LOGGER_NAME&#39;</span><span class="p">)</span>
  268. <span class="c1">#: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`.</span>
  269. <span class="c1">#:</span>
  270. <span class="c1">#: .. versionadded:: 0.10</span>
  271. <span class="n">json_encoder</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span>
  272. <span class="c1">#: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`.</span>
  273. <span class="c1">#:</span>
  274. <span class="c1">#: .. versionadded:: 0.10</span>
  275. <span class="n">json_decoder</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecoder</span>
  276. <span class="c1">#: Options that are passed directly to the Jinja2 environment.</span>
  277. <span class="n">jinja_options</span> <span class="o">=</span> <span class="n">ImmutableDict</span><span class="p">(</span>
  278. <span class="n">extensions</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;jinja2.ext.autoescape&#39;</span><span class="p">,</span> <span class="s1">&#39;jinja2.ext.with_&#39;</span><span class="p">]</span>
  279. <span class="p">)</span>
  280. <span class="c1">#: Default configuration parameters.</span>
  281. <span class="n">default_config</span> <span class="o">=</span> <span class="n">ImmutableDict</span><span class="p">({</span>
  282. <span class="s1">&#39;DEBUG&#39;</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>
  283. <span class="s1">&#39;TESTING&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  284. <span class="s1">&#39;PROPAGATE_EXCEPTIONS&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  285. <span class="s1">&#39;PRESERVE_CONTEXT_ON_EXCEPTION&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  286. <span class="s1">&#39;SECRET_KEY&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  287. <span class="s1">&#39;PERMANENT_SESSION_LIFETIME&#39;</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>
  288. <span class="s1">&#39;USE_X_SENDFILE&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  289. <span class="s1">&#39;LOGGER_NAME&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  290. <span class="s1">&#39;LOGGER_HANDLER_POLICY&#39;</span><span class="p">:</span> <span class="s1">&#39;always&#39;</span><span class="p">,</span>
  291. <span class="s1">&#39;SERVER_NAME&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  292. <span class="s1">&#39;APPLICATION_ROOT&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  293. <span class="s1">&#39;SESSION_COOKIE_NAME&#39;</span><span class="p">:</span> <span class="s1">&#39;session&#39;</span><span class="p">,</span>
  294. <span class="s1">&#39;SESSION_COOKIE_DOMAIN&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  295. <span class="s1">&#39;SESSION_COOKIE_PATH&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  296. <span class="s1">&#39;SESSION_COOKIE_HTTPONLY&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
  297. <span class="s1">&#39;SESSION_COOKIE_SECURE&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  298. <span class="s1">&#39;SESSION_REFRESH_EACH_REQUEST&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
  299. <span class="s1">&#39;MAX_CONTENT_LENGTH&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  300. <span class="s1">&#39;SEND_FILE_MAX_AGE_DEFAULT&#39;</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>
  301. <span class="s1">&#39;TRAP_BAD_REQUEST_ERRORS&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  302. <span class="s1">&#39;TRAP_HTTP_EXCEPTIONS&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  303. <span class="s1">&#39;EXPLAIN_TEMPLATE_LOADING&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
  304. <span class="s1">&#39;PREFERRED_URL_SCHEME&#39;</span><span class="p">:</span> <span class="s1">&#39;http&#39;</span><span class="p">,</span>
  305. <span class="s1">&#39;JSON_AS_ASCII&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
  306. <span class="s1">&#39;JSON_SORT_KEYS&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
  307. <span class="s1">&#39;JSONIFY_PRETTYPRINT_REGULAR&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
  308. <span class="s1">&#39;JSONIFY_MIMETYPE&#39;</span><span class="p">:</span> <span class="s1">&#39;application/json&#39;</span><span class="p">,</span>
  309. <span class="s1">&#39;TEMPLATES_AUTO_RELOAD&#39;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
  310. <span class="p">})</span>
  311. <span class="c1">#: The rule object to use for URL rules created. This is used by</span>
  312. <span class="c1">#: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`.</span>
  313. <span class="c1">#:</span>
  314. <span class="c1">#: .. versionadded:: 0.7</span>
  315. <span class="n">url_rule_class</span> <span class="o">=</span> <span class="n">Rule</span>
  316. <span class="c1">#: the test client that is used with when `test_client` is used.</span>
  317. <span class="c1">#:</span>
  318. <span class="c1">#: .. versionadded:: 0.7</span>
  319. <span class="n">test_client_class</span> <span class="o">=</span> <span class="kc">None</span>
  320. <span class="c1">#: the session interface to use. By default an instance of</span>
  321. <span class="c1">#: :class:`~flask.sessions.SecureCookieSessionInterface` is used here.</span>
  322. <span class="c1">#:</span>
  323. <span class="c1">#: .. versionadded:: 0.8</span>
  324. <span class="n">session_interface</span> <span class="o">=</span> <span class="n">SecureCookieSessionInterface</span><span class="p">()</span>
  325. <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>
  326. <span class="n">static_folder</span><span class="o">=</span><span class="s1">&#39;static&#39;</span><span class="p">,</span> <span class="n">template_folder</span><span class="o">=</span><span class="s1">&#39;templates&#39;</span><span class="p">,</span>
  327. <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>
  328. <span class="n">root_path</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  329. <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>
  330. <span class="n">template_folder</span><span class="o">=</span><span class="n">template_folder</span><span class="p">,</span>
  331. <span class="n">root_path</span><span class="o">=</span><span class="n">root_path</span><span class="p">)</span>
  332. <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>
  333. <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
  334. <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">&#39;static_path is now called &#39;</span>
  335. <span class="s1">&#39;static_url_path&#39;</span><span class="p">),</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
  336. <span class="n">static_url_path</span> <span class="o">=</span> <span class="n">static_path</span>
  337. <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>
  338. <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>
  339. <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>
  340. <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>
  341. <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>
  342. <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>
  343. <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>
  344. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;If an instance path is provided it must be &#39;</span>
  345. <span class="s1">&#39;absolute. A relative path was given instead.&#39;</span><span class="p">)</span>
  346. <span class="c1">#: Holds the path to the instance folder.</span>
  347. <span class="c1">#:</span>
  348. <span class="c1">#: .. versionadded:: 0.8</span>
  349. <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>
  350. <span class="c1">#: The configuration dictionary as :class:`Config`. This behaves</span>
  351. <span class="c1">#: exactly like a regular dictionary but supports additional methods</span>
  352. <span class="c1">#: to load a config from files.</span>
  353. <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>
  354. <span class="c1"># Prepare the deferred setup of the logger.</span>
  355. <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="o">=</span> <span class="kc">None</span>
  356. <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>
  357. <span class="c1">#: A dictionary of all view functions registered. The keys will</span>
  358. <span class="c1">#: be function names which are also used to generate URLs and</span>
  359. <span class="c1">#: the values are the function objects themselves.</span>
  360. <span class="c1">#: To register a view function, use the :meth:`route` decorator.</span>
  361. <span class="bp">self</span><span class="o">.</span><span class="n">view_functions</span> <span class="o">=</span> <span class="p">{}</span>
  362. <span class="c1"># support for the now deprecated `error_handlers` attribute. The</span>
  363. <span class="c1"># :attr:`error_handler_spec` shall be used now.</span>
  364. <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span> <span class="o">=</span> <span class="p">{}</span>
  365. <span class="c1">#: A dictionary of all registered error handlers. The key is ``None``</span>
  366. <span class="c1">#: for error handlers active on the application, otherwise the key is</span>
  367. <span class="c1">#: the name of the blueprint. Each key points to another dictionary</span>
  368. <span class="c1">#: where the key is the status code of the http exception. The</span>
  369. <span class="c1">#: special key ``None`` points to a list of tuples where the first item</span>
  370. <span class="c1">#: is the class for the instance check and the second the error handler</span>
  371. <span class="c1">#: function.</span>
  372. <span class="c1">#:</span>
  373. <span class="c1">#: To register a error handler, use the :meth:`errorhandler`</span>
  374. <span class="c1">#: decorator.</span>
  375. <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>
  376. <span class="c1">#: A list of functions that are called when :meth:`url_for` raises a</span>
  377. <span class="c1">#: :exc:`~werkzeug.routing.BuildError`. Each function registered here</span>
  378. <span class="c1">#: is called with `error`, `endpoint` and `values`. If a function</span>
  379. <span class="c1">#: returns ``None`` or raises a :exc:`BuildError` the next function is</span>
  380. <span class="c1">#: tried.</span>
  381. <span class="c1">#:</span>
  382. <span class="c1">#: .. versionadded:: 0.9</span>
  383. <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>
  384. <span class="c1">#: A dictionary with lists of functions that should be called at the</span>
  385. <span class="c1">#: beginning of the request. The key of the dictionary is the name of</span>
  386. <span class="c1">#: the blueprint this function is active for, ``None`` for all requests.</span>
  387. <span class="c1">#: This can for example be used to open database connections or</span>
  388. <span class="c1">#: getting hold of the currently logged in user. To register a</span>
  389. <span class="c1">#: function here, use the :meth:`before_request` decorator.</span>
  390. <span class="bp">self</span><span class="o">.</span><span class="n">before_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
  391. <span class="c1">#: A lists of functions that should be called at the beginning of the</span>
  392. <span class="c1">#: first request to this instance. To register a function here, use</span>
  393. <span class="c1">#: the :meth:`before_first_request` decorator.</span>
  394. <span class="c1">#:</span>
  395. <span class="c1">#: .. versionadded:: 0.8</span>
  396. <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>
  397. <span class="c1">#: A dictionary with lists of functions that should be called after</span>
  398. <span class="c1">#: each request. The key of the dictionary is the name of the blueprint</span>
  399. <span class="c1">#: this function is active for, ``None`` for all requests. This can for</span>
  400. <span class="c1">#: example be used to close database connections. To register a function</span>
  401. <span class="c1">#: here, use the :meth:`after_request` decorator.</span>
  402. <span class="bp">self</span><span class="o">.</span><span class="n">after_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
  403. <span class="c1">#: A dictionary with lists of functions that are called after</span>
  404. <span class="c1">#: each request, even if an exception has occurred. The key of the</span>
  405. <span class="c1">#: dictionary is the name of the blueprint this function is active for,</span>
  406. <span class="c1">#: ``None`` for all requests. These functions are not allowed to modify</span>
  407. <span class="c1">#: the request, and their return values are ignored. If an exception</span>
  408. <span class="c1">#: occurred while processing the request, it gets passed to each</span>
  409. <span class="c1">#: teardown_request function. To register a function here, use the</span>
  410. <span class="c1">#: :meth:`teardown_request` decorator.</span>
  411. <span class="c1">#:</span>
  412. <span class="c1">#: .. versionadded:: 0.7</span>
  413. <span class="bp">self</span><span class="o">.</span><span class="n">teardown_request_funcs</span> <span class="o">=</span> <span class="p">{}</span>
  414. <span class="c1">#: A list of functions that are called when the application context</span>
  415. <span class="c1">#: is destroyed. Since the application context is also torn down</span>
  416. <span class="c1">#: if the request ends this is the place to store code that disconnects</span>
  417. <span class="c1">#: from databases.</span>
  418. <span class="c1">#:</span>
  419. <span class="c1">#: .. versionadded:: 0.9</span>
  420. <span class="bp">self</span><span class="o">.</span><span class="n">teardown_appcontext_funcs</span> <span class="o">=</span> <span class="p">[]</span>
  421. <span class="c1">#: A dictionary with lists of functions that can be used as URL</span>
  422. <span class="c1">#: value processor functions. Whenever a URL is built these functions</span>
  423. <span class="c1">#: are called to modify the dictionary of values in place. The key</span>
  424. <span class="c1">#: ``None`` here is used for application wide</span>
  425. <span class="c1">#: callbacks, otherwise the key is the name of the blueprint.</span>
  426. <span class="c1">#: Each of these functions has the chance to modify the dictionary</span>
  427. <span class="c1">#:</span>
  428. <span class="c1">#: .. versionadded:: 0.7</span>
  429. <span class="bp">self</span><span class="o">.</span><span class="n">url_value_preprocessors</span> <span class="o">=</span> <span class="p">{}</span>
  430. <span class="c1">#: A dictionary with lists of functions that can be used as URL value</span>
  431. <span class="c1">#: preprocessors. The key ``None`` here is used for application wide</span>
  432. <span class="c1">#: callbacks, otherwise the key is the name of the blueprint.</span>
  433. <span class="c1">#: Each of these functions has the chance to modify the dictionary</span>
  434. <span class="c1">#: of URL values before they are used as the keyword arguments of the</span>
  435. <span class="c1">#: view function. For each function registered this one should also</span>
  436. <span class="c1">#: provide a :meth:`url_defaults` function that adds the parameters</span>
  437. <span class="c1">#: automatically again that were removed that way.</span>
  438. <span class="c1">#:</span>
  439. <span class="c1">#: .. versionadded:: 0.7</span>
  440. <span class="bp">self</span><span class="o">.</span><span class="n">url_default_functions</span> <span class="o">=</span> <span class="p">{}</span>
  441. <span class="c1">#: A dictionary with list of functions that are called without argument</span>
  442. <span class="c1">#: to populate the template context. The key of the dictionary is the</span>
  443. <span class="c1">#: name of the blueprint this function is active for, ``None`` for all</span>
  444. <span class="c1">#: requests. Each returns a dictionary that the template context is</span>
  445. <span class="c1">#: updated with. To register a function here, use the</span>
  446. <span class="c1">#: :meth:`context_processor` decorator.</span>
  447. <span class="bp">self</span><span class="o">.</span><span class="n">template_context_processors</span> <span class="o">=</span> <span class="p">{</span>
  448. <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>
  449. <span class="p">}</span>
  450. <span class="c1">#: A list of shell context processor functions that should be run</span>
  451. <span class="c1">#: when a shell context is created.</span>
  452. <span class="c1">#:</span>
  453. <span class="c1">#: .. versionadded:: 0.11</span>
  454. <span class="bp">self</span><span class="o">.</span><span class="n">shell_context_processors</span> <span class="o">=</span> <span class="p">[]</span>
  455. <span class="c1">#: all the attached blueprints in a dictionary by name. Blueprints</span>
  456. <span class="c1">#: can be attached multiple times so this dictionary does not tell</span>
  457. <span class="c1">#: you how often they got attached.</span>
  458. <span class="c1">#:</span>
  459. <span class="c1">#: .. versionadded:: 0.7</span>
  460. <span class="bp">self</span><span class="o">.</span><span class="n">blueprints</span> <span class="o">=</span> <span class="p">{}</span>
  461. <span class="bp">self</span><span class="o">.</span><span class="n">_blueprint_order</span> <span class="o">=</span> <span class="p">[]</span>
  462. <span class="c1">#: a place where extensions can store application specific state. For</span>
  463. <span class="c1">#: example this is where an extension could store database engines and</span>
  464. <span class="c1">#: similar things. For backwards compatibility extensions should register</span>
  465. <span class="c1">#: themselves like this::</span>
  466. <span class="c1">#:</span>
  467. <span class="c1">#: if not hasattr(app, &#39;extensions&#39;):</span>
  468. <span class="c1">#: app.extensions = {}</span>
  469. <span class="c1">#: app.extensions[&#39;extensionname&#39;] = SomeObject()</span>
  470. <span class="c1">#:</span>
  471. <span class="c1">#: The key must match the name of the extension module. For example in</span>
  472. <span class="c1">#: case of a &quot;Flask-Foo&quot; extension in `flask_foo`, the key would be</span>
  473. <span class="c1">#: ``&#39;foo&#39;``.</span>
  474. <span class="c1">#:</span>
  475. <span class="c1">#: .. versionadded:: 0.7</span>
  476. <span class="bp">self</span><span class="o">.</span><span class="n">extensions</span> <span class="o">=</span> <span class="p">{}</span>
  477. <span class="c1">#: The :class:`~werkzeug.routing.Map` for this instance. You can use</span>
  478. <span class="c1">#: this to change the routing converters after the class was created</span>
  479. <span class="c1">#: but before any routes are connected. Example::</span>
  480. <span class="c1">#:</span>
  481. <span class="c1">#: from werkzeug.routing import BaseConverter</span>
  482. <span class="c1">#:</span>
  483. <span class="c1">#: class ListConverter(BaseConverter):</span>
  484. <span class="c1">#: def to_python(self, value):</span>
  485. <span class="c1">#: return value.split(&#39;,&#39;)</span>
  486. <span class="c1">#: def to_url(self, values):</span>
  487. <span class="c1">#: return &#39;,&#39;.join(BaseConverter.to_url(value)</span>
  488. <span class="c1">#: for value in values)</span>
  489. <span class="c1">#:</span>
  490. <span class="c1">#: app = Flask(__name__)</span>
  491. <span class="c1">#: app.url_map.converters[&#39;list&#39;] = ListConverter</span>
  492. <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>
  493. <span class="c1"># tracks internally if the application already handled at least one</span>
  494. <span class="c1"># request.</span>
  495. <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>
  496. <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>
  497. <span class="c1"># register the static folder for the application. Do that even</span>
  498. <span class="c1"># if the folder does not exist. First of all it might be created</span>
  499. <span class="c1"># while the server is running (usually happens during development)</span>
  500. <span class="c1"># but also because google appengine stores static files somewhere</span>
  501. <span class="c1"># else when mapped with the .yml file.</span>
  502. <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>
  503. <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">&#39;/&lt;path:filename&gt;&#39;</span><span class="p">,</span>
  504. <span class="n">endpoint</span><span class="o">=</span><span class="s1">&#39;static&#39;</span><span class="p">,</span>
  505. <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>
  506. <span class="c1">#: The click command line context for this application. Commands</span>
  507. <span class="c1">#: registered here show up in the :command:`flask` command once the</span>
  508. <span class="c1">#: application has been discovered. The default commands are</span>
  509. <span class="c1">#: provided by Flask itself and can be overridden.</span>
  510. <span class="c1">#:</span>
  511. <span class="c1">#: This is an instance of a :class:`click.Group` object.</span>
  512. <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>
  513. <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>
  514. <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
  515. <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">&#39;error_handlers is deprecated, use the &#39;</span>
  516. <span class="s1">&#39;new error_handler_spec attribute instead.&#39;</span><span class="p">),</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
  517. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span>
  518. <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>
  519. <span class="bp">self</span><span class="o">.</span><span class="n">_error_handlers</span> <span class="o">=</span> <span class="n">value</span>
  520. <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>
  521. <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>
  522. <span class="k">del</span> <span class="n">_get_error_handlers</span><span class="p">,</span> <span class="n">_set_error_handlers</span>
  523. <span class="nd">@locked_cached_property</span>
  524. <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>
  525. <span class="sd">&quot;&quot;&quot;The name of the application. This is usually the import name</span>
  526. <span class="sd"> with the difference that it&#39;s guessed from the run file if the</span>
  527. <span class="sd"> import name is main. This name is used as a display name when</span>
  528. <span class="sd"> Flask needs the name of the application. It can be set and overridden</span>
  529. <span class="sd"> to change the value.</span>
  530. <span class="sd"> .. versionadded:: 0.8</span>
  531. <span class="sd"> &quot;&quot;&quot;</span>
  532. <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">&#39;__main__&#39;</span><span class="p">:</span>
  533. <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">&#39;__main__&#39;</span><span class="p">],</span> <span class="s1">&#39;__file__&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  534. <span class="k">if</span> <span class="n">fn</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  535. <span class="k">return</span> <span class="s1">&#39;__main__&#39;</span>
  536. <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>
  537. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">import_name</span></div>
  538. <span class="nd">@property</span>
  539. <span class="k">def</span> <span class="nf">propagate_exceptions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  540. <span class="sd">&quot;&quot;&quot;Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration</span>
  541. <span class="sd"> value in case it&#39;s set, otherwise a sensible default is returned.</span>
  542. <span class="sd"> .. versionadded:: 0.7</span>
  543. <span class="sd"> &quot;&quot;&quot;</span>
  544. <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">&#39;PROPAGATE_EXCEPTIONS&#39;</span><span class="p">]</span>
  545. <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>
  546. <span class="k">return</span> <span class="n">rv</span>
  547. <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>
  548. <span class="nd">@property</span>
  549. <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>
  550. <span class="sd">&quot;&quot;&quot;Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION``</span>
  551. <span class="sd"> configuration value in case it&#39;s set, otherwise a sensible default</span>
  552. <span class="sd"> is returned.</span>
  553. <span class="sd"> .. versionadded:: 0.7</span>
  554. <span class="sd"> &quot;&quot;&quot;</span>
  555. <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">&#39;PRESERVE_CONTEXT_ON_EXCEPTION&#39;</span><span class="p">]</span>
  556. <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>
  557. <span class="k">return</span> <span class="n">rv</span>
  558. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span>
  559. <span class="nd">@property</span>
  560. <span class="k">def</span> <span class="nf">logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  561. <span class="sd">&quot;&quot;&quot;A :class:`logging.Logger` object for this application. The</span>
  562. <span class="sd"> default configuration is to log to stderr if the application is</span>
  563. <span class="sd"> in debug mode. This logger can be used to (surprise) log messages.</span>
  564. <span class="sd"> Here some examples::</span>
  565. <span class="sd"> app.logger.debug(&#39;A value for debugging&#39;)</span>
  566. <span class="sd"> app.logger.warning(&#39;A warning occurred (%d apples)&#39;, 42)</span>
  567. <span class="sd"> app.logger.error(&#39;An error occurred&#39;)</span>
  568. <span class="sd"> .. versionadded:: 0.3</span>
  569. <span class="sd"> &quot;&quot;&quot;</span>
  570. <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>
  571. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span>
  572. <span class="k">with</span> <span class="n">_logger_lock</span><span class="p">:</span>
  573. <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>
  574. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_logger</span>
  575. <span class="kn">from</span> <span class="nn">flask.logging</span> <span class="k">import</span> <span class="n">create_logger</span>
  576. <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>
  577. <span class="k">return</span> <span class="n">rv</span>
  578. <span class="nd">@locked_cached_property</span>
  579. <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>
  580. <span class="sd">&quot;&quot;&quot;The Jinja2 environment used to load templates.&quot;&quot;&quot;</span>
  581. <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>
  582. <span class="nd">@property</span>
  583. <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>
  584. <span class="sd">&quot;&quot;&quot;This attribute is set to ``True`` if the application started</span>
  585. <span class="sd"> handling the first request.</span>
  586. <span class="sd"> .. versionadded:: 0.8</span>
  587. <span class="sd"> &quot;&quot;&quot;</span>
  588. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_got_first_request</span>
  589. <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>
  590. <span class="sd">&quot;&quot;&quot;Used to create the config attribute by the Flask constructor.</span>
  591. <span class="sd"> The `instance_relative` parameter is passed in from the constructor</span>
  592. <span class="sd"> of Flask (there named `instance_relative_config`) and indicates if</span>
  593. <span class="sd"> the config should be relative to the instance path or the root path</span>
  594. <span class="sd"> of the application.</span>
  595. <span class="sd"> .. versionadded:: 0.8</span>
  596. <span class="sd"> &quot;&quot;&quot;</span>
  597. <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>
  598. <span class="k">if</span> <span class="n">instance_relative</span><span class="p">:</span>
  599. <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>
  600. <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>
  601. <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>
  602. <span class="sd">&quot;&quot;&quot;Tries to locate the instance path if it was not provided to the</span>
  603. <span class="sd"> constructor of the application class. It will basically calculate</span>
  604. <span class="sd"> the path to a folder named ``instance`` next to your main file or</span>
  605. <span class="sd"> the package.</span>
  606. <span class="sd"> .. versionadded:: 0.8</span>
  607. <span class="sd"> &quot;&quot;&quot;</span>
  608. <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>
  609. <span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  610. <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">&#39;instance&#39;</span><span class="p">)</span>
  611. <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">&#39;var&#39;</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">&#39;-instance&#39;</span><span class="p">)</span></div>
  612. <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">&#39;rb&#39;</span><span class="p">):</span>
  613. <span class="sd">&quot;&quot;&quot;Opens a resource from the application&#39;s instance folder</span>
  614. <span class="sd"> (:attr:`instance_path`). Otherwise works like</span>
  615. <span class="sd"> :meth:`open_resource`. Instance resources can also be opened for</span>
  616. <span class="sd"> writing.</span>
  617. <span class="sd"> :param resource: the name of the resource. To access resources within</span>
  618. <span class="sd"> subfolders use forward slashes as separator.</span>
  619. <span class="sd"> :param mode: resource file opening mode, default is &#39;rb&#39;.</span>
  620. <span class="sd"> &quot;&quot;&quot;</span>
  621. <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>
  622. <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>
  623. <span class="sd">&quot;&quot;&quot;Creates the Jinja2 environment based on :attr:`jinja_options`</span>
  624. <span class="sd"> and :meth:`select_jinja_autoescape`. Since 0.7 this also adds</span>
  625. <span class="sd"> the Jinja2 globals and filters after initialization. Override</span>
  626. <span class="sd"> this function to customize the behavior.</span>
  627. <span class="sd"> .. versionadded:: 0.5</span>
  628. <span class="sd"> .. versionchanged:: 0.11</span>
  629. <span class="sd"> ``Environment.auto_reload`` set in accordance with</span>
  630. <span class="sd"> ``TEMPLATES_AUTO_RELOAD`` configuration option.</span>
  631. <span class="sd"> &quot;&quot;&quot;</span>
  632. <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>
  633. <span class="k">if</span> <span class="s1">&#39;autoescape&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
  634. <span class="n">options</span><span class="p">[</span><span class="s1">&#39;autoescape&#39;</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>
  635. <span class="k">if</span> <span class="s1">&#39;auto_reload&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
  636. <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">&#39;TEMPLATES_AUTO_RELOAD&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  637. <span class="n">options</span><span class="p">[</span><span class="s1">&#39;auto_reload&#39;</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">&#39;TEMPLATES_AUTO_RELOAD&#39;</span><span class="p">]</span>
  638. <span class="k">else</span><span class="p">:</span>
  639. <span class="n">options</span><span class="p">[</span><span class="s1">&#39;auto_reload&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span>
  640. <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>
  641. <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>
  642. <span class="n">url_for</span><span class="o">=</span><span class="n">url_for</span><span class="p">,</span>
  643. <span class="n">get_flashed_messages</span><span class="o">=</span><span class="n">get_flashed_messages</span><span class="p">,</span>
  644. <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>
  645. <span class="c1"># request, session and g are normally added with the</span>
  646. <span class="c1"># context processor for efficiency reasons but for imported</span>
  647. <span class="c1"># templates we also want the proxies in there.</span>
  648. <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span>
  649. <span class="n">session</span><span class="o">=</span><span class="n">session</span><span class="p">,</span>
  650. <span class="n">g</span><span class="o">=</span><span class="n">g</span>
  651. <span class="p">)</span>
  652. <span class="n">rv</span><span class="o">.</span><span class="n">filters</span><span class="p">[</span><span class="s1">&#39;tojson&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">tojson_filter</span>
  653. <span class="k">return</span> <span class="n">rv</span></div>
  654. <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>
  655. <span class="sd">&quot;&quot;&quot;Creates the loader for the Jinja2 environment. Can be used to</span>
  656. <span class="sd"> override just the loader and keeping the rest unchanged. It&#39;s</span>
  657. <span class="sd"> discouraged to override this function. Instead one should override</span>
  658. <span class="sd"> the :meth:`jinja_loader` function instead.</span>
  659. <span class="sd"> The global loader dispatches between the loaders of the application</span>
  660. <span class="sd"> and the individual blueprints.</span>
  661. <span class="sd"> .. versionadded:: 0.7</span>
  662. <span class="sd"> &quot;&quot;&quot;</span>
  663. <span class="k">return</span> <span class="n">DispatchingJinjaLoader</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
  664. <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>
  665. <span class="sd">&quot;&quot;&quot;Deprecated. Used to initialize the Jinja2 globals.</span>
  666. <span class="sd"> .. versionadded:: 0.5</span>
  667. <span class="sd"> .. versionchanged:: 0.7</span>
  668. <span class="sd"> This method is deprecated with 0.7. Override</span>
  669. <span class="sd"> :meth:`create_jinja_environment` instead.</span>
  670. <span class="sd"> &quot;&quot;&quot;</span></div>
  671. <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>
  672. <span class="sd">&quot;&quot;&quot;Returns ``True`` if autoescaping should be active for the given</span>
  673. <span class="sd"> template name. If no template name is given, returns `True`.</span>
  674. <span class="sd"> .. versionadded:: 0.5</span>
  675. <span class="sd"> &quot;&quot;&quot;</span>
  676. <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  677. <span class="k">return</span> <span class="kc">True</span>
  678. <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">&#39;.html&#39;</span><span class="p">,</span> <span class="s1">&#39;.htm&#39;</span><span class="p">,</span> <span class="s1">&#39;.xml&#39;</span><span class="p">,</span> <span class="s1">&#39;.xhtml&#39;</span><span class="p">))</span></div>
  679. <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>
  680. <span class="sd">&quot;&quot;&quot;Update the template context with some commonly used variables.</span>
  681. <span class="sd"> This injects request, session, config and g into the template</span>
  682. <span class="sd"> context as well as everything template context processors want</span>
  683. <span class="sd"> to inject. Note that the as of Flask 0.6, the original values</span>
  684. <span class="sd"> in the context will not be overridden if a context processor</span>
  685. <span class="sd"> decides to return a value with the same key.</span>
  686. <span class="sd"> :param context: the context as a dictionary that is updated in place</span>
  687. <span class="sd"> to add extra variables.</span>
  688. <span class="sd"> &quot;&quot;&quot;</span>
  689. <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>
  690. <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>
  691. <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>
  692. <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>
  693. <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>
  694. <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>
  695. <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>
  696. <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  697. <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>
  698. <span class="c1"># make sure the original values win. This makes it possible to</span>
  699. <span class="c1"># easier add new variables in context processors without breaking</span>
  700. <span class="c1"># existing views.</span>
  701. <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>
  702. <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>
  703. <span class="sd">&quot;&quot;&quot;Returns the shell context for an interactive shell for this</span>
  704. <span class="sd"> application. This runs all the registered shell context</span>
  705. <span class="sd"> processors.</span>
  706. <span class="sd"> .. versionadded:: 0.11</span>
  707. <span class="sd"> &quot;&quot;&quot;</span>
  708. <span class="n">rv</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;app&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">:</span> <span class="n">g</span><span class="p">}</span>
  709. <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>
  710. <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>
  711. <span class="k">return</span> <span class="n">rv</span></div>
  712. <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>
  713. <span class="sd">&quot;&quot;&quot;Runs the application on a local development server.</span>
  714. <span class="sd"> Do not use ``run()`` in a production setting. It is not intended to</span>
  715. <span class="sd"> meet security and performance requirements for a production server.</span>
  716. <span class="sd"> Instead, see :ref:`deployment` for WSGI server recommendations.</span>
  717. <span class="sd"> If the :attr:`debug` flag is set the server will automatically reload</span>
  718. <span class="sd"> for code changes and show a debugger in case an exception happened.</span>
  719. <span class="sd"> If you want to run the application in debug mode, but disable the</span>
  720. <span class="sd"> code execution on the interactive debugger, you can pass</span>
  721. <span class="sd"> ``use_evalex=False`` as parameter. This will keep the debugger&#39;s</span>
  722. <span class="sd"> traceback screen active, but disable code execution.</span>
  723. <span class="sd"> It is not recommended to use this function for development with</span>
  724. <span class="sd"> automatic reloading as this is badly supported. Instead you should</span>
  725. <span class="sd"> be using the :command:`flask` command line script&#39;s ``run`` support.</span>
  726. <span class="sd"> .. admonition:: Keep in Mind</span>
  727. <span class="sd"> Flask will suppress any server error with a generic error page</span>
  728. <span class="sd"> unless it is in debug mode. As such to enable just the</span>
  729. <span class="sd"> interactive debugger without the code reloading, you have to</span>
  730. <span class="sd"> invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``.</span>
  731. <span class="sd"> Setting ``use_debugger`` to ``True`` without being in debug mode</span>
  732. <span class="sd"> won&#39;t catch any exceptions because there won&#39;t be any to</span>
  733. <span class="sd"> catch.</span>
  734. <span class="sd"> .. versionchanged:: 0.10</span>
  735. <span class="sd"> The default port is now picked from the ``SERVER_NAME`` variable.</span>
  736. <span class="sd"> :param host: the hostname to listen on. Set this to ``&#39;0.0.0.0&#39;`` to</span>
  737. <span class="sd"> have the server available externally as well. Defaults to</span>
  738. <span class="sd"> ``&#39;127.0.0.1&#39;``.</span>
  739. <span class="sd"> :param port: the port of the webserver. Defaults to ``5000`` or the</span>
  740. <span class="sd"> port defined in the ``SERVER_NAME`` config variable if</span>
  741. <span class="sd"> present.</span>
  742. <span class="sd"> :param debug: if given, enable or disable debug mode.</span>
  743. <span class="sd"> See :attr:`debug`.</span>
  744. <span class="sd"> :param options: the options to be forwarded to the underlying</span>
  745. <span class="sd"> Werkzeug server. See</span>
  746. <span class="sd"> :func:`werkzeug.serving.run_simple` for more</span>
  747. <span class="sd"> information.</span>
  748. <span class="sd"> &quot;&quot;&quot;</span>
  749. <span class="kn">from</span> <span class="nn">werkzeug.serving</span> <span class="k">import</span> <span class="n">run_simple</span>
  750. <span class="k">if</span> <span class="n">host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  751. <span class="n">host</span> <span class="o">=</span> <span class="s1">&#39;127.0.0.1&#39;</span>
  752. <span class="k">if</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  753. <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">&#39;SERVER_NAME&#39;</span><span class="p">]</span>
  754. <span class="k">if</span> <span class="n">server_name</span> <span class="ow">and</span> <span class="s1">&#39;:&#39;</span> <span class="ow">in</span> <span class="n">server_name</span><span class="p">:</span>
  755. <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">&#39;:&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">1</span><span class="p">])</span>
  756. <span class="k">else</span><span class="p">:</span>
  757. <span class="n">port</span> <span class="o">=</span> <span class="mi">5000</span>
  758. <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>
  759. <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>
  760. <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;use_reloader&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">)</span>
  761. <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;use_debugger&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">)</span>
  762. <span class="n">options</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;passthrough_errors&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
  763. <span class="k">try</span><span class="p">:</span>
  764. <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>
  765. <span class="k">finally</span><span class="p">:</span>
  766. <span class="c1"># reset the first request information if the development server</span>
  767. <span class="c1"># resetted normally. This makes it possible to restart the server</span>
  768. <span class="c1"># without reloader and that stuff from an interactive shell.</span>
  769. <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>
  770. <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>
  771. <span class="sd">&quot;&quot;&quot;Creates a test client for this application. For information</span>
  772. <span class="sd"> about unit testing head over to :ref:`testing`.</span>
  773. <span class="sd"> Note that if you are testing for assertions or exceptions in your</span>
  774. <span class="sd"> application code, you must set ``app.testing = True`` in order for the</span>
  775. <span class="sd"> exceptions to propagate to the test client. Otherwise, the exception</span>
  776. <span class="sd"> will be handled by the application (not visible to the test client) and</span>
  777. <span class="sd"> the only indication of an AssertionError or other exception will be a</span>
  778. <span class="sd"> 500 status code response to the test client. See the :attr:`testing`</span>
  779. <span class="sd"> attribute. For example::</span>
  780. <span class="sd"> app.testing = True</span>
  781. <span class="sd"> client = app.test_client()</span>
  782. <span class="sd"> The test client can be used in a ``with`` block to defer the closing down</span>
  783. <span class="sd"> of the context until the end of the ``with`` block. This is useful if</span>
  784. <span class="sd"> you want to access the context locals for testing::</span>
  785. <span class="sd"> with app.test_client() as c:</span>
  786. <span class="sd"> rv = c.get(&#39;/?vodka=42&#39;)</span>
  787. <span class="sd"> assert request.args[&#39;vodka&#39;] == &#39;42&#39;</span>
  788. <span class="sd"> Additionally, you may pass optional keyword arguments that will then</span>
  789. <span class="sd"> be passed to the application&#39;s :attr:`test_client_class` constructor.</span>
  790. <span class="sd"> For example::</span>
  791. <span class="sd"> from flask.testing import FlaskClient</span>
  792. <span class="sd"> class CustomClient(FlaskClient):</span>
  793. <span class="sd"> def __init__(self, authentication=None, *args, **kwargs):</span>
  794. <span class="sd"> FlaskClient.__init__(*args, **kwargs)</span>
  795. <span class="sd"> self._authentication = authentication</span>
  796. <span class="sd"> app.test_client_class = CustomClient</span>
  797. <span class="sd"> client = app.test_client(authentication=&#39;Basic ....&#39;)</span>
  798. <span class="sd"> See :class:`~flask.testing.FlaskClient` for more information.</span>
  799. <span class="sd"> .. versionchanged:: 0.4</span>
  800. <span class="sd"> added support for ``with`` block usage for the client.</span>
  801. <span class="sd"> .. versionadded:: 0.7</span>
  802. <span class="sd"> The `use_cookies` parameter was added as well as the ability</span>
  803. <span class="sd"> to override the client to be used by setting the</span>
  804. <span class="sd"> :attr:`test_client_class` attribute.</span>
  805. <span class="sd"> .. versionchanged:: 0.11</span>
  806. <span class="sd"> Added `**kwargs` to support passing additional keyword arguments to</span>
  807. <span class="sd"> the constructor of :attr:`test_client_class`.</span>
  808. <span class="sd"> &quot;&quot;&quot;</span>
  809. <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>
  810. <span class="k">if</span> <span class="n">cls</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  811. <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>
  812. <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>
  813. <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>
  814. <span class="sd">&quot;&quot;&quot;Creates or opens a new session. Default implementation stores all</span>
  815. <span class="sd"> session data in a signed cookie. This requires that the</span>
  816. <span class="sd"> :attr:`secret_key` is set. Instead of overriding this method</span>
  817. <span class="sd"> we recommend replacing the :class:`session_interface`.</span>
  818. <span class="sd"> :param request: an instance of :attr:`request_class`.</span>
  819. <span class="sd"> &quot;&quot;&quot;</span>
  820. <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>
  821. <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>
  822. <span class="sd">&quot;&quot;&quot;Saves the session if it needs updates. For the default</span>
  823. <span class="sd"> implementation, check :meth:`open_session`. Instead of overriding this</span>
  824. <span class="sd"> method we recommend replacing the :class:`session_interface`.</span>
  825. <span class="sd"> :param session: the session to be saved (a</span>
  826. <span class="sd"> :class:`~werkzeug.contrib.securecookie.SecureCookie`</span>
  827. <span class="sd"> object)</span>
  828. <span class="sd"> :param response: an instance of :attr:`response_class`</span>
  829. <span class="sd"> &quot;&quot;&quot;</span>
  830. <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>
  831. <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>
  832. <span class="sd">&quot;&quot;&quot;Creates a new instance of a missing session. Instead of overriding</span>
  833. <span class="sd"> this method we recommend replacing the :class:`session_interface`.</span>
  834. <span class="sd"> .. versionadded:: 0.7</span>
  835. <span class="sd"> &quot;&quot;&quot;</span>
  836. <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>
  837. <span class="nd">@setupmethod</span>
  838. <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>
  839. <span class="sd">&quot;&quot;&quot;Register a blueprint on the application. For information about </span>
  840. <span class="sd"> blueprints head over to :ref:`blueprints`.</span>
  841. <span class="sd"> The blueprint name is passed in as the first argument. </span>
  842. <span class="sd"> Options are passed as additional keyword arguments and forwarded to </span>
  843. <span class="sd"> `blueprints` in an &quot;options&quot; dictionary.</span>
  844. <span class="sd"> :param subdomain: set a subdomain for the blueprint</span>
  845. <span class="sd"> :param url_prefix: set the prefix for all URLs defined on the blueprint.</span>
  846. <span class="sd"> ``(url_prefix=&#39;/&lt;lang code&gt;&#39;)``</span>
  847. <span class="sd"> :param url_defaults: a dictionary with URL defaults that is added to </span>
  848. <span class="sd"> each and every URL defined with this blueprint</span>
  849. <span class="sd"> :param static_folder: add a static folder to urls in this blueprint</span>
  850. <span class="sd"> :param static_url_path: add a static url path to urls in this blueprint</span>
  851. <span class="sd"> :param template_folder: set an alternate template folder</span>
  852. <span class="sd"> :param root_path: set an alternate root path for this blueprint</span>
  853. <span class="sd"> .. versionadded:: 0.7</span>
  854. <span class="sd"> &quot;&quot;&quot;</span>
  855. <span class="n">first_registration</span> <span class="o">=</span> <span class="kc">False</span>
  856. <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>
  857. <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> \
  858. <span class="s1">&#39;A blueprint</span><span class="se">\&#39;</span><span class="s1">s name collision occurred between </span><span class="si">%r</span><span class="s1"> and &#39;</span> \
  859. <span class="s1">&#39;</span><span class="si">%r</span><span class="s1">. Both share the same name &quot;</span><span class="si">%s</span><span class="s1">&quot;. Blueprints that &#39;</span> \
  860. <span class="s1">&#39;are created on the fly need unique names.&#39;</span> <span class="o">%</span> \
  861. <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>
  862. <span class="k">else</span><span class="p">:</span>
  863. <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>
  864. <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>
  865. <span class="n">first_registration</span> <span class="o">=</span> <span class="kc">True</span>
  866. <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>
  867. <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>
  868. <span class="sd">&quot;&quot;&quot;Iterates over all blueprints by the order they were registered.</span>
  869. <span class="sd"> .. versionadded:: 0.11</span>
  870. <span class="sd"> &quot;&quot;&quot;</span>
  871. <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>
  872. <span class="nd">@setupmethod</span>
  873. <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>
  874. <span class="sd">&quot;&quot;&quot;Connects a URL rule. Works exactly like the :meth:`route`</span>
  875. <span class="sd"> decorator. If a view_func is provided it will be registered with the</span>
  876. <span class="sd"> endpoint.</span>
  877. <span class="sd"> Basically this example::</span>
  878. <span class="sd"> @app.route(&#39;/&#39;)</span>
  879. <span class="sd"> def index():</span>
  880. <span class="sd"> pass</span>
  881. <span class="sd"> Is equivalent to the following::</span>
  882. <span class="sd"> def index():</span>
  883. <span class="sd"> pass</span>
  884. <span class="sd"> app.add_url_rule(&#39;/&#39;, &#39;index&#39;, index)</span>
  885. <span class="sd"> If the view_func is not provided you will need to connect the endpoint</span>
  886. <span class="sd"> to a view function like so::</span>
  887. <span class="sd"> app.view_functions[&#39;index&#39;] = index</span>
  888. <span class="sd"> Internally :meth:`route` invokes :meth:`add_url_rule` so if you want</span>
  889. <span class="sd"> to customize the behavior via subclassing you only need to change</span>
  890. <span class="sd"> this method.</span>
  891. <span class="sd"> For more information refer to :ref:`url-route-registrations`.</span>
  892. <span class="sd"> .. versionchanged:: 0.2</span>
  893. <span class="sd"> `view_func` parameter added.</span>
  894. <span class="sd"> .. versionchanged:: 0.6</span>
  895. <span class="sd"> ``OPTIONS`` is added automatically as method.</span>
  896. <span class="sd"> :param rule: the URL rule as string</span>
  897. <span class="sd"> :param endpoint: the endpoint for the registered URL rule. Flask</span>
  898. <span class="sd"> itself assumes the name of the view function as</span>
  899. <span class="sd"> endpoint</span>
  900. <span class="sd"> :param view_func: the function to call when serving a request to the</span>
  901. <span class="sd"> provided endpoint</span>
  902. <span class="sd"> :param options: the options to be forwarded to the underlying</span>
  903. <span class="sd"> :class:`~werkzeug.routing.Rule` object. A change</span>
  904. <span class="sd"> to Werkzeug is handling of method options. methods</span>
  905. <span class="sd"> is a list of methods this rule should be limited</span>
  906. <span class="sd"> to (``GET``, ``POST`` etc.). By default a rule</span>
  907. <span class="sd"> just listens for ``GET`` (and implicitly ``HEAD``).</span>
  908. <span class="sd"> Starting with Flask 0.6, ``OPTIONS`` is implicitly</span>
  909. <span class="sd"> added and handled by the standard request handling.</span>
  910. <span class="sd"> &quot;&quot;&quot;</span>
  911. <span class="k">if</span> <span class="n">endpoint</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  912. <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>
  913. <span class="n">options</span><span class="p">[</span><span class="s1">&#39;endpoint&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">endpoint</span>
  914. <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">&#39;methods&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  915. <span class="c1"># if the methods are not given and the view_func object knows its</span>
  916. <span class="c1"># methods we can use that instead. If neither exists, we go with</span>
  917. <span class="c1"># a tuple of only ``GET`` as default.</span>
  918. <span class="k">if</span> <span class="n">methods</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  919. <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">&#39;methods&#39;</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">&#39;GET&#39;</span><span class="p">,)</span>
  920. <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>
  921. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;Allowed methods have to be iterables of strings, &#39;</span>
  922. <span class="s1">&#39;for example: @app.route(..., methods=[&quot;POST&quot;])&#39;</span><span class="p">)</span>
  923. <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>
  924. <span class="c1"># Methods that should always be added</span>
  925. <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">&#39;required_methods&#39;</span><span class="p">,</span> <span class="p">()))</span>
  926. <span class="c1"># starting with Flask 0.8 the view_func object can disable and</span>
  927. <span class="c1"># force-enable the automatic options handling.</span>
  928. <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>
  929. <span class="s1">&#39;provide_automatic_options&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  930. <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>
  931. <span class="k">if</span> <span class="s1">&#39;OPTIONS&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">methods</span><span class="p">:</span>
  932. <span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="kc">True</span>
  933. <span class="n">required_methods</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s1">&#39;OPTIONS&#39;</span><span class="p">)</span>
  934. <span class="k">else</span><span class="p">:</span>
  935. <span class="n">provide_automatic_options</span> <span class="o">=</span> <span class="kc">False</span>
  936. <span class="c1"># Add the required methods now.</span>
  937. <span class="n">methods</span> <span class="o">|=</span> <span class="n">required_methods</span>
  938. <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>
  939. <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>
  940. <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>
  941. <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>
  942. <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>
  943. <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>
  944. <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="s1">&#39;View function mapping is overwriting an &#39;</span>
  945. <span class="s1">&#39;existing endpoint function: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">endpoint</span><span class="p">)</span>
  946. <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>
  947. <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>
  948. <span class="sd">&quot;&quot;&quot;A decorator that is used to register a view function for a</span>
  949. <span class="sd"> given URL rule. This does the same thing as :meth:`add_url_rule`</span>
  950. <span class="sd"> but is intended for decorator usage::</span>
  951. <span class="sd"> @app.route(&#39;/&#39;)</span>
  952. <span class="sd"> def index():</span>
  953. <span class="sd"> return &#39;Hello World&#39;</span>
  954. <span class="sd"> For more information refer to :ref:`url-route-registrations`.</span>
  955. <span class="sd"> :param rule: the URL rule as string</span>
  956. <span class="sd"> :param endpoint: the endpoint for the registered URL rule. Flask</span>
  957. <span class="sd"> itself assumes the name of the view function as</span>
  958. <span class="sd"> endpoint</span>
  959. <span class="sd"> :param options: the options to be forwarded to the underlying</span>
  960. <span class="sd"> :class:`~werkzeug.routing.Rule` object. A change</span>
  961. <span class="sd"> to Werkzeug is handling of method options. methods</span>
  962. <span class="sd"> is a list of methods this rule should be limited</span>
  963. <span class="sd"> to (``GET``, ``POST`` etc.). By default a rule</span>
  964. <span class="sd"> just listens for ``GET`` (and implicitly ``HEAD``).</span>
  965. <span class="sd"> Starting with Flask 0.6, ``OPTIONS`` is implicitly</span>
  966. <span class="sd"> added and handled by the standard request handling.</span>
  967. <span class="sd"> &quot;&quot;&quot;</span>
  968. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  969. <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">&#39;endpoint&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  970. <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>
  971. <span class="k">return</span> <span class="n">f</span>
  972. <span class="k">return</span> <span class="n">decorator</span></div>
  973. <span class="nd">@setupmethod</span>
  974. <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>
  975. <span class="sd">&quot;&quot;&quot;A decorator to register a function as an endpoint.</span>
  976. <span class="sd"> Example::</span>
  977. <span class="sd"> @app.endpoint(&#39;example.endpoint&#39;)</span>
  978. <span class="sd"> def example():</span>
  979. <span class="sd"> return &quot;example&quot;</span>
  980. <span class="sd"> :param endpoint: the name of the endpoint</span>
  981. <span class="sd"> &quot;&quot;&quot;</span>
  982. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  983. <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>
  984. <span class="k">return</span> <span class="n">f</span>
  985. <span class="k">return</span> <span class="n">decorator</span></div>
  986. <span class="nd">@staticmethod</span>
  987. <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>
  988. <span class="sd">&quot;&quot;&quot;Ensure that we register only exceptions as handler keys&quot;&quot;&quot;</span>
  989. <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>
  990. <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>
  991. <span class="k">else</span><span class="p">:</span>
  992. <span class="n">exc_class</span> <span class="o">=</span> <span class="n">exc_class_or_code</span>
  993. <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>
  994. <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>
  995. <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>
  996. <span class="k">else</span><span class="p">:</span>
  997. <span class="k">return</span> <span class="n">exc_class</span><span class="p">,</span> <span class="kc">None</span>
  998. <span class="nd">@setupmethod</span>
  999. <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>
  1000. <span class="sd">&quot;&quot;&quot;A decorator that is used to register a function give a given</span>
  1001. <span class="sd"> error code. Example::</span>
  1002. <span class="sd"> @app.errorhandler(404)</span>
  1003. <span class="sd"> def page_not_found(error):</span>
  1004. <span class="sd"> return &#39;This page does not exist&#39;, 404</span>
  1005. <span class="sd"> You can also register handlers for arbitrary exceptions::</span>
  1006. <span class="sd"> @app.errorhandler(DatabaseError)</span>
  1007. <span class="sd"> def special_exception_handler(error):</span>
  1008. <span class="sd"> return &#39;Database connection failed&#39;, 500</span>
  1009. <span class="sd"> You can also register a function as error handler without using</span>
  1010. <span class="sd"> the :meth:`errorhandler` decorator. The following example is</span>
  1011. <span class="sd"> equivalent to the one above::</span>
  1012. <span class="sd"> def page_not_found(error):</span>
  1013. <span class="sd"> return &#39;This page does not exist&#39;, 404</span>
  1014. <span class="sd"> app.error_handler_spec[None][404] = page_not_found</span>
  1015. <span class="sd"> Setting error handlers via assignments to :attr:`error_handler_spec`</span>
  1016. <span class="sd"> however is discouraged as it requires fiddling with nested dictionaries</span>
  1017. <span class="sd"> and the special case for arbitrary exception types.</span>
  1018. <span class="sd"> The first ``None`` refers to the active blueprint. If the error</span>
  1019. <span class="sd"> handler should be application wide ``None`` shall be used.</span>
  1020. <span class="sd"> .. versionadded:: 0.7</span>
  1021. <span class="sd"> Use :meth:`register_error_handler` instead of modifying</span>
  1022. <span class="sd"> :attr:`error_handler_spec` directly, for application wide error</span>
  1023. <span class="sd"> handlers.</span>
  1024. <span class="sd"> .. versionadded:: 0.7</span>
  1025. <span class="sd"> One can now additionally also register custom exception types</span>
  1026. <span class="sd"> that do not necessarily have to be a subclass of the</span>
  1027. <span class="sd"> :class:`~werkzeug.exceptions.HTTPException` class.</span>
  1028. <span class="sd"> :param code: the code as integer for the handler</span>
  1029. <span class="sd"> &quot;&quot;&quot;</span>
  1030. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  1031. <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>
  1032. <span class="k">return</span> <span class="n">f</span>
  1033. <span class="k">return</span> <span class="n">decorator</span></div>
  1034. <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>
  1035. <span class="sd">&quot;&quot;&quot;Alternative error attach function to the :meth:`errorhandler`</span>
  1036. <span class="sd"> decorator that is more straightforward to use for non decorator</span>
  1037. <span class="sd"> usage.</span>
  1038. <span class="sd"> .. versionadded:: 0.7</span>
  1039. <span class="sd"> &quot;&quot;&quot;</span>
  1040. <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>
  1041. <span class="nd">@setupmethod</span>
  1042. <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>
  1043. <span class="sd">&quot;&quot;&quot;</span>
  1044. <span class="sd"> :type key: None|str</span>
  1045. <span class="sd"> :type code_or_exception: int|T&lt;=Exception</span>
  1046. <span class="sd"> :type f: callable</span>
  1047. <span class="sd"> &quot;&quot;&quot;</span>
  1048. <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>
  1049. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
  1050. <span class="s1">&#39;Tried to register a handler for an exception instance </span><span class="si">{0!r}</span><span class="s1">. &#39;</span>
  1051. <span class="s1">&#39;Handlers can only be registered for exception classes or HTTP error codes.&#39;</span>
  1052. <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">code_or_exception</span><span class="p">))</span>
  1053. <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>
  1054. <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>
  1055. <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>
  1056. <span class="nd">@setupmethod</span>
  1057. <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>
  1058. <span class="sd">&quot;&quot;&quot;A decorator that is used to register custom template filter.</span>
  1059. <span class="sd"> You can specify a name for the filter, otherwise the function</span>
  1060. <span class="sd"> name will be used. Example::</span>
  1061. <span class="sd"> @app.template_filter()</span>
  1062. <span class="sd"> def reverse(s):</span>
  1063. <span class="sd"> return s[::-1]</span>
  1064. <span class="sd"> :param name: the optional name of the filter, otherwise the</span>
  1065. <span class="sd"> function name will be used.</span>
  1066. <span class="sd"> &quot;&quot;&quot;</span>
  1067. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  1068. <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>
  1069. <span class="k">return</span> <span class="n">f</span>
  1070. <span class="k">return</span> <span class="n">decorator</span></div>
  1071. <span class="nd">@setupmethod</span>
  1072. <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>
  1073. <span class="sd">&quot;&quot;&quot;Register a custom template filter. Works exactly like the</span>
  1074. <span class="sd"> :meth:`template_filter` decorator.</span>
  1075. <span class="sd"> :param name: the optional name of the filter, otherwise the</span>
  1076. <span class="sd"> function name will be used.</span>
  1077. <span class="sd"> &quot;&quot;&quot;</span>
  1078. <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>
  1079. <span class="nd">@setupmethod</span>
  1080. <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>
  1081. <span class="sd">&quot;&quot;&quot;A decorator that is used to register custom template test.</span>
  1082. <span class="sd"> You can specify a name for the test, otherwise the function</span>
  1083. <span class="sd"> name will be used. Example::</span>
  1084. <span class="sd"> @app.template_test()</span>
  1085. <span class="sd"> def is_prime(n):</span>
  1086. <span class="sd"> if n == 2:</span>
  1087. <span class="sd"> return True</span>
  1088. <span class="sd"> for i in range(2, int(math.ceil(math.sqrt(n))) + 1):</span>
  1089. <span class="sd"> if n % i == 0:</span>
  1090. <span class="sd"> return False</span>
  1091. <span class="sd"> return True</span>
  1092. <span class="sd"> .. versionadded:: 0.10</span>
  1093. <span class="sd"> :param name: the optional name of the test, otherwise the</span>
  1094. <span class="sd"> function name will be used.</span>
  1095. <span class="sd"> &quot;&quot;&quot;</span>
  1096. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  1097. <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>
  1098. <span class="k">return</span> <span class="n">f</span>
  1099. <span class="k">return</span> <span class="n">decorator</span></div>
  1100. <span class="nd">@setupmethod</span>
  1101. <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>
  1102. <span class="sd">&quot;&quot;&quot;Register a custom template test. Works exactly like the</span>
  1103. <span class="sd"> :meth:`template_test` decorator.</span>
  1104. <span class="sd"> .. versionadded:: 0.10</span>
  1105. <span class="sd"> :param name: the optional name of the test, otherwise the</span>
  1106. <span class="sd"> function name will be used.</span>
  1107. <span class="sd"> &quot;&quot;&quot;</span>
  1108. <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>
  1109. <span class="nd">@setupmethod</span>
  1110. <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>
  1111. <span class="sd">&quot;&quot;&quot;A decorator that is used to register a custom template global function.</span>
  1112. <span class="sd"> You can specify a name for the global function, otherwise the function</span>
  1113. <span class="sd"> name will be used. Example::</span>
  1114. <span class="sd"> @app.template_global()</span>
  1115. <span class="sd"> def double(n):</span>
  1116. <span class="sd"> return 2 * n</span>
  1117. <span class="sd"> .. versionadded:: 0.10</span>
  1118. <span class="sd"> :param name: the optional name of the global function, otherwise the</span>
  1119. <span class="sd"> function name will be used.</span>
  1120. <span class="sd"> &quot;&quot;&quot;</span>
  1121. <span class="k">def</span> <span class="nf">decorator</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
  1122. <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>
  1123. <span class="k">return</span> <span class="n">f</span>
  1124. <span class="k">return</span> <span class="n">decorator</span></div>
  1125. <span class="nd">@setupmethod</span>
  1126. <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>
  1127. <span class="sd">&quot;&quot;&quot;Register a custom template global function. Works exactly like the</span>
  1128. <span class="sd"> :meth:`template_global` decorator.</span>
  1129. <span class="sd"> .. versionadded:: 0.10</span>
  1130. <span class="sd"> :param name: the optional name of the global function, otherwise the</span>
  1131. <span class="sd"> function name will be used.</span>
  1132. <span class="sd"> &quot;&quot;&quot;</span>
  1133. <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>
  1134. <span class="nd">@setupmethod</span>
  1135. <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>
  1136. <span class="sd">&quot;&quot;&quot;Registers a function to run before each request.</span>
  1137. <span class="sd"> The function will be called without any arguments.</span>
  1138. <span class="sd"> If the function returns a non-None value, it&#39;s handled as</span>
  1139. <span class="sd"> if it was the return value from the view and further</span>
  1140. <span class="sd"> request handling is stopped.</span>
  1141. <span class="sd"> &quot;&quot;&quot;</span>
  1142. <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>
  1143. <span class="k">return</span> <span class="n">f</span></div>
  1144. <span class="nd">@setupmethod</span>
  1145. <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>
  1146. <span class="sd">&quot;&quot;&quot;Registers a function to be run before the first request to this</span>
  1147. <span class="sd"> instance of the application.</span>
  1148. <span class="sd"> The function will be called without any arguments and its return</span>
  1149. <span class="sd"> value is ignored.</span>
  1150. <span class="sd"> .. versionadded:: 0.8</span>
  1151. <span class="sd"> &quot;&quot;&quot;</span>
  1152. <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>
  1153. <span class="k">return</span> <span class="n">f</span></div>
  1154. <span class="nd">@setupmethod</span>
  1155. <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>
  1156. <span class="sd">&quot;&quot;&quot;Register a function to be run after each request.</span>
  1157. <span class="sd"> Your function must take one parameter, an instance of</span>
  1158. <span class="sd"> :attr:`response_class` and return a new response object or the</span>
  1159. <span class="sd"> same (see :meth:`process_response`).</span>
  1160. <span class="sd"> As of Flask 0.7 this function might not be executed at the end of the</span>
  1161. <span class="sd"> request in case an unhandled exception occurred.</span>
  1162. <span class="sd"> &quot;&quot;&quot;</span>
  1163. <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>
  1164. <span class="k">return</span> <span class="n">f</span></div>
  1165. <span class="nd">@setupmethod</span>
  1166. <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>
  1167. <span class="sd">&quot;&quot;&quot;Register a function to be run at the end of each request,</span>
  1168. <span class="sd"> regardless of whether there was an exception or not. These functions</span>
  1169. <span class="sd"> are executed when the request context is popped, even if not an</span>
  1170. <span class="sd"> actual request was performed.</span>
  1171. <span class="sd"> Example::</span>
  1172. <span class="sd"> ctx = app.test_request_context()</span>
  1173. <span class="sd"> ctx.push()</span>
  1174. <span class="sd"> ...</span>
  1175. <span class="sd"> ctx.pop()</span>
  1176. <span class="sd"> When ``ctx.pop()`` is executed in the above example, the teardown</span>
  1177. <span class="sd"> functions are called just before the request context moves from the</span>
  1178. <span class="sd"> stack of active contexts. This becomes relevant if you are using</span>
  1179. <span class="sd"> such constructs in tests.</span>
  1180. <span class="sd"> Generally teardown functions must take every necessary step to avoid</span>
  1181. <span class="sd"> that they will fail. If they do execute code that might fail they</span>
  1182. <span class="sd"> will have to surround the execution of these code by try/except</span>
  1183. <span class="sd"> statements and log occurring errors.</span>
  1184. <span class="sd"> When a teardown function was called because of a exception it will</span>
  1185. <span class="sd"> be passed an error object.</span>
  1186. <span class="sd"> The return values of teardown functions are ignored.</span>
  1187. <span class="sd"> .. admonition:: Debug Note</span>
  1188. <span class="sd"> In debug mode Flask will not tear down a request on an exception</span>
  1189. <span class="sd"> immediately. Instead it will keep it alive so that the interactive</span>
  1190. <span class="sd"> debugger can still access it. This behavior can be controlled</span>
  1191. <span class="sd"> by the ``PRESERVE_CONTEXT_ON_EXCEPTION`` configuration variable.</span>
  1192. <span class="sd"> &quot;&quot;&quot;</span>
  1193. <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>
  1194. <span class="k">return</span> <span class="n">f</span></div>
  1195. <span class="nd">@setupmethod</span>
  1196. <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>
  1197. <span class="sd">&quot;&quot;&quot;Registers a function to be called when the application context</span>
  1198. <span class="sd"> ends. These functions are typically also called when the request</span>
  1199. <span class="sd"> context is popped.</span>
  1200. <span class="sd"> Example::</span>
  1201. <span class="sd"> ctx = app.app_context()</span>
  1202. <span class="sd"> ctx.push()</span>
  1203. <span class="sd"> ...</span>
  1204. <span class="sd"> ctx.pop()</span>
  1205. <span class="sd"> When ``ctx.pop()`` is executed in the above example, the teardown</span>
  1206. <span class="sd"> functions are called just before the app context moves from the</span>
  1207. <span class="sd"> stack of active contexts. This becomes relevant if you are using</span>
  1208. <span class="sd"> such constructs in tests.</span>
  1209. <span class="sd"> Since a request context typically also manages an application</span>
  1210. <span class="sd"> context it would also be called when you pop a request context.</span>
  1211. <span class="sd"> When a teardown function was called because of an exception it will</span>
  1212. <span class="sd"> be passed an error object.</span>
  1213. <span class="sd"> The return values of teardown functions are ignored.</span>
  1214. <span class="sd"> .. versionadded:: 0.9</span>
  1215. <span class="sd"> &quot;&quot;&quot;</span>
  1216. <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>
  1217. <span class="k">return</span> <span class="n">f</span></div>
  1218. <span class="nd">@setupmethod</span>
  1219. <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>
  1220. <span class="sd">&quot;&quot;&quot;Registers a template context processor function.&quot;&quot;&quot;</span>
  1221. <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>
  1222. <span class="k">return</span> <span class="n">f</span></div>
  1223. <span class="nd">@setupmethod</span>
  1224. <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>
  1225. <span class="sd">&quot;&quot;&quot;Registers a shell context processor function.</span>
  1226. <span class="sd"> .. versionadded:: 0.11</span>
  1227. <span class="sd"> &quot;&quot;&quot;</span>
  1228. <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>
  1229. <span class="k">return</span> <span class="n">f</span></div>
  1230. <span class="nd">@setupmethod</span>
  1231. <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>
  1232. <span class="sd">&quot;&quot;&quot;Registers a function as URL value preprocessor for all view</span>
  1233. <span class="sd"> functions of the application. It&#39;s called before the view functions</span>
  1234. <span class="sd"> are called and can modify the url values provided.</span>
  1235. <span class="sd"> &quot;&quot;&quot;</span>
  1236. <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>
  1237. <span class="k">return</span> <span class="n">f</span></div>
  1238. <span class="nd">@setupmethod</span>
  1239. <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>
  1240. <span class="sd">&quot;&quot;&quot;Callback function for URL defaults for all view functions of the</span>
  1241. <span class="sd"> application. It&#39;s called with the endpoint and values and should</span>
  1242. <span class="sd"> update the values passed in place.</span>
  1243. <span class="sd"> &quot;&quot;&quot;</span>
  1244. <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>
  1245. <span class="k">return</span> <span class="n">f</span></div>
  1246. <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>
  1247. <span class="sd">&quot;&quot;&quot;Finds a registered error handler for the request’s blueprint.</span>
  1248. <span class="sd"> Otherwise falls back to the app, returns None if not a suitable</span>
  1249. <span class="sd"> handler is found.</span>
  1250. <span class="sd"> &quot;&quot;&quot;</span>
  1251. <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>
  1252. <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>
  1253. <span class="k">if</span> <span class="ow">not</span> <span class="n">handler_map</span><span class="p">:</span>
  1254. <span class="k">return</span>
  1255. <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>
  1256. <span class="c1"># Protect from geniuses who might create circular references in</span>
  1257. <span class="c1"># __mro__</span>
  1258. <span class="n">done</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
  1259. <span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
  1260. <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>
  1261. <span class="k">if</span> <span class="n">cls</span> <span class="ow">in</span> <span class="n">done</span><span class="p">:</span>
  1262. <span class="k">continue</span>
  1263. <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>
  1264. <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>
  1265. <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>
  1266. <span class="c1"># cache for next time exc_class is raised</span>
  1267. <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>
  1268. <span class="k">return</span> <span class="n">handler</span>
  1269. <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>
  1270. <span class="c1"># try blueprint handlers</span>
  1271. <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>
  1272. <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>
  1273. <span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">code</span><span class="p">))</span>
  1274. <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>
  1275. <span class="k">return</span> <span class="n">handler</span>
  1276. <span class="c1"># fall back to app handlers</span>
  1277. <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>
  1278. <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>
  1279. <span class="sd">&quot;&quot;&quot;Handles an HTTP exception. By default this will invoke the</span>
  1280. <span class="sd"> registered error handlers and fall back to returning the</span>
  1281. <span class="sd"> exception as response.</span>
  1282. <span class="sd"> .. versionadded:: 0.3</span>
  1283. <span class="sd"> &quot;&quot;&quot;</span>
  1284. <span class="c1"># Proxy exceptions don&#39;t have error codes. We want to always return</span>
  1285. <span class="c1"># those unchanged as errors</span>
  1286. <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>
  1287. <span class="k">return</span> <span class="n">e</span>
  1288. <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>
  1289. <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1290. <span class="k">return</span> <span class="n">e</span>
  1291. <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
  1292. <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>
  1293. <span class="sd">&quot;&quot;&quot;Checks if an HTTP exception should be trapped or not. By default</span>
  1294. <span class="sd"> this will return ``False`` for all exceptions except for a bad request</span>
  1295. <span class="sd"> key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It</span>
  1296. <span class="sd"> also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``.</span>
  1297. <span class="sd"> This is called for all HTTP exceptions raised by a view function.</span>
  1298. <span class="sd"> If it returns ``True`` for any exception the error handler for this</span>
  1299. <span class="sd"> exception is not called and it shows up as regular exception in the</span>
  1300. <span class="sd"> traceback. This is helpful for debugging implicitly raised HTTP</span>
  1301. <span class="sd"> exceptions.</span>
  1302. <span class="sd"> .. versionadded:: 0.8</span>
  1303. <span class="sd"> &quot;&quot;&quot;</span>
  1304. <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">&#39;TRAP_HTTP_EXCEPTIONS&#39;</span><span class="p">]:</span>
  1305. <span class="k">return</span> <span class="kc">True</span>
  1306. <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">&#39;TRAP_BAD_REQUEST_ERRORS&#39;</span><span class="p">]:</span>
  1307. <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>
  1308. <span class="k">return</span> <span class="kc">False</span></div>
  1309. <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>
  1310. <span class="sd">&quot;&quot;&quot;This method is called whenever an exception occurs that should be</span>
  1311. <span class="sd"> handled. A special case are</span>
  1312. <span class="sd"> :class:`~werkzeug.exception.HTTPException`\s which are forwarded by</span>
  1313. <span class="sd"> this function to the :meth:`handle_http_exception` method. This</span>
  1314. <span class="sd"> function will either return a response value or reraise the</span>
  1315. <span class="sd"> exception with the same traceback.</span>
  1316. <span class="sd"> .. versionadded:: 0.7</span>
  1317. <span class="sd"> &quot;&quot;&quot;</span>
  1318. <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>
  1319. <span class="k">assert</span> <span class="n">exc_value</span> <span class="ow">is</span> <span class="n">e</span>
  1320. <span class="c1"># ensure not to trash sys.exc_info() at that point in case someone</span>
  1321. <span class="c1"># wants the traceback preserved in handle_http_exception. Of course</span>
  1322. <span class="c1"># we cannot prevent users from trashing it themselves in a custom</span>
  1323. <span class="c1"># trap_http_exception method so that&#39;s their fault then.</span>
  1324. <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>
  1325. <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>
  1326. <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>
  1327. <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1328. <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>
  1329. <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
  1330. <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>
  1331. <span class="sd">&quot;&quot;&quot;Default exception handling that kicks in when an exception</span>
  1332. <span class="sd"> occurs that is not caught. In debug mode the exception will</span>
  1333. <span class="sd"> be re-raised immediately, otherwise it is logged and the handler</span>
  1334. <span class="sd"> for a 500 internal server error is used. If no such handler</span>
  1335. <span class="sd"> exists, a default 500 internal server error message is displayed.</span>
  1336. <span class="sd"> .. versionadded:: 0.3</span>
  1337. <span class="sd"> &quot;&quot;&quot;</span>
  1338. <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>
  1339. <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>
  1340. <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>
  1341. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">propagate_exceptions</span><span class="p">:</span>
  1342. <span class="c1"># if we want to repropagate the exception, we can attempt to</span>
  1343. <span class="c1"># raise it with the whole traceback in case we can do that</span>
  1344. <span class="c1"># (the function was actually called from the except part)</span>
  1345. <span class="c1"># otherwise, we just raise the error again</span>
  1346. <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>
  1347. <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>
  1348. <span class="k">else</span><span class="p">:</span>
  1349. <span class="k">raise</span> <span class="n">e</span>
  1350. <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>
  1351. <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1352. <span class="k">return</span> <span class="n">InternalServerError</span><span class="p">()</span>
  1353. <span class="k">return</span> <span class="n">handler</span><span class="p">(</span><span class="n">e</span><span class="p">)</span></div>
  1354. <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>
  1355. <span class="sd">&quot;&quot;&quot;Logs an exception. This is called by :meth:`handle_exception`</span>
  1356. <span class="sd"> if debugging is disabled and right before the handler is called.</span>
  1357. <span class="sd"> The default implementation logs the exception as error on the</span>
  1358. <span class="sd"> :attr:`logger`.</span>
  1359. <span class="sd"> .. versionadded:: 0.8</span>
  1360. <span class="sd"> &quot;&quot;&quot;</span>
  1361. <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">&#39;Exception on </span><span class="si">%s</span><span class="s1"> [</span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1362. <span class="n">request</span><span class="o">.</span><span class="n">path</span><span class="p">,</span>
  1363. <span class="n">request</span><span class="o">.</span><span class="n">method</span>
  1364. <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>
  1365. <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>
  1366. <span class="sd">&quot;&quot;&quot;Exceptions that are recording during routing are reraised with</span>
  1367. <span class="sd"> this method. During debug we are not reraising redirect requests</span>
  1368. <span class="sd"> for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we&#39;re raising</span>
  1369. <span class="sd"> a different error instead to help debug situations.</span>
  1370. <span class="sd"> :internal:</span>
  1371. <span class="sd"> &quot;&quot;&quot;</span>
  1372. <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span> \
  1373. <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> \
  1374. <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">&#39;GET&#39;</span><span class="p">,</span> <span class="s1">&#39;HEAD&#39;</span><span class="p">,</span> <span class="s1">&#39;OPTIONS&#39;</span><span class="p">):</span>
  1375. <span class="k">raise</span> <span class="n">request</span><span class="o">.</span><span class="n">routing_exception</span>
  1376. <span class="kn">from</span> <span class="nn">.debughelpers</span> <span class="k">import</span> <span class="n">FormDataRoutingRedirect</span>
  1377. <span class="k">raise</span> <span class="n">FormDataRoutingRedirect</span><span class="p">(</span><span class="n">request</span><span class="p">)</span></div>
  1378. <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>
  1379. <span class="sd">&quot;&quot;&quot;Does the request dispatching. Matches the URL and returns the</span>
  1380. <span class="sd"> return value of the view or error handler. This does not have to</span>
  1381. <span class="sd"> be a response object. In order to convert the return value to a</span>
  1382. <span class="sd"> proper response object, call :func:`make_response`.</span>
  1383. <span class="sd"> .. versionchanged:: 0.7</span>
  1384. <span class="sd"> This no longer does the exception handling, this code was</span>
  1385. <span class="sd"> moved to the new :meth:`full_dispatch_request`.</span>
  1386. <span class="sd"> &quot;&quot;&quot;</span>
  1387. <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>
  1388. <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>
  1389. <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>
  1390. <span class="n">rule</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">url_rule</span>
  1391. <span class="c1"># if we provide automatic options for this URL and the</span>
  1392. <span class="c1"># request came with the OPTIONS method, reply automatically</span>
  1393. <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">&#39;provide_automatic_options&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> \
  1394. <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">&#39;OPTIONS&#39;</span><span class="p">:</span>
  1395. <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>
  1396. <span class="c1"># otherwise dispatch to the handler for that endpoint</span>
  1397. <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>
  1398. <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>
  1399. <span class="sd">&quot;&quot;&quot;Dispatches the request and on top of that performs request</span>
  1400. <span class="sd"> pre and postprocessing as well as HTTP exception catching and</span>
  1401. <span class="sd"> error handling.</span>
  1402. <span class="sd"> .. versionadded:: 0.7</span>
  1403. <span class="sd"> &quot;&quot;&quot;</span>
  1404. <span class="bp">self</span><span class="o">.</span><span class="n">try_trigger_before_first_request_functions</span><span class="p">()</span>
  1405. <span class="k">try</span><span class="p">:</span>
  1406. <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>
  1407. <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>
  1408. <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1409. <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>
  1410. <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1411. <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>
  1412. <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>
  1413. <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>
  1414. <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>
  1415. <span class="k">return</span> <span class="n">response</span></div>
  1416. <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>
  1417. <span class="sd">&quot;&quot;&quot;Called before each request and will ensure that it triggers</span>
  1418. <span class="sd"> the :attr:`before_first_request_funcs` and only exactly once per</span>
  1419. <span class="sd"> application instance (which means process usually).</span>
  1420. <span class="sd"> :internal:</span>
  1421. <span class="sd"> &quot;&quot;&quot;</span>
  1422. <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>
  1423. <span class="k">return</span>
  1424. <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>
  1425. <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>
  1426. <span class="k">return</span>
  1427. <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>
  1428. <span class="n">func</span><span class="p">()</span>
  1429. <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>
  1430. <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>
  1431. <span class="sd">&quot;&quot;&quot;This method is called to create the default ``OPTIONS`` response.</span>
  1432. <span class="sd"> This can be changed through subclassing to change the default</span>
  1433. <span class="sd"> behavior of ``OPTIONS`` responses.</span>
  1434. <span class="sd"> .. versionadded:: 0.7</span>
  1435. <span class="sd"> &quot;&quot;&quot;</span>
  1436. <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>
  1437. <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">&#39;allowed_methods&#39;</span><span class="p">):</span>
  1438. <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>
  1439. <span class="k">else</span><span class="p">:</span>
  1440. <span class="c1"># fallback for Werkzeug &lt; 0.7</span>
  1441. <span class="n">methods</span> <span class="o">=</span> <span class="p">[]</span>
  1442. <span class="k">try</span><span class="p">:</span>
  1443. <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">&#39;--&#39;</span><span class="p">)</span>
  1444. <span class="k">except</span> <span class="n">MethodNotAllowed</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1445. <span class="n">methods</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">valid_methods</span>
  1446. <span class="k">except</span> <span class="n">HTTPException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1447. <span class="k">pass</span>
  1448. <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>
  1449. <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>
  1450. <span class="k">return</span> <span class="n">rv</span></div>
  1451. <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>
  1452. <span class="sd">&quot;&quot;&quot;This is called to figure out if an error should be ignored</span>
  1453. <span class="sd"> or not as far as the teardown system is concerned. If this</span>
  1454. <span class="sd"> function returns ``True`` then the teardown handlers will not be</span>
  1455. <span class="sd"> passed the error.</span>
  1456. <span class="sd"> .. versionadded:: 0.10</span>
  1457. <span class="sd"> &quot;&quot;&quot;</span>
  1458. <span class="k">return</span> <span class="kc">False</span></div>
  1459. <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>
  1460. <span class="sd">&quot;&quot;&quot;Converts the return value from a view function to a real</span>
  1461. <span class="sd"> response object that is an instance of :attr:`response_class`.</span>
  1462. <span class="sd"> The following types are allowed for `rv`:</span>
  1463. <span class="sd"> .. tabularcolumns:: |p{3.5cm}|p{9.5cm}|</span>
  1464. <span class="sd"> ======================= ===========================================</span>
  1465. <span class="sd"> :attr:`response_class` the object is returned unchanged</span>
  1466. <span class="sd"> :class:`str` a response object is created with the</span>
  1467. <span class="sd"> string as body</span>
  1468. <span class="sd"> :class:`unicode` a response object is created with the</span>
  1469. <span class="sd"> string encoded to utf-8 as body</span>
  1470. <span class="sd"> a WSGI function the function is called as WSGI application</span>
  1471. <span class="sd"> and buffered as response object</span>
  1472. <span class="sd"> :class:`tuple` A tuple in the form ``(response, status,</span>
  1473. <span class="sd"> headers)`` or ``(response, headers)``</span>
  1474. <span class="sd"> where `response` is any of the</span>
  1475. <span class="sd"> types defined here, `status` is a string</span>
  1476. <span class="sd"> or an integer and `headers` is a list or</span>
  1477. <span class="sd"> a dictionary with header values.</span>
  1478. <span class="sd"> ======================= ===========================================</span>
  1479. <span class="sd"> :param rv: the return value from the view function</span>
  1480. <span class="sd"> .. versionchanged:: 0.9</span>
  1481. <span class="sd"> Previously a tuple was interpreted as the arguments for the</span>
  1482. <span class="sd"> response object.</span>
  1483. <span class="sd"> &quot;&quot;&quot;</span>
  1484. <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>
  1485. <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>
  1486. <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>
  1487. <span class="k">if</span> <span class="n">rv</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1488. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;View function did not return a response&#39;</span><span class="p">)</span>
  1489. <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>
  1490. <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>
  1491. <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>
  1492. <span class="c1"># When we create a response object directly, we let the constructor</span>
  1493. <span class="c1"># set the headers and status. We do this because there can be</span>
  1494. <span class="c1"># some extra logic involved when creating these objects with</span>
  1495. <span class="c1"># specific values (like default content type selection).</span>
  1496. <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>
  1497. <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>
  1498. <span class="n">status</span><span class="o">=</span><span class="n">status_or_headers</span><span class="p">)</span>
  1499. <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>
  1500. <span class="k">else</span><span class="p">:</span>
  1501. <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>
  1502. <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>
  1503. <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>
  1504. <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>
  1505. <span class="k">else</span><span class="p">:</span>
  1506. <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>
  1507. <span class="k">if</span> <span class="n">headers</span><span class="p">:</span>
  1508. <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>
  1509. <span class="k">return</span> <span class="n">rv</span></div>
  1510. <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>
  1511. <span class="sd">&quot;&quot;&quot;Creates a URL adapter for the given request. The URL adapter</span>
  1512. <span class="sd"> is created at a point where the request context is not yet set up</span>
  1513. <span class="sd"> so the request is passed explicitly.</span>
  1514. <span class="sd"> .. versionadded:: 0.6</span>
  1515. <span class="sd"> .. versionchanged:: 0.9</span>
  1516. <span class="sd"> This can now also be called without a request object when the</span>
  1517. <span class="sd"> URL adapter is created for the application context.</span>
  1518. <span class="sd"> &quot;&quot;&quot;</span>
  1519. <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>
  1520. <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>
  1521. <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">&#39;SERVER_NAME&#39;</span><span class="p">])</span>
  1522. <span class="c1"># We need at the very least the server name to be set for this</span>
  1523. <span class="c1"># to work.</span>
  1524. <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">&#39;SERVER_NAME&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1525. <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>
  1526. <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;SERVER_NAME&#39;</span><span class="p">],</span>
  1527. <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">&#39;APPLICATION_ROOT&#39;</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;/&#39;</span><span class="p">,</span>
  1528. <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">&#39;PREFERRED_URL_SCHEME&#39;</span><span class="p">])</span></div>
  1529. <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>
  1530. <span class="sd">&quot;&quot;&quot;Injects the URL defaults for the given endpoint directly into</span>
  1531. <span class="sd"> the values dictionary passed. This is used internally and</span>
  1532. <span class="sd"> automatically called on URL building.</span>
  1533. <span class="sd"> .. versionadded:: 0.7</span>
  1534. <span class="sd"> &quot;&quot;&quot;</span>
  1535. <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>
  1536. <span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">in</span> <span class="n">endpoint</span><span class="p">:</span>
  1537. <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">&#39;.&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
  1538. <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>
  1539. <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  1540. <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>
  1541. <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>
  1542. <span class="sd">&quot;&quot;&quot;Handle :class:`~werkzeug.routing.BuildError` on :meth:`url_for`.</span>
  1543. <span class="sd"> &quot;&quot;&quot;</span>
  1544. <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>
  1545. <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>
  1546. <span class="k">try</span><span class="p">:</span>
  1547. <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>
  1548. <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>
  1549. <span class="k">return</span> <span class="n">rv</span>
  1550. <span class="k">except</span> <span class="n">BuildError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1551. <span class="c1"># make error available outside except block (py3)</span>
  1552. <span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
  1553. <span class="c1"># At this point we want to reraise the exception. If the error is</span>
  1554. <span class="c1"># still the same one we can reraise it with the original traceback,</span>
  1555. <span class="c1"># otherwise we raise it from here.</span>
  1556. <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>
  1557. <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>
  1558. <span class="k">raise</span> <span class="n">error</span></div>
  1559. <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>
  1560. <span class="sd">&quot;&quot;&quot;Called before the actual request dispatching and will</span>
  1561. <span class="sd"> call each :meth:`before_request` decorated function, passing no</span>
  1562. <span class="sd"> arguments.</span>
  1563. <span class="sd"> If any of these functions returns a value, it&#39;s handled as</span>
  1564. <span class="sd"> if it was the return value from the view and further</span>
  1565. <span class="sd"> request handling is stopped.</span>
  1566. <span class="sd"> This also triggers the :meth:`url_value_processor` functions before</span>
  1567. <span class="sd"> the actual :meth:`before_request` functions are called.</span>
  1568. <span class="sd"> &quot;&quot;&quot;</span>
  1569. <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>
  1570. <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>
  1571. <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>
  1572. <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>
  1573. <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  1574. <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>
  1575. <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>
  1576. <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>
  1577. <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>
  1578. <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  1579. <span class="n">rv</span> <span class="o">=</span> <span class="n">func</span><span class="p">()</span>
  1580. <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>
  1581. <span class="k">return</span> <span class="n">rv</span></div>
  1582. <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>
  1583. <span class="sd">&quot;&quot;&quot;Can be overridden in order to modify the response object</span>
  1584. <span class="sd"> before it&#39;s sent to the WSGI server. By default this will</span>
  1585. <span class="sd"> call all the :meth:`after_request` decorated functions.</span>
  1586. <span class="sd"> .. versionchanged:: 0.5</span>
  1587. <span class="sd"> As of Flask 0.5 the functions registered for after request</span>
  1588. <span class="sd"> execution are called in reverse order of registration.</span>
  1589. <span class="sd"> :param response: a :attr:`response_class` object.</span>
  1590. <span class="sd"> :return: a new response object or the same, has to be an</span>
  1591. <span class="sd"> instance of :attr:`response_class`.</span>
  1592. <span class="sd"> &quot;&quot;&quot;</span>
  1593. <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>
  1594. <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>
  1595. <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>
  1596. <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>
  1597. <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>
  1598. <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>
  1599. <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>
  1600. <span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  1601. <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>
  1602. <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>
  1603. <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>
  1604. <span class="k">return</span> <span class="n">response</span></div>
  1605. <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>
  1606. <span class="sd">&quot;&quot;&quot;Called after the actual request dispatching and will</span>
  1607. <span class="sd"> call every as :meth:`teardown_request` decorated function. This is</span>
  1608. <span class="sd"> not actually called by the :class:`Flask` object itself but is always</span>
  1609. <span class="sd"> triggered when the request context is popped. That way we have a</span>
  1610. <span class="sd"> tighter control over certain resources under testing environments.</span>
  1611. <span class="sd"> .. versionchanged:: 0.9</span>
  1612. <span class="sd"> Added the `exc` argument. Previously this was always using the</span>
  1613. <span class="sd"> current exception information.</span>
  1614. <span class="sd"> &quot;&quot;&quot;</span>
  1615. <span class="k">if</span> <span class="n">exc</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
  1616. <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>
  1617. <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>
  1618. <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>
  1619. <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>
  1620. <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>
  1621. <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="n">funcs</span><span class="p">:</span>
  1622. <span class="n">func</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
  1623. <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>
  1624. <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>
  1625. <span class="sd">&quot;&quot;&quot;Called when an application context is popped. This works pretty</span>
  1626. <span class="sd"> much the same as :meth:`do_teardown_request` but for the application</span>
  1627. <span class="sd"> context.</span>
  1628. <span class="sd"> .. versionadded:: 0.9</span>
  1629. <span class="sd"> &quot;&quot;&quot;</span>
  1630. <span class="k">if</span> <span class="n">exc</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
  1631. <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>
  1632. <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>
  1633. <span class="n">func</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span>
  1634. <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>
  1635. <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>
  1636. <span class="sd">&quot;&quot;&quot;Binds the application only. For as long as the application is bound</span>
  1637. <span class="sd"> to the current context the :data:`flask.current_app` points to that</span>
  1638. <span class="sd"> application. An application context is automatically created when a</span>
  1639. <span class="sd"> request context is pushed if necessary.</span>
  1640. <span class="sd"> Example usage::</span>
  1641. <span class="sd"> with app.app_context():</span>
  1642. <span class="sd"> ...</span>
  1643. <span class="sd"> .. versionadded:: 0.9</span>
  1644. <span class="sd"> &quot;&quot;&quot;</span>
  1645. <span class="k">return</span> <span class="n">AppContext</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
  1646. <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>
  1647. <span class="sd">&quot;&quot;&quot;Creates a :class:`~flask.ctx.RequestContext` from the given</span>
  1648. <span class="sd"> environment and binds it to the current context. This must be used in</span>
  1649. <span class="sd"> combination with the ``with`` statement because the request is only bound</span>
  1650. <span class="sd"> to the current context for the duration of the ``with`` block.</span>
  1651. <span class="sd"> Example usage::</span>
  1652. <span class="sd"> with app.request_context(environ):</span>
  1653. <span class="sd"> do_something_with(request)</span>
  1654. <span class="sd"> The object returned can also be used without the ``with`` statement</span>
  1655. <span class="sd"> which is useful for working in the shell. The example above is</span>
  1656. <span class="sd"> doing exactly the same as this code::</span>
  1657. <span class="sd"> ctx = app.request_context(environ)</span>
  1658. <span class="sd"> ctx.push()</span>
  1659. <span class="sd"> try:</span>
  1660. <span class="sd"> do_something_with(request)</span>
  1661. <span class="sd"> finally:</span>
  1662. <span class="sd"> ctx.pop()</span>
  1663. <span class="sd"> .. versionchanged:: 0.3</span>
  1664. <span class="sd"> Added support for non-with statement usage and ``with`` statement</span>
  1665. <span class="sd"> is now passed the ctx object.</span>
  1666. <span class="sd"> :param environ: a WSGI environment</span>
  1667. <span class="sd"> &quot;&quot;&quot;</span>
  1668. <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>
  1669. <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>
  1670. <span class="sd">&quot;&quot;&quot;Creates a WSGI environment from the given values (see</span>
  1671. <span class="sd"> :class:`werkzeug.test.EnvironBuilder` for more information, this</span>
  1672. <span class="sd"> function accepts the same arguments).</span>
  1673. <span class="sd"> &quot;&quot;&quot;</span>
  1674. <span class="kn">from</span> <span class="nn">flask.testing</span> <span class="k">import</span> <span class="n">make_test_environ_builder</span>
  1675. <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>
  1676. <span class="k">try</span><span class="p">:</span>
  1677. <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>
  1678. <span class="k">finally</span><span class="p">:</span>
  1679. <span class="n">builder</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
  1680. <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>
  1681. <span class="sd">&quot;&quot;&quot;The actual WSGI application. This is not implemented in</span>
  1682. <span class="sd"> `__call__` so that middlewares can be applied without losing a</span>
  1683. <span class="sd"> reference to the class. So instead of doing this::</span>
  1684. <span class="sd"> app = MyMiddleware(app)</span>
  1685. <span class="sd"> It&#39;s a better idea to do this instead::</span>
  1686. <span class="sd"> app.wsgi_app = MyMiddleware(app.wsgi_app)</span>
  1687. <span class="sd"> Then you still have the original application object around and</span>
  1688. <span class="sd"> can continue to call methods on it.</span>
  1689. <span class="sd"> .. versionchanged:: 0.7</span>
  1690. <span class="sd"> The behavior of the before and after request callbacks was changed</span>
  1691. <span class="sd"> under error conditions and a new callback was added that will</span>
  1692. <span class="sd"> always execute at the end of the request, independent on if an</span>
  1693. <span class="sd"> error occurred or not. See :ref:`callbacks-and-errors`.</span>
  1694. <span class="sd"> :param environ: a WSGI environment</span>
  1695. <span class="sd"> :param start_response: a callable accepting a status code,</span>
  1696. <span class="sd"> a list of headers and an optional</span>
  1697. <span class="sd"> exception context to start the response</span>
  1698. <span class="sd"> &quot;&quot;&quot;</span>
  1699. <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>
  1700. <span class="n">ctx</span><span class="o">.</span><span class="n">push</span><span class="p">()</span>
  1701. <span class="n">error</span> <span class="o">=</span> <span class="kc">None</span>
  1702. <span class="k">try</span><span class="p">:</span>
  1703. <span class="k">try</span><span class="p">:</span>
  1704. <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>
  1705. <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1706. <span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
  1707. <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>
  1708. <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>
  1709. <span class="k">finally</span><span class="p">:</span>
  1710. <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>
  1711. <span class="n">error</span> <span class="o">=</span> <span class="kc">None</span>
  1712. <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>
  1713. <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>
  1714. <span class="sd">&quot;&quot;&quot;Shortcut for :attr:`wsgi_app`.&quot;&quot;&quot;</span>
  1715. <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>
  1716. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1717. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1718. <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>
  1719. <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
  1720. <span class="p">)</span></div>
  1721. </pre></div>
  1722. </div>
  1723. </div>
  1724. </div>
  1725. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  1726. <div class="sphinxsidebarwrapper"><div class="relations">
  1727. <h3>Related Topics</h3>
  1728. <ul>
  1729. <li><a href="../../index.html">Documentation overview</a><ul>
  1730. <li><a href="../index.html">Module code</a><ul>
  1731. </ul></li>
  1732. </ul></li>
  1733. </ul>
  1734. </div>
  1735. <div id="searchbox" style="display: none" role="search">
  1736. <h3>Quick search</h3>
  1737. <form class="search" action="../../search.html" method="get">
  1738. <div><input type="text" name="q" /></div>
  1739. <div><input type="submit" value="Go" /></div>
  1740. <input type="hidden" name="check_keywords" value="yes" />
  1741. <input type="hidden" name="area" value="default" />
  1742. </form>
  1743. </div>
  1744. <script type="text/javascript">$('#searchbox').show(0);</script>
  1745. </div>
  1746. </div>
  1747. <div class="clearer"></div>
  1748. </div>
  1749. <div class="footer">
  1750. &copy;2016, Author.
  1751. |
  1752. Powered by <a href="http://sphinx-doc.org/">Sphinx 1.4.8</a>
  1753. &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
  1754. </div>
  1755. </body>
  1756. </html>