Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/app/static/doc/flask-docs/upgrading.html
blob: 258ab345f0d1b4766b2933455a766ea806b09a37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Upgrading to Newer Releases &mdash; Flask 0.8 documentation</title>
    
    <link rel="stylesheet" href="_static/flasky.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '0.8',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="top" title="Flask 0.8 documentation" href="index.html" />
    <link rel="next" title="Flask Changelog" href="changelog.html" />
    <link rel="prev" title="Pocoo Styleguide" href="styleguide.html" />
   
  
  <link rel="apple-touch-icon" href="_static/touch-icon.png" />
  
  <link media="only screen and (max-device-width: 480px)" href="_static/small_flask.css" type= "text/css" rel="stylesheet" />

  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="changelog.html" title="Flask Changelog"
             accesskey="N">next</a> |</li>
        <li class="right" >
          <a href="styleguide.html" title="Pocoo Styleguide"
             accesskey="P">previous</a> |</li>
        <li><a href="index.html">Flask 0.8 documentation</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="upgrading-to-newer-releases">
<h1>Upgrading to Newer Releases<a class="headerlink" href="#upgrading-to-newer-releases" title="Permalink to this headline">¶</a></h1>
<p>Flask itself is changing like any software is changing over time.  Most of
the changes are the nice kind, the kind where you don&#8217;t have to change
anything in your code to profit from a new release.</p>
<p>However every once in a while there are changes that do require some
changes in your code or there are changes that make it possible for you to
improve your own code quality by taking advantage of new features in
Flask.</p>
<p>This section of the documentation enumerates all the changes in Flask from
release to release and how you can change your code to have a painless
updating experience.</p>
<p>If you want to use the <cite>easy_install</cite> command to upgrade your Flask
installation, make sure to pass it the <tt class="docutils literal"><span class="pre">-U</span></tt> parameter:</p>
<div class="highlight-python"><pre>$ easy_install -U Flask</pre>
</div>
<div class="section" id="version-0-8">
<h2>Version 0.8<a class="headerlink" href="#version-0-8" title="Permalink to this headline">¶</a></h2>
<p>Flask introduced a new session interface system.  We also noticed that
there was a naming collision between <cite>flask.session</cite> the module that
implements sessions and <a class="reference internal" href="api.html#flask.session" title="flask.session"><tt class="xref py py-data docutils literal"><span class="pre">flask.session</span></tt></a> which is the global session
object.  With that introduction we moved the implementation details for
the session system into a new module called <tt class="xref py py-mod docutils literal"><span class="pre">flask.sessions</span></tt>.  If you
used the previously undocumented session support we urge you to upgrade.</p>
<p>If invalid JSON data was submitted Flask will now raise a
<a class="reference external" href="http://werkzeug.pocoo.org/docs/exceptions/#werkzeug.exceptions.BadRequest" title="(in Werkzeug v0.7)"><tt class="xref py py-exc docutils literal"><span class="pre">BadRequest</span></tt></a> exception instead of letting the
default <a class="reference external" href="http://docs.python.org/dev/library/exceptions.html#ValueError" title="(in Python v3.3)"><tt class="xref py py-exc docutils literal"><span class="pre">ValueError</span></tt></a> bubble up.  This has the advantage that you no
longer have to handle that error to avoid an internal server error showing
up for the user.  If you were catching this down explicitly in the past
as <cite>ValueError</cite> you will need to change this.</p>
<p>Due to a bug in the test client Flask 0.7 did not trigger teardown
handlers when the test client was used in a with statement.  This was
since fixed but might require some changes in your testsuites if you
relied on this behavior.</p>
</div>
<div class="section" id="version-0-7">
<h2>Version 0.7<a class="headerlink" href="#version-0-7" title="Permalink to this headline">¶</a></h2>
<p>In Flask 0.7 we cleaned up the code base internally a lot and did some
backwards incompatible changes that make it easier to implement larger
applications with Flask.  Because we want to make upgrading as easy as
possible we tried to counter the problems arising from these changes by
providing a script that can ease the transition.</p>
<p>The script scans your whole application and generates an unified diff with
changes it assumes are safe to apply.  However as this is an automated
tool it won&#8217;t be able to find all use cases and it might miss some.  We
internally spread a lot of deprecation warnings all over the place to make
it easy to find pieces of code that it was unable to upgrade.</p>
<p>We strongly recommend that you hand review the generated patchfile and
only apply the chunks that look good.</p>
<p>If you are using git as version control system for your project we
recommend applying the patch with <tt class="docutils literal"><span class="pre">path</span> <span class="pre">-p1</span> <span class="pre">&lt;</span> <span class="pre">patchfile.diff</span></tt> and then
using the interactive commit feature to only apply the chunks that look
good.</p>
<p>To apply the upgrade script do the following:</p>
<ol class="arabic">
<li><p class="first">Download the script: <a class="reference external" href="https://raw.github.com/mitsuhiko/flask/master/scripts/flask-07-upgrade.py">flask-07-upgrade.py</a></p>
</li>
<li><p class="first">Run it in the directory of your application:</p>
<div class="highlight-python"><pre>python flask-07-upgrade.py &gt; patchfile.diff</pre>
</div>
</li>
<li><p class="first">Review the generated patchfile.</p>
</li>
<li><p class="first">Apply the patch:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">patch</span> <span class="o">-</span><span class="n">p1</span> <span class="o">&lt;</span> <span class="n">patchfile</span><span class="o">.</span><span class="n">diff</span>
</pre></div>
</div>
</li>
<li><p class="first">If you were using per-module template folders you need to move some
templates around.  Previously if you had a folder named <tt class="docutils literal"><span class="pre">templates</span></tt>
next to a blueprint named <tt class="docutils literal"><span class="pre">admin</span></tt> the implicit template path
automatically was <tt class="docutils literal"><span class="pre">admin/index.html</span></tt> for a template file called
<tt class="docutils literal"><span class="pre">templates/index.html</span></tt>.  This no longer is the case.  Now you need
to name the template <tt class="docutils literal"><span class="pre">templates/admin/index.html</span></tt>.  The tool will
not detect this so you will have to do that on your own.</p>
</li>
</ol>
<p>Please note that deprecation warnings are disabled by default starting
with Python 2.7.  In order to see the deprecation warnings that might be
emitted you have to enabled them with the <a class="reference external" href="http://docs.python.org/dev/library/warnings.html#warnings" title="(in Python v3.3)"><tt class="xref py py-mod docutils literal"><span class="pre">warnings</span></tt></a> module.</p>
<p>If you are working with windows and you lack the <cite>patch</cite> command line
utility you can get it as part of various Unix runtime environments for
windows including cygwin, msysgit or ming32.  Also source control systems
like svn, hg or git have builtin support for applying unified diffs as
generated by the tool.  Check the manual of your version control system
for more information.</p>
<div class="section" id="bug-in-request-locals">
<h3>Bug in Request Locals<a class="headerlink" href="#bug-in-request-locals" title="Permalink to this headline">¶</a></h3>
<p>Due to a bug in earlier implementations the request local proxies now
raise a <a class="reference external" href="http://docs.python.org/dev/library/exceptions.html#RuntimeError" title="(in Python v3.3)"><tt class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></tt></a> instead of an <a class="reference external" href="http://docs.python.org/dev/library/exceptions.html#AttributeError" title="(in Python v3.3)"><tt class="xref py py-exc docutils literal"><span class="pre">AttributeError</span></tt></a> when they
are unbound.  If you caught these exceptions with <a class="reference external" href="http://docs.python.org/dev/library/exceptions.html#AttributeError" title="(in Python v3.3)"><tt class="xref py py-exc docutils literal"><span class="pre">AttributeError</span></tt></a>
before, you should catch them with <a class="reference external" href="http://docs.python.org/dev/library/exceptions.html#RuntimeError" title="(in Python v3.3)"><tt class="xref py py-exc docutils literal"><span class="pre">RuntimeError</span></tt></a> now.</p>
<p>Additionally the <a class="reference internal" href="api.html#flask.send_file" title="flask.send_file"><tt class="xref py py-func docutils literal"><span class="pre">send_file()</span></tt></a> function is now issuing
deprecation warnings if you depend on functionality that will be removed
in Flask 1.0.  Previously it was possible to use etags and mimetypes
when file objects were passed.  This was unreliable and caused issues
for a few setups.  If you get a deprecation warning, make sure to
update your application to work with either filenames there or disable
etag attaching and attach them yourself.</p>
<p>Old code:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">return</span> <span class="n">send_file</span><span class="p">(</span><span class="n">my_file_object</span><span class="p">)</span>
<span class="k">return</span> <span class="n">send_file</span><span class="p">(</span><span class="n">my_file_object</span><span class="p">)</span>
</pre></div>
</div>
<p>New code:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">return</span> <span class="n">send_file</span><span class="p">(</span><span class="n">my_file_object</span><span class="p">,</span> <span class="n">add_etags</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="upgrading-to-new-teardown-handling">
<span id="id1"></span><h3>Upgrading to new Teardown Handling<a class="headerlink" href="#upgrading-to-new-teardown-handling" title="Permalink to this headline">¶</a></h3>
<p>We streamlined the behavior of the callbacks for request handling.  For
things that modify the response the <a class="reference internal" href="api.html#flask.Flask.after_request" title="flask.Flask.after_request"><tt class="xref py py-meth docutils literal"><span class="pre">after_request()</span></tt></a>
decorators continue to work as expected, but for things that absolutely
must happen at the end of request we introduced the new
<a class="reference internal" href="api.html#flask.Flask.teardown_request" title="flask.Flask.teardown_request"><tt class="xref py py-meth docutils literal"><span class="pre">teardown_request()</span></tt></a> decorator.  Unfortunately that
change also made after-request work differently under error conditions.
It&#8217;s not consistently skipped if exceptions happen whereas previously it
might have been called twice to ensure it is executed at the end of the
request.</p>
<p>If you have database connection code that looks like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.after_request</span>
<span class="k">def</span> <span class="nf">after_request</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
    <span class="n">g</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">response</span>
</pre></div>
</div>
<p>You are now encouraged to use this instead:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.teardown_request</span>
<span class="k">def</span> <span class="nf">after_request</span><span class="p">(</span><span class="n">exception</span><span class="p">):</span>
    <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="s">&#39;db&#39;</span><span class="p">):</span>
        <span class="n">g</span><span class="o">.</span><span class="n">db</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>
</div>
<p>On the upside this change greatly improves the internal code flow and
makes it easier to customize the dispatching and error handling.  This
makes it now a lot easier to write unit tests as you can prevent closing
down of database connections for a while.  You can take advantage of the
fact that the teardown callbacks are called when the response context is
removed from the stack so a test can query the database after request
handling:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">with</span> <span class="n">app</span><span class="o">.</span><span class="n">test_client</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
    <span class="n">resp</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
    <span class="c"># g.db is still bound if there is such a thing</span>

<span class="c"># and here it&#39;s gone</span>
</pre></div>
</div>
</div>
<div class="section" id="manual-error-handler-attaching">
<h3>Manual Error Handler Attaching<a class="headerlink" href="#manual-error-handler-attaching" title="Permalink to this headline">¶</a></h3>
<p>While it is still possible to attach error handlers to
<tt class="xref py py-attr docutils literal"><span class="pre">Flask.error_handlers</span></tt> it&#8217;s discouraged to do so and in fact
deprecated.  In generaly we no longer recommend custom error handler
attaching via assignments to the underlying dictionary due to the more
complex internal handling to support arbitrary exception classes and
blueprints.  See <tt class="xref py py-meth docutils literal"><span class="pre">Flask.errorhandler()</span></tt> for more information.</p>
<p>The proper upgrade is to change this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">app</span><span class="o">.</span><span class="n">error_handlers</span><span class="p">[</span><span class="mi">403</span><span class="p">]</span> <span class="o">=</span> <span class="n">handle_error</span>
</pre></div>
</div>
<p>Into this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">app</span><span class="o">.</span><span class="n">register_error_handler</span><span class="p">(</span><span class="mi">403</span><span class="p">,</span> <span class="n">handle_error</span><span class="p">)</span>
</pre></div>
</div>
<p>Alternatively you should just attach the function with a decorator:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@app.errorhandler</span><span class="p">(</span><span class="mi">403</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">handle_error</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
    <span class="o">...</span>
</pre></div>
</div>
<p>(Note that <tt class="xref py py-meth docutils literal"><span class="pre">register_error_handler()</span></tt> is new in Flask 0.7)</p>
</div>
<div class="section" id="blueprint-support">
<h3>Blueprint Support<a class="headerlink" href="#blueprint-support" title="Permalink to this headline">¶</a></h3>
<p>Blueprints replace the previous concept of “Modules” in Flask.  They
provide better semantics for various features and work better with large
applications.  The update script provided should be able to upgrade your
applications automatically, but there might be some cases where it fails
to upgrade.  What changed?</p>
<ul class="simple">
<li>Blueprints need explicit names.  Modules had an automatic name
guesssing scheme where the shortname for the module was taken from the
last part of the import module.  The upgrade script tries to guess
that name but it might fail as this information could change at
runtime.</li>
<li>Blueprints have an inverse behavior for <tt class="xref py py-meth docutils literal"><span class="pre">url_for()</span></tt>.  Previously
<tt class="docutils literal"><span class="pre">.foo</span></tt> told <tt class="xref py py-meth docutils literal"><span class="pre">url_for()</span></tt> that it should look for the endpoint
<cite>foo</cite> on the application.  Now it means “relative to current module”.
The script will inverse all calls to <tt class="xref py py-meth docutils literal"><span class="pre">url_for()</span></tt> automatically for
you.  It will do this in a very eager way so you might end up with
some unnecessary leading dots in your code if you&#8217;re not using
modules.</li>
<li>Blueprints do not automatically provide static folders.  They will
also no longer automatically export templates from a folder called
<cite>templates</cite> next to their location however but it can be enabled from
the constructor.  Same with static files: if you want to continue
serving static files you need to tell the constructor explicitly the
path to the static folder (which can be relative to the blueprint&#8217;s
module path).</li>
<li>Rendering templates was simplified.  Now the blueprints can provide
template folders which are added to a general template searchpath.
This means that you need to add another subfolder with the blueprint&#8217;s
name into that folder if you want <tt class="docutils literal"><span class="pre">blueprintname/template.html</span></tt> as
the template name.</li>
</ul>
<p>If you continue to use the <cite>Module</cite> object which is deprecated, Flask will
restore the previous behavior as good as possible.  However we strongly
recommend upgrading to the new blueprints as they provide a lot of useful
improvement such as the ability to attach a blueprint multiple times,
blueprint specific error handlers and a lot more.</p>
</div>
</div>
<div class="section" id="version-0-6">
<h2>Version 0.6<a class="headerlink" href="#version-0-6" title="Permalink to this headline">¶</a></h2>
<p>Flask 0.6 comes with a backwards incompatible change which affects the
order of after-request handlers.  Previously they were called in the order
of the registration, now they are called in reverse order.  This change
was made so that Flask behaves more like people expected it to work and
how other systems handle request pre- and postprocessing.  If you
depend on the order of execution of post-request functions, be sure to
change the order.</p>
<p>Another change that breaks backwards compatibility is that context
processors will no longer override values passed directly to the template
rendering function.  If for example <cite>request</cite> is as variable passed
directly to the template, the default context processor will not override
it with the current request object.  This makes it easier to extend
context processors later to inject additional variables without breaking
existing template not expecting them.</p>
</div>
<div class="section" id="version-0-5">
<h2>Version 0.5<a class="headerlink" href="#version-0-5" title="Permalink to this headline">¶</a></h2>
<p>Flask 0.5 is the first release that comes as a Python package instead of a
single module.  There were a couple of internal refactoring so if you
depend on undocumented internal details you probably have to adapt the
imports.</p>
<p>The following changes may be relevant to your application:</p>
<ul class="simple">
<li>autoescaping no longer happens for all templates.  Instead it is
configured to only happen on files ending with <tt class="docutils literal"><span class="pre">.html</span></tt>, <tt class="docutils literal"><span class="pre">.htm</span></tt>,
<tt class="docutils literal"><span class="pre">.xml</span></tt> and <tt class="docutils literal"><span class="pre">.xhtml</span></tt>.  If you have templates with different
extensions you should override the
<a class="reference internal" href="api.html#flask.Flask.select_jinja_autoescape" title="flask.Flask.select_jinja_autoescape"><tt class="xref py py-meth docutils literal"><span class="pre">select_jinja_autoescape()</span></tt></a> method.</li>
<li>Flask no longer supports zipped applications in this release.  This
functionality might come back in future releases if there is demand
for this feature.  Removing support for this makes the Flask internal
code easier to understand and fixes a couple of small issues that make
debugging harder than necessary.</li>
<li>The <cite>create_jinja_loader</cite> function is gone.  If you want to customize
the Jinja loader now, use the
<a class="reference internal" href="api.html#flask.Flask.create_jinja_environment" title="flask.Flask.create_jinja_environment"><tt class="xref py py-meth docutils literal"><span class="pre">create_jinja_environment()</span></tt></a> method instead.</li>
</ul>
</div>
<div class="section" id="version-0-4">
<h2>Version 0.4<a class="headerlink" href="#version-0-4" title="Permalink to this headline">¶</a></h2>
<p>For application developers there are no changes that require changes in
your code.  In case you are developing on a Flask extension however, and
that extension has a unittest-mode you might want to link the activation
of that mode to the new <tt class="docutils literal"><span class="pre">TESTING</span></tt> flag.</p>
</div>
<div class="section" id="version-0-3">
<h2>Version 0.3<a class="headerlink" href="#version-0-3" title="Permalink to this headline">¶</a></h2>
<p>Flask 0.3 introduces configuration support and logging as well as
categories for flashing messages.  All these are features that are 100%
backwards compatible but you might want to take advantage of them.</p>
<div class="section" id="configuration-support">
<h3>Configuration Support<a class="headerlink" href="#configuration-support" title="Permalink to this headline">¶</a></h3>
<p>The configuration support makes it easier to write any kind of application
that requires some sort of configuration.  (Which most likely is the case
for any application out there).</p>
<p>If you previously had code like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">app</span><span class="o">.</span><span class="n">debug</span> <span class="o">=</span> <span class="n">DEBUG</span>
<span class="n">app</span><span class="o">.</span><span class="n">secret_key</span> <span class="o">=</span> <span class="n">SECRET_KEY</span>
</pre></div>
</div>
<p>You no longer have to do that, instead you can just load a configuration
into the config object.  How this works is outlined in <a class="reference internal" href="config.html#config"><em>Configuration Handling</em></a>.</p>
</div>
<div class="section" id="logging-integration">
<h3>Logging Integration<a class="headerlink" href="#logging-integration" title="Permalink to this headline">¶</a></h3>
<p>Flask now configures a logger for you with some basic and useful defaults.
If you run your application in production and want to profit from
automatic error logging, you might be interested in attaching a proper log
handler.  Also you can start logging warnings and errors into the logger
when appropriately.  For more information on that, read
<a class="reference internal" href="errorhandling.html#application-errors"><em>Handling Application Errors</em></a>.</p>
</div>
<div class="section" id="categories-for-flash-messages">
<h3>Categories for Flash Messages<a class="headerlink" href="#categories-for-flash-messages" title="Permalink to this headline">¶</a></h3>
<p>Flash messages can now have categories attached.  This makes it possible
to render errors, warnings or regular messages differently for example.
This is an opt-in feature because it requires some rethinking in the code.</p>
<p>Read all about that in the <a class="reference internal" href="patterns/flashing.html#message-flashing-pattern"><em>Message Flashing</em></a> pattern.</p>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper"><p class="logo"><a href="index.html">
  <img class="logo" src="_static/flask.png" alt="Logo"/>
</a></p>
  <h3><a href="index.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">Upgrading to Newer Releases</a><ul>
<li><a class="reference internal" href="#version-0-8">Version 0.8</a></li>
<li><a class="reference internal" href="#version-0-7">Version 0.7</a><ul>
<li><a class="reference internal" href="#bug-in-request-locals">Bug in Request Locals</a></li>
<li><a class="reference internal" href="#upgrading-to-new-teardown-handling">Upgrading to new Teardown Handling</a></li>
<li><a class="reference internal" href="#manual-error-handler-attaching">Manual Error Handler Attaching</a></li>
<li><a class="reference internal" href="#blueprint-support">Blueprint Support</a></li>
</ul>
</li>
<li><a class="reference internal" href="#version-0-6">Version 0.6</a></li>
<li><a class="reference internal" href="#version-0-5">Version 0.5</a></li>
<li><a class="reference internal" href="#version-0-4">Version 0.4</a></li>
<li><a class="reference internal" href="#version-0-3">Version 0.3</a><ul>
<li><a class="reference internal" href="#configuration-support">Configuration Support</a></li>
<li><a class="reference internal" href="#logging-integration">Logging Integration</a></li>
<li><a class="reference internal" href="#categories-for-flash-messages">Categories for Flash Messages</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Related Topics</h3>
<ul>
  <li><a href="index.html">Documentation overview</a><ul>
      <li>Previous: <a href="styleguide.html" title="previous chapter">Pocoo Styleguide</a></li>
      <li>Next: <a href="changelog.html" title="next chapter">Flask Changelog</a></li>
  </ul></li>
</ul>
  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="_sources/upgrading.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="footer">
      &copy; Copyright 2010, Armin Ronacher.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a>.
    </div>
  </body>
</html>