From 110a7525658902a586da751bcdf9780690c089b2 Mon Sep 17 00:00:00 2001 From: Per Mortensen Date: Wed, 22 Nov 2017 22:40:23 +0100 Subject: [PATCH 01/64] Update Twisted Web example --- docs/deploying/wsgi-standalone.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/deploying/wsgi-standalone.rst b/docs/deploying/wsgi-standalone.rst index bf680976..5b0740a6 100644 --- a/docs/deploying/wsgi-standalone.rst +++ b/docs/deploying/wsgi-standalone.rst @@ -78,7 +78,7 @@ as well; see ``twistd -h`` and ``twistd web -h`` for more information. For example, to run a Twisted Web server in the foreground, on port 8080, with an application from ``myproject``:: - twistd -n web --port 8080 --wsgi myproject.app + twistd -n web --port tcp:8080 --wsgi myproject.app .. _Twisted: https://twistedmatrix.com/ .. _Twisted Web: https://twistedmatrix.com/trac/wiki/TwistedWeb From c23a63a185104b4dc39fe53d82254059c5ff4727 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 25 Nov 2017 00:05:57 +0100 Subject: [PATCH 02/64] Improved bad factory error handling --- flask/cli.py | 10 ++++++++++ tests/test_cli.py | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/flask/cli.py b/flask/cli.py index 8bfb21f6..b9d56b05 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -33,6 +33,12 @@ except ImportError: dotenv = None +def _called_with_wrong_args(factory, exc_info): + exc_type, exc_value, tb = exc_info + return exc_type is TypeError and \ + str(exc_value).startswith('%s() takes' % factory.__name__) + + class NoAppException(click.UsageError): """Raised if an application cannot be found or loaded.""" @@ -75,6 +81,8 @@ def find_best_app(script_info, module): if isinstance(app, Flask): return app except TypeError: + if not _called_with_wrong_args(app_factory, sys.exc_info()): + raise raise NoAppException( 'Detected factory "{factory}" in module "{module}", but ' 'could not call it without arguments. Use ' @@ -148,6 +156,8 @@ def find_app_by_string(script_info, module, app_name): try: app = call_factory(script_info, attr, args) except TypeError as e: + if not _called_with_wrong_args(attr, sys.exc_info()): + raise raise NoAppException( '{e}\nThe factory "{app_name}" in module "{module}" could not ' 'be called with the specified arguments.'.format( diff --git a/tests/test_cli.py b/tests/test_cli.py index 811ef0c8..d530b093 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -144,6 +144,13 @@ def test_find_best_app(test_apps): pytest.raises(NoAppException, find_best_app, script_info, Module) + class Module: + @staticmethod + def create_app(): + raise TypeError('bad bad factory!') + + pytest.raises(TypeError, find_best_app, script_info, Module) + @pytest.mark.parametrize('value,path,result', ( ('test', cwd, 'test'), From 2ef2000a39541d8424f3163ef5feeabacc81e681 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 25 Nov 2017 00:17:09 +0100 Subject: [PATCH 03/64] Enable threads by default for the dev server (#2529) Enable threads by default for dev server --- CHANGES | 1 + flask/cli.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 357b289d..294829ff 100644 --- a/CHANGES +++ b/CHANGES @@ -113,6 +113,7 @@ Major release, unreleased depending on ``app.debug``. No handlers are removed, and a handler is only added if no handlers are already configured. (`#2436`_) - Blueprint view function name may not contain dots. (`#2450`_) +- The dev server now uses threads by default. .. _#1421: https://github.com/pallets/flask/issues/1421 .. _#1489: https://github.com/pallets/flask/pull/1489 diff --git a/flask/cli.py b/flask/cli.py index 8bfb21f6..1be7957c 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -592,7 +592,7 @@ def load_dotenv(path=None): @click.option('--eager-loading/--lazy-loader', default=None, help='Enable or disable eager loading. By default eager ' 'loading is enabled if the reloader is disabled.') -@click.option('--with-threads/--without-threads', default=False, +@click.option('--with-threads/--without-threads', default=True, help='Enable or disable multithreading.') @pass_script_info def run_command(info, host, port, reload, debugger, eager_loading, From 1a2dc6f205003cd2307b33927b8628a3d97b7ce6 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 25 Nov 2017 00:18:10 +0100 Subject: [PATCH 04/64] Fixed tests for python 3 --- flask/cli.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flask/cli.py b/flask/cli.py index b9d56b05..0a556ddc 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -36,7 +36,9 @@ except ImportError: def _called_with_wrong_args(factory, exc_info): exc_type, exc_value, tb = exc_info return exc_type is TypeError and \ - str(exc_value).startswith('%s() takes' % factory.__name__) + str(exc_value).startswith(( + '%s() takes' % factory.__name__, + '%s() missing' % factory.__name__)) class NoAppException(click.UsageError): From c52e1b7388c17466a551391cdf81964bf0b7aef0 Mon Sep 17 00:00:00 2001 From: ThiefMaster Date: Thu, 23 Nov 2017 10:32:13 +0100 Subject: [PATCH 05/64] Fix ValueError for some invalid Range requests fixes #2526 --- CHANGES | 8 ++++++++ flask/helpers.py | 3 ++- tests/test_helpers.py | 21 ++++++++++++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 3456276a..b32b98cb 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,14 @@ Major release, unreleased method returns compressed response by default, and pretty response in debug mode. +Version 0.12.3 +-------------- + +Bugfix release, unreleased + +- Fix a ValueError caused by invalid Range requests in some cases + + Version 0.12.2 -------------- diff --git a/flask/helpers.py b/flask/helpers.py index 4bb1d1c9..caaad9a3 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -591,7 +591,8 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, rv = rv.make_conditional(request, accept_ranges=True, complete_length=fsize) except RequestedRangeNotSatisfiable: - file.close() + if file is not None: + file.close() raise else: rv = rv.make_conditional(request) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 9320ef71..69350751 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -468,7 +468,7 @@ class TestSendfile(object): @pytest.mark.skipif( not callable(getattr(Range, 'to_content_range_header', None)), - reason="not implement within werkzeug" + reason="not implemented within werkzeug" ) def test_send_file_range_request(self): app = flask.Flask(__name__) @@ -529,6 +529,25 @@ class TestSendfile(object): assert rv.status_code == 200 rv.close() + @pytest.mark.skipif( + not callable(getattr(Range, 'to_content_range_header', None)), + reason="not implemented within werkzeug" + ) + def test_send_file_range_request_xsendfile_invalid(self): + # https://github.com/pallets/flask/issues/2526 + app = flask.Flask(__name__) + app.use_x_sendfile = True + + @app.route('/') + def index(): + return flask.send_file('static/index.html', conditional=True) + + c = app.test_client() + + rv = c.get('/', headers={'Range': 'bytes=1000-'}) + assert rv.status_code == 416 + rv.close() + def test_attachment(self): app = flask.Flask(__name__) with app.test_request_context(): From 777cc17de34622a7f8324a3ce42fbc589d86476b Mon Sep 17 00:00:00 2001 From: Adrian Moennich Date: Sat, 25 Nov 2017 00:53:43 +0100 Subject: [PATCH 06/64] Fix broken test --- tests/test_helpers.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 066f3687..d497c40d 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -571,6 +571,10 @@ class TestSendfile(object): # https://github.com/pallets/flask/issues/2526 app.use_x_sendfile = True + @app.route('/') + def index(): + return flask.send_file('static/index.html', conditional=True) + rv = client.get('/', headers={'Range': 'bytes=1000-'}) assert rv.status_code == 416 rv.close() From d6df70de809a51a4e1cfbb58f486e8d97a2eb439 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sun, 26 Nov 2017 12:50:36 -0800 Subject: [PATCH 07/64] include tox.ini in sdist #2531 --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index f8d9c2ae..3616212e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include Makefile CHANGES LICENSE AUTHORS +include Makefile CHANGES LICENSE AUTHORS tox.ini graft artwork graft tests From 602c771327961ec28051b8fb60ba70e2091df565 Mon Sep 17 00:00:00 2001 From: Grey Li Date: Fri, 1 Dec 2017 16:03:52 +0800 Subject: [PATCH 08/64] Docs: update built-in server description --- docs/deploying/index.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/deploying/index.rst b/docs/deploying/index.rst index 6f014bff..edf5a256 100644 --- a/docs/deploying/index.rst +++ b/docs/deploying/index.rst @@ -4,9 +4,8 @@ Deployment Options ================== While lightweight and easy to use, **Flask's built-in server is not suitable -for production** as it doesn't scale well and by default serves only one -request at a time. Some of the options available for properly running Flask in -production are documented here. +for production** as it doesn't scale well. Some of the options available for +properly running Flask in production are documented here. If you want to deploy your Flask application to a WSGI server not listed here, look up the server documentation about how to use a WSGI app with it. Just From 9520fbdcb21a43e3c30225c6643e7dd2d4c4a692 Mon Sep 17 00:00:00 2001 From: Hsiaoming Yang Date: Sat, 2 Dec 2017 17:09:28 +0900 Subject: [PATCH 09/64] Rename GitHub templates to md. They are Markdown. --- .github/{ISSUE_TEMPLATE.rst => ISSUE_TEMPLATE.md} | 0 .github/{PULL_REQUEST_TEMPLATE.rst => PULL_REQUEST_TEMPLATE.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/{ISSUE_TEMPLATE.rst => ISSUE_TEMPLATE.md} (100%) rename .github/{PULL_REQUEST_TEMPLATE.rst => PULL_REQUEST_TEMPLATE.md} (100%) diff --git a/.github/ISSUE_TEMPLATE.rst b/.github/ISSUE_TEMPLATE.md similarity index 100% rename from .github/ISSUE_TEMPLATE.rst rename to .github/ISSUE_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.rst b/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE.rst rename to .github/PULL_REQUEST_TEMPLATE.md From 601cd90fdbb76f972442f3841a2f4d25e5d6f200 Mon Sep 17 00:00:00 2001 From: Ngalim Siregar Date: Sun, 3 Dec 2017 16:37:52 +0900 Subject: [PATCH 10/64] update pycharm instructions --- docs/_static/pycharm-runconfig.png | Bin 138820 -> 55441 bytes docs/cli.rst | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/_static/pycharm-runconfig.png b/docs/_static/pycharm-runconfig.png index 0fa0810f9b741d8a822b63ccf0f07f7421fed9ea..7e2de581bba4c30f08c005bcb8c2b4ef8036d91f 100644 GIT binary patch literal 55441 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

W$eQ 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 Df&34i diff --git a/docs/cli.rst b/docs/cli.rst index cdb0fc59..1a6da62f 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -359,11 +359,10 @@ There's quite a few options to change, but once we've done it for one command, we can easily copy the entire configuration and make a single tweak to give us access to other commands, including any custom ones you may implement yourself. -For the *Script* input (**A**), navigate to your project's virtual environment. -Within that folder, pick the ``flask`` executable which will reside in the -``bin`` folder, or in the ``Scripts`` on Windows. +Since PyCharm 2017.3, you can run modules instead of needing to find ``flask`` +executable. For the *Module name* input (**A**), you just need to input ``flask``. -The *Script Parameter* field (**B**) is set to the CLI command you to execute. +The *Parameters* field (**B**) is set to the CLI command you to execute. In this example we use ``run``, which will run the development server. You can skip this next step if you're using :ref:`dotenv`. We need to add an From 5892a6f2c5aefeb54598a824c9775b487999ba90 Mon Sep 17 00:00:00 2001 From: Ngalim Siregar Date: Sun, 3 Dec 2017 17:05:20 +0900 Subject: [PATCH 11/64] Update PyCharm image add highlighted area to pycharm image --- docs/_static/pycharm-runconfig.png | Bin 55441 -> 55565 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_static/pycharm-runconfig.png b/docs/_static/pycharm-runconfig.png index 7e2de581bba4c30f08c005bcb8c2b4ef8036d91f..abfccd7af173cd71ccc3a772227e0b81bcd35ec9 100644 GIT binary patch literal 55565 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 literal 55441 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

W$eQ zKV&r;6(1E%d}VdX0^~u7llSYD3Jo*j#CPIq-DKyHi%*-dK2FtCm;HN-VjO%d}fMK_*(?IN!?~@bTWftBS zfk(J4y{^WXx|Gp)Of0N9*DcK}m6P)C;c-at zVSb;z1z=Vu@%`%ptVm;6h)uyWsXJ}i*-+~}4Oc>g};4wq20Gx`!6v3_oNW$Ja0av#yN&peA2hdaYY zs7`EwlVfefO02G|G&@?uMQF4-@77dqIkUPbsr=>ZS)eXmq4j)c-Nmj7Wso)kd(gL* z?>lY)X=xeK*VzR@H~ot7^YW4{lsy&FJv~w#k_aI$7;DK+Xm6NNp@10Ey)Jyj*}=*U z@S?oFfwD8A#4xqW6@+aYp)If`w6{NR`SwlLSlTO+s8j~yKU$Ie|F}J8>J7e7bW zg>ApzBclINlK)2_viH!;$A!sgA)oxJ=rbeX?O%%XxZ?P;2)9!5A78mHUzu)2?a$yX zj~K-K#_JS37L6&aepmjFscfUCSw{!T$Z&_J+O4?$s~{@+C$Wf+>A;1tnHhUS-PudW z&1Gv^nVi%mT@6M_i9qzT`j0+>EQ^NYEkT)d3^&2R*4p@iLH-qw8p3I|@mA_d;m&St~-^3K(UL$5Fo!&ze_F16(d9iDKAMRVQsPp+^<(2aC98sM*Wz0vmOwDtQL>~dNn`YJhN?`)g^u$KZc z4+h^Ubh+C3&IXyxvDI}Di3l}-J{Gifxot8cLpsq@-~)15S?@@#SezbIxxv!Cb4&8L zgc0~tsxVIWT?wi%G+B@~yt@;qB4AIAX1+Du?REG-u|-=T&TbbNKdnU%%Z_UE;a(;Y z!gD+Ogjxljul4SS9Ts$-+}iW^bQghFJ8d8A*M*ZYwB0vAY~~KXw=9C|e4O)EM*3y_ zR|%(;z25-k=2XV&tO;rj9l0O%?Ha0fbFwrC;6@qW*Pp;!dlwoDsu8nKV z;-M9oUt65dwm(m)AEmBvWOdWTS*IXlx7@vM7^D7q-e@9#TsBGfP-+{Q2<7)dTtaH@ z$mRAWptA;|21Ispit})Cs~9Nv|NcGB^O}~HHn+U&CI-?se|ijm#~IjbM@DwpDJ>Nf z6VC0(*5!fi(&5RaC^u;q#ZKaLFENGVj)G<9zOH|B@U;J-(wcCs=jGzj;`b@(^P#bu7qZys))d@NR&~`a zqC)7S@&`F`{UU9q{ENcQ2LXuV$o0|@t z-=4+i>pscYyu0~=wae|nAGWymRb3CVW6X@$NAlM%jjy=2Ph<(kG#|QLdv`B!k)0o< zkBhBPx1eNdD0z9|caCs#)Ny}+s$dCE@b?>^a_+I`mK^}_W$8xaeN-AA6Qh>XXHSXX zQ8;-1E}Oc5(p={r@!(q>cgu*|e638mfg*ACYJvxL@P1VJp9?4G-!~d?)bUp&0^u=} zE+BWT>NZA%q5$O8)$@HUu*m#wXgSYE_*w1rR3=A!s^Ig!?>oKIji*}gTPK1>^HNqk~9FbkV`ZP;`4w4LI_1 z58EY*Bkm;zFBM^3H`{Ts4@KLtinLtz+~aeF9$WM*UjlKlqWV9N1QV?1V8rXs&T^p* zN5nUROzzz`8>-N`?NJk0qeYG#4vrM%<$8rfO9~1qcFWy1{;CSg^vyHlXu6 z9Gq{QaDjC;9-9;UeoIilU}xK6@#RUClpS zvdw4F@nJ!yEVpR(@aOap0WP_2j|$wZaW=?X%nf49cQ8>&tsyo)(g}G6>z5Ix98Q}# zwBUf6h>L&Tfaknu(HxQYXGRa(N(mw-^9LWjFe*1T+E~7s$lf&ixI&{89d|X1K>RVF zuX7@Zc>^F@=CfC(1j2DMZb7q(LYi2gPv@x@8{<>53}0jL8b1w3ny`tgBI*K{FnX-u zR+2n^aWk3vyF(Y`x&G08y|qhudSszPwzhi!QLA->5o!7Nn`t0R=3NBDvLa$*hOf*l zuZH5XRfn1Vb5M37cfBj4i^WMHXZiypt!n4DR9um`=ppY1TA}CJ2tH#PR%Th6j+(@# z6t7&_M$^~hk577l<=l)zg7lx+UPuu}+6Vurd;)48wpS1^pwGnLrzAFAF#jt@aEIfZUjdP=0XQMBuyiA7t?y4g8-5dOSBX{zdW{7WkgT-b=I;r0Hph1X0n z1PM%%cL?siB_(6;>dc-FIga?|>&Wsm?_f}6%FyE<( zt;+dW^3`k`9uZ`t$*U@GXS;<2H294rpY`3F81)tBP>WyEia{5yf#nseF!RLVOilPR5&1rQ>O$gnS z956DybeJeO7R@qk^jE!>?{Gz6FH&vEY3@ug)&Ydj7L1RS+FHFTC|n9n1a-K05W6(o z?L7TZ#>P&F=@w3(bAg#G@RlXupPt&^8NIahYK^eS;K2`uUgsj7lHCr9U@iw@6|?>&>GTl!XgUQLNjHM`EylDldZZda9ZK+srs&QtNgSWxk<99pAx;`JT|}mbm(X?35c&Rm zhd{;xOwz!*WGLuX-xY?DE0D)74{&`@BQ+A)zftBehc(7YzHiWcIiePs9S{LgIu7$? z5B@yq@@_#-5hPsQbjfVK9r4yC-Cy0z&7K835g~0bV0E8vtX2TC0A&1974F})|8?0fq0#G6_k?$pX06iC?$3`-$HfLR- z=Ph!R0pLvLOr5`D&v{gkGK8CvKI|8`8cthL+(roR@0nJBEr7hI1^!{?(ZRbcmiKq6 z{fk#4DQCRj<55_VmmaSP=actrg&n6Ww_+rl{LZ>CWp*!@Z*jFDayHD*L1-V~pD0M@uwya|>wZ1F z@-v!?z35MWYKG}IXAnwDIkY>gQ64=wj*eCsLFPH7g>N7bxyN7j`!SW|!6!0=)1ndY z+nhnEf+oG70)57gD!;bMUMw`i7Q(+B-m;x?IL+*k|#cMW(vF5m8X7<;{s@MFN zSf%lozmNB0D88`?Z0-#A#b1Vuw@3g%Yd!+07Y(pvlFlV~xa=DOd|&oA@;s`Zjhd{r z1YMjUOb$AU=wdd?1lruS>A;NkM5}Jh+1;x7YD}5q)E*{WBApBEGOODn%CMAnDXiO`i8tD12!54 zjgmd7e@;m=*oSceK!=Lft6dJ7WMNFRV69&#Dr}N4m1$FGgT0wr26xDi@Cwx;!O8cp z&DET{RzG;tNKkirnRr8eD0I(Uaaoru>mMKIBW$mOVpQddR^YXoz8G-%Ire>I`)*om zy}vsS^;N4FlP}qe7|qzVmN?NQc>F)eEWyAG8V(gzcXV0>A z!R1!#oy95CNfvjZ-kA%=`)^NUkz{ODg|`Al@{JE(RHI^}+VH~2ScT97yMA&WM10%r zccf~AFU!+>;1@(#*Vvri+*8WBRZ;t1Y?8{>D|;K-`dTEXt{($QNHDd8bRMh;@|w%v zmcD#7w7khxAkDM*ZO9r-{!7ZEEH7ZyqOU|uEpmWy%)iH;6O#>`MP#}?M1Uj7j`lCq zg9x~RlUrksd#_2yMP4OOVqAS4@M~UBBAUGZ%VSfodusHA)~bTP#ZQk2L;2iK;%1a> z%b7MN>v6OAluT$^d6*cX(+@qJ^;~Wuyv?sFGQUET>aFy5OU5B2WZk1`RW8=Qv=DEY z{_bMrRdlQll2nBnO-uN^s1{FxTJ-VfXtK4#t9*G7v+&A~gqswbC9TdbED|LY08K{t zyCWgW2wB#Mt#Tx+Nk+fYJPs9{OUkm@Aq%w3WGNvuatChJ-*UT@Mc5~*+0)6=(p-`62u+DSWC+8X^{egXQCFLBB*6?#s-Qzbgc+899<#lejMV&6w1$qr@~ ztxPmal74|nYUF3>E`kHc2Xf%$|6EekYIUI-^-<=!w??VjlO7CNh0?&&(SO^4tNHok zuj1gspD+wD0GXWq5h62UTK7wMxhSB6p_Fyf7aFa^HEuk5;8)Y(RGNS;mw2B6u_$XP zRaQ4%EofuiWkPub*A9<@YJ7DFwy(iLq7lcFMZlb84FtwRZ$wR~0?}595@4#3WlI6R zd8($0M%>J1&u*1MDGERk39?LVio2Ll7oN()G9$8M2EtrmtgT580CBlBXmz2MYM_7d zdM5rwN4gbIyU>x2pV?!(ML<(yYZ^s=meUP3=P_Z434h^JHcQr+;jc;C`zlXg26dJ+ zwm!_c$?9ep{O7IOVl(y*$vMZfDj@<0CI}BFPg+ml~wlW2lNPBUgJ4*Lg z!e;}p+rPML-MA@3Bon~a#|ZbK`C_(GfUn7GeSvv4dI5SP@5mjmKC=+6;vcmV$uHAq zV=-k$%Zy;xA*S6J@BBhd!Hhde=LD`(Bu~T<>%@}Dh z6^@Z3-3qf9UNBCaCXkZiVH)?H#oB(rOJ*FQGY07{g+S?u`%hYh^~FCI06pUsvoL*y zZW&M96%9Q1?9>FPRJQU7*)osO-mBxM9Qvb~GC4@Rl^3XNsvh53&nPveEKJ%u@~TSi zrw{O$<}u;ad;0BlzoAtbd)CokXdu*I3G+H6Vy44=oCJrxfRKliJ6&Hk#~an&ENXqp zhDBg9TsygL6#YjMKhG?TSqj;8u^i*F?cT`XGS?PpFK~+7=xtwJVUsXL!;S$ z#q2C_(<{ku?LKj-7@B4mPhcW^xN#dowok=HJ#N=freFQS!u9C-mY{=@dNurPl9HF_ zcvfbytt>VayHL|fi}3+TXO6FD%|G_U|Nf96zFnY`J}DajPw#9Tx*~vmzB$nfdw!%P ztqbO@uFz77wWt&xIHYMI(!k^eHku=XWBhH64u# zKf`cO>&J)b3YUuwR^AQ&(~!Lzb6M>+qu0ba#aw~mo)`EL-}bS40XYvlgo6cEEag9f zx{9|2Hsr@WmSbOR!%PJ#sB{;qGhn<)ca1=vs0gQu8EU?ktbwG=zIH(=Ua7 zd&Wt{i$S>0X&%a~g&pR=cdrTz2|Ca}1dHdI^k{z-Iq;21FV{4`rXT$)lH2fO5zTe#Tg%33o9*{jfPzKE+>QLe} zut**DtvNassZv`Uf9T3q6Yg+F$Qc~Gf4_X+zovIX_(kUh(-tr7W)T|irKFlLC)Ry> zt*dn-#QG+r>#mR31nFM2-lxrN+jVpOR7_J;`{ucsNt$N4T*5#B{nlx=(W)?@P`&A z;pJr+ujTDZdH#bS$G^2J-3@nl! za(}|(QA&*nJu1TIL`z}DbI$CLO2TFerG;3;93+?AYPc!$!Z*irxU&JlK(|L-BCB5& z=oUfgeQa~pZ<_&CeHkwv5!yOQ z)+}zU@}l%hM#{IA)9)*)9d*sN_YS$J@MB|NGQ=Dp_|oH2a>?=YvZmOVOrS7FN{IPo zY{M_RMdytCQj5(Jfu=j`LxsHGCic^l+&0LrqLcb!Bf!YR&J&() z2f?cSdGpqSE_-8z;h3743&l@aEsE;`otsU_n4e5w+qlYJ>E(TcM|9VGg|Z?PljIA5 z9yCgeszR?6_#t%}(8mus)*O4LE`e#z3nHKWg=Q@ z2@B8+x3-R~f<$_6=cHPn*F-)RHkz+_5bE_i8R}||YU=iqqqpH0%F{1f*!>Qg*Fp8a z#n|$Hfwi;^E-P=%-+KbS_HBxieL;JT9(BQFgNkMjz4#@{)SQuImi8!z!0!Kgy7gwb z^z2nCFo)^+@sp>;{7YUcF&7H2V7^e*OdaerJ$SY#b1tHn_Tu8hYzOy8x>&lLKR!AA zW}>dZ-B~DA-X!uDg^wdn#bP1X1NgXN*ykQoA+U!)}I(; zzeY`)b*MuBKY08_c4@j zBIW`dJZ>~Jc*c$iD|)PFf^w;Ipl0DCxMF^@k9UXA259Djo;^Y zjHKC7VlFL^RJ7;wfak4xFi5(Lg+18}Swky&cC7U+v9FFb*YEA_S^Yzi&7~W>bxZ`B z4NxD5+FgcQ2BbnA?@Q6Jyx(uGS*qW?g;m_O*UzX|>o{e!p2!~P(l&SwVp-MgX#De% zL?kvKhx<2Er}Ha4UEBJhSDUqH?80GZb*8I28u~`MY#13!0Pkl4?7Yf1MfJT3l>6IeYGc_L+u|ya~xWrf#wMZm%a0&V&lZF3Z8=B zr+LOT0nh5V4A5>H@|#nNE2`YdL{{!PEW|~gdkhB4^YNo=;_?z7ib_`Q$kTgUx#Fnr z%UtSOQV;IdY{ijU*Cr3@TQ^S>QS7~*=ndaExP@lpm)1nYBsdhXC&thkoXrWVrs2Ke z!-Ox2VhFl3%sGi4gPU^<%x>3hdiWM1)vO^YsA=U@>z$P;Nv#!hXS!xoccv)jkt`%K zIy%{Pr~UrkC@3fshAp0Ij0+2!(SlTVqPSLio;=PNA%^DjT)LIEjq%0wmYAReemZ^? zxn`kg>)kqM!BLr#aS1iI7VLcdMu_nH8!t`zGla$xCrQiYjf$?yX3u$30-Y)-ZcheS zQJQj2j=rLjKB1AgrSkp%P}T3nzQ;~Ehc%ZOQ;q(J`}9vt14e(5jg>q8(w#zhn)zx- zT>4Od5rc~mw=?~!$TL0xz$c+%^+?h@Aa=_K-o}O5>z7w|NK7l(QcqkE&4h{lgRpXP z9aW8XMV%Gvl`g4FT(x{Eld%-qF{AwbHuYTe=u1DN)G(|Md> z-NCPeOYHw8rp6K}s$f=Qtp#J~fG`4i(RG|8WwysHvMDZ6*5;fY@rkwh7UFmV$XejIqVgWjJ0;~y3>+D%_Tzu~43WA6 zm-nXJIS?6whq%zRq{Qm7&D-wqZkqM_>af4yvR~3vmloM|y60O>cCUBG8>6yF)c;Z< zoPDfptf>K?-i7Rp0Hmz4Au2HKISC1m{RTCp?I98xSDg-s4r(HL<=qXz+VVf#GyW!3 z0MQ93Axt9#$g@`>RnL*g#eG*fJFx(Mp@o*u*MTTAkg-sSquKobn|Y9As72+Y@o&D@ zyU8D4<%p)xaY_(R)}DvLtF)LH?sM#ND=#cA&a^Y-`r%7*r^hQADz)ya{)@^y$sf}U zyM8R5^IKV2we5JVoFn0Wcs2%dn8yi~i|2UStMlr7e5f4x{++wHxcEnRqLlLWeor95 zTsbQ8d^v&LBQPP^92vD`W8Yy16^KR{Og{@db!$XRflfb*7GF%vXlg8#^=uo^o4 z{&zZMzOKhp9Q?c9;nSy+MymfOxQW^5TECc49aGpr4eGZI0i6;*!F@AK>3;jo27&o2G)y zfhSKpqWNQLQg_9p%3>b+(dIw>ReSbki0E&86NzY{*Xb&!@a15szGq-ewE}$H*MFKF zad2OBjFezW^wmy9I-2vn;fEu?B7%?f>==-sx!!WBChJH{;GL9h?QdTP=%95_>XX62 zH=oO${FW3u`tW5ww1$gKCQMPBj+5x+-aY>KCHx;+%}K+`4AIGxtF*fh$9ZtMF-wgu z-ozNFI6yIsr`Gdrt2jKa3nBlP@v?`z*CZY^?qUV)aYJGLoRiwOp$heGTVo3M+qdb> zJSi#XeZ-zONe2~%Z>)uWpY1T;4aN7v5j8YUnh>cn!Lja_tuMTEJa&Oi6$&89_nI7B zT!M#rbM=-s9cK)trh0IuL`0@UjjSW@kWFwzpL#AkKb5WTzL1l*m?1??CO`O1T{r%S zY;(Sh%faYv^V%EH$j`GAspuLKew_oj^nigvtZ_TX?u=jJZ^RrOE4ZKFdjv8=@|jit z&kOLmSwM_F6rUz*Qvu<+(nqTqTkwi~mM|_H3_AGaYJn*gPh3)1X(hf^@S~-H;&Z~7 zEcIq#;oR5dGj0Wol}tX$#;uMdj2&^wP#8$w{6%6@NJp{@fK<_9_q|~Y$rn3cA;ic`Y?1{+zE>RU@cJj51$aS!tYyoAH0KCVBUK9+CMMk_(6s z*5aaJ&1buz??r*=(O$hBnPCl|65>CuI<&gdaHX9d6Hsn0?u5b+D4?1J7Sm1S&I$*9 zck^&Q{;A$7#=DLqXs3d0kU3W6Ac3MPV!!v;+6iv#pmkF}chma+I6Ld8I=ZD#lVE}1 z?hpuW!5tDjxVr^+cMb0Dc5ruh2u^T!cb9|v9P-}x&Uf$JZ@yV`{^_-P_1fLNyHD+^ zUp-Zg{l!+Jlh1`znjA9baV5|_exq}eZB5tZ%oZJe{0fd`!r56@CLobS{ouRfQ&SMf zN6gFl(Ak<+Iv2}CoS_lcSv^vA%E;HFq!OuYu|CtpG=NUQ)I)Z+ zJUtm4wQvkbE=?ucb_S*-oLuh*08njMMFIXtEJ~7shLnmeoNFRS)ue&qgr9`&EOY#B zAMv4w(U+0&ulLtA8nCcN27dIsYEh?ubP?|2r}ytKt`U!KRaGb2Buq+yqc5axL#S5wjDhd5sCASYN@>fF8dk;=*}ZsSJ7{0{E!t_VA98+gVS z2mD*HEW0N)1SXoS*gaT7q0kFChcMT0oIMxtw3h49@=B6{AJ?J}vo~=WM{QgdO=GlO zLmR7)G)7EybVbJ|XC*vE)4Lve#phd#f@4xaQpOlo8nOta@+jsP7Z;SVipY)KPR+Dg zp=zBOF#wBcRh?q2=M$a_>pk$z>~2oXOiq6Q71p#T5-s*0{~G@QU-%Q0^>LhRAy$2g z)buk&M+=8)@!VG+5Jj@6Qen5>#v;wjyCvnJrzc^nsfL03KtyA&d$vacn`x2keo>Ju zP^wd~vCHscdpW-@GzuH>eBm|TlFJepm(G!UrMeTilvi-q-}ZDy_(;R;TDcc_>3;rr z*+!_W{p9oNQFRv4z7u%>G(aZF4cA*)YaeEIgI1~?SM9As4ZN=^^qsiSC=OUJx`;{? zY2&7#2Hilpt~gV>=SwE{uV8PM29fh($B!n80fB^q9j~2%w=8YTt?ss$zzJhCjM0oW zT+v8#xLTyGq?)u?u3OtY0bi3zDlPSvFyJkMtT7>^%aqU;E0_1AkS^0)+cF?|3Jcq} zfcz6`cVR_Y-};6Np<8YXB@}Jvg;wdB;U~eRXQHL97{m8=9szi=CAc5soy_v#3*_^f z^YgW>YLT+FnI%QO^P;Et-?@P~B5nefe+_;opx^|b*3x-(nlm|Xx!CA;Q)H?z*>@qdY1QFD`uvmvFKyKGwFr- z62?%trnXI)q-Cy17n2RoQg+GjSz#0t#&we+lAT`$hjHuxH#4%lmi8S(%>9D0ot5vZ ztxkntfvgdGt7(WF7Fh2+V1NhfledAQRxyDren^M_r2-OtU94~i7L{Q`8pBHuQN`{K zQ2mXC2cNt*okBr6BsML?YaqGf-gw(;bCp80JXwG27Yi!dva)S-wC_VGy5}d%--5pj zHYD10z8@DlSnzOnUJNL{t2SOz+Vx*sHzqOeHe{f6qbGdI!YF}Vw{9snb(jq$Bv@*e0U%>ZUQ^;UaFXrWAQgF*x3}zII8Xo@e6m z&cb%RLtsbo%4ntVJUdQdY1RAj#pM8_G|Ui%JfzKclZW=~$18d$k5J=?wW;57K9P?? zuliKN(@MM$8ghSZ?GpicwAS6KqeYr-*z6=ZlqM|neHg%tL}g=JEYZa~x>!rvTGcAf zz?O1&b*ui0kg1LR%W>UXZJcnQoF_cD8w1@FC$h9zzE!6hfUX!p9C;mSEI1(s3JPDW zP>Hsl?5d|@dYN#5(wYF0MP1YWHzjCIQ7F2z#}6UI$hAnDyq6z89H0DXXMu9nLA-j- z0p761Zxh^*!^$wj0z5ghV_FwlJ4fw7Err1N44?9S3SYN-HmrF{1xNxVgD%86*A04B zRisP6(e#*O`B`p%XwH?QlTHVW8A@4?wKdItw90uuU&#^f?6PXYgGo+-C=F*XmzdF) z6?>1B)BWYpH;K~><((Qw*X^0BZdMM{&)`m183~Dy)F6clq|G0|Ys4OUqDr=(mZc>w zKY7Nf+VLH^4;4(06iiLi;2Rj+9X0a{)%CqSb8ps{BQJ=`VX*aWz7x8wzPWF{;P>IO$196|1TyKYo{xOg z9B!0B)FzlPFfiX_;{cy5LaqcqGR!^?@jd%48FW0aoaOm|-1sochFxz@nHuY#{OKJ8 zc5(dgVMCNU_e)511K4oq>c$_l`Q5n4#U-5^zYF;of9hk0i37PBVGagD_lP!DuwJUD z2xd^8tG6~z@rm?xTe3%ItmrP4GJm3~AoY!!sm_?Ax^r?XEM0zS&@=iIZbs4+Oa)Kv zelG3o^y9{jmFK!>-V|EGH|$9y`l~WN%fY$TM`;2Yv_GTsgD&&0SP*plpX>N(zKU@}GXZ-Pya(jd6o$LRK-$IAF%);xdz zxaRJV&g#I7F&P_lM}+f{s&W7s6Exa4&|lG0M!g((4^2+#w7PQxKgVI+^R0zb?BhOi zw-4mIClwWMq4=%0_5`52=m8rmRr?**)osOa%F$4AH%5?$JZ$AEbf!OTc^VsMZ}k9S!;pWuZ+vj&>ipd~55 zi+9wz4w=M&P3@&(Ik*r6U7j@D(** zc47B`SEYc>?q2aSXNeRsnG1tKeA(y8%anwlb9*iK+6EYLl{>9GZ2?xi%hF{y1KA_= z7lI4@cxSfJp2r3V%)TOxY>Hm1BNOGKfcqITL+!h$j$?BY=Yx{c4CJ1X)`QXzD*ZK) zITIF%4gWbpBe7Md?dIW21BA2=VS_^NZa2^DZ?11o|LrZo8nA4*)ExX&Z?WK4P(YqA zD%CE|;n%&9>i)6-u==#l$`#HfMb|z@VnCe#S`L@Z;#D>Eu3#H;}s`?&L8|ew7F4BTYB-$*@NO~ zRQsd{`S_k4G{R$9ttDypWP(eOw3OnM6IKJtCfQidT`tIJ)OC-dJO!onLqf#wjzj4w z=_s2zU`pWicW{&1X`+9{;8C4^X>H6Yg)>@4^QrsUmq8gDu8_cHN1sDAY_P*#FihMx z|7_Kkh#Bz73hJ1hyX{;dR}=J-IDg3{R|~Sqt*^IKIimEmn}1@1dCqUNBXlic*2mOw zcW2FOp|<&w>EyD$=wOno&)eUu-5x9@Ycj$;=q(5Bx9riBR)=|iGgwpVwxxL`h3@8o zqwV1lFYJVCj}fiKk&(FS8NV#AZOdFCj{|B27xX9=92zRGSoa93Vrk~wrBh+gh8VV> zb-us*E(v=9)=mw74Wb31#dqE^t+&5dG}J3{H9vp;3?U>dg9auP@OQph4(0D2AD}<< zAB*xo@A#*gIz@HS%L18H5>#LCJQP2q95qRgoIiGG`#q>1pDd=ioNDl zNND?Bdk)?(mmVNtVOPRC=qou{S;)#JQT^yQ{ebv8c~%@To;Nf5W)!=Sw}-T!YY02i zO!_mM(0@_?^qCbAh>s*7bJ=uX9Te}!HCZze)SGLT5I5ZW>#nx|BXfgXuaObjBaT-v znVM7kaPF7G5I&wOVoqz>VVdo==;|j^sVvUB4@5?yoMFRtr(aD{0_{ zDd5`^&04T^^|LbB~0PlgoYs)oYLu?{1{utKtqeoFO!Z_5h4#RR_SIk&4-OP zK%@fL#pb2C^mDYh>mbR0&+yr`#I1;f+7mJGq zaUD)U{0>0|Hw>=k%W-=T$>tcPs-n)LlvKyU`MkWCB8yt>P19i^KCfNM^Sf>-w-L(r zbE&Km2Le!byu)e@(f4J63(s1-vVDmZ=khvX6iB<@whbzNP{^jxjbG}}y zTSR*;cjQDfo3BR8HF%*+aa#QR=~9y_hP>wM+6Rh4Dd-B%IWb|?s3C_IIwhw2Y~-Qz z$v9JVU3WQ&-{vc5-xR}x_k%s}uv-SWsxrEp2)JK{63^LzpZclOetH)jt^WAYOMW~W zZ1haM(w3jsr(bV=PTs;CM_Tht!QJR90Ev{;7*i*%cm94lf`2qOjksjtz|)JvLPyN- zC|}gnv@IwFD=4Ep#f}e+>Bp%#F?j0)o7RulxxJ!FQy5W=-zmMw&YA1xt)05AYpw zZ{)0MkP=HH=xJIk-{a@Fye}(-z3voW;(v%fW0yB4nBUoNb`Nk?D)sPjrvF+p9(4o% zD89K+Pn&?-(!Qy-G&bE)9IoS-ogUV`AmQmqCd;QJs|zhuBCu8Y9gRl^pod%N>4WHk~R|B^jz(tVESRO}brZXmiH@T(ITypCDx@2VP@C)XDRDfHZ_3Dm-u zBvYOHn$X{i@nYAaRx%>hZNh<47I{_Adk^^E@@lG+#5C$EKGh$Vl0Ki?WUqOIaC9c8 z71_ml)%p8uX~&qP_R!}C4E7!vp>Tcgyqsk>7J-gWd$D1HTf8}xZK0lw>FJvjPB&1{yQz46rJ^s^B#n6rp@HEu; z`Y+DmLb%FR`3CPt_Fnk!(>Vj`WJ_I-tW@$>+oy5c4%wlMefU2Zm*%?u@~%=)p1SFQ zc+WEaj)IdmJ(>LO$Aej^YTQu&9*!_Z>6(d~B*aid#|Xb-U_(U!kg$Ez*cbL8(9V-v zbLMq-mfVvw`ea9=b*BBaQ4&!d9{u`70%3OZ;5B!ter{qhLN`u)W=sguMG$ur8k`rE7Z&MT@bt3*Ld!+WyVZi>W9H?d`ne( zbon5$7-x&G-vbo&RJiLEa+TmcRJHEq4ZxY-7c>VW_>+!Ki{_5XQsIabmkEq~i+-lc z7x3q~tC@{7cCVoqNK2}Nl!f~UFQtl2XhqaP=ZX|ZsECKlaTQD?|4Fv#7~>i8@S(2r zJz8_`Dxz|tc4IV{)nBY0o7y%fB`@&rHI>ReGA;&9!xfc8F_qlzXn9Zgi!J zNm*tdRnakiPbQOh#_f2SmfGS_n`-Xpo2nAjbp<&}34Q)&GVl3j390&`!s!^7yc;FB zy>{-OHK(wAaqZo^<0bA<9AP$V;DN+fVZj7HGFS@BH254Na+NcF{5Zv&jx2nAL|EdY zzT21r{6OxbP%>ZnbveRyUw=oiSk*G7nMT-h)XEj5oqO9kmNuIBIJ#n~eOhlLD{4F*ZP_+#&~vg`kzcZHlyKoJ6=fqzSb_<8^>+Gcq)}@ zIcOrLHWFIp@BXxdo`MGz!`eQSn>DzsH*gX#^=UWX9SoY6=JRJyvQVXtzU2bW@oy62!dV6qeh;-BSk%lnXnZXum#sZJoVd zbim!;ic;QET7g{O3sJ^cx15x`n#2uMm4POdrONv1cud(kbIz$&yQT$%Re98)LfVbo z@JAq1X|SYTA&$E0=NGIjaiRgUfeZ)&gXDX{^@l5?d;)*06cpBNK<8x?zTL z`_}oxgsxn@SiRdHz#;RLuCnBVJ zD>S(WS=!#{?x;p6O7>B&HD`v><3_r(^s9!JK74G9oi!!?tf{bSsP8;+hG#UNT|La> zjqZ1W7+Nm8$w2z@$!)v^-g2$>mb8{rc!dutt>!^`m?Lqbh_K?#Uj!w|0aWcr9FCTW z2fj&*cJ3*GV!l#9%eX3<1BN7(?|lqIW1PN0i}tbNiWQgB^07r60BN%^U;i;~0*TRy zGfjv)sY81F9o;Ua1W6m2sE_Pa6cpM*z%-ccCxuXSo=*q&8P`pS2l zO~&!|)_T+gKfOUw$c-ML-0S(C&>@tcURYmyr>{pO*Ij9;P z6}y|~R&^aav3a>t=FXZjJ9iXJMq9tWJfNGeO$#U1MHg2ax}T-Bd}^>$NYF{Y{J846 z7*tRnj|<&VFwD>je9qPGtB+?eE@M@w^9_?XVsIm`Hddu!3kflH9Y@4KFy^bnjF4mP z?itzQ@bD={V5DE(4laoOV8u}NkZj_t*MC|$ndBDZiwz!#&0g4I9Yv_8wc+o-^R!dY z{L*G4hQt)Rd`7Y@*82<>8^G;os*W1KL4UbRg{swzQBL?2VcS1GgtpeWx;1r-#|f`) z10^(OPF(c_M#*!FlQO>3`dIDldxoELl_fl3v3%!9_z+LM@NzWMP|(Qr3|Zi2xQq3K zU$Rp`qMUs3@U*%W=edvcGFG-#vFip#rCEoK$L)-t$j1q{2;kL=K(AFJ59biMI|YUN zII@dQZk`f^01sC4#S$2*80z?e`JB*$S9ld+?8<-k6>UC5(ZJbSsB=) zQXYhhf;O}uB!9O8T|X3^5!x~JHyjy|sE_re(N-Ya*g&sgI=&um#kU5t@sC~>=otXz zJDhXJWI;_B;}jKE8m?CIjJ&8q&R(05A6oT69~t=T8v(Jx@6w)D_6+nrk(rO}|5hHF zSTw|=0U#x|+3UW*%liJ_%Insx2# z;am6)KX=Gz)f4wLl6F>OT_1x&VuOPmWlK^&NcsvrSy4=EN^RK%Tn4V9HrEt26KsBN z<_9vKjPwhGd!`X%Z>Tk}_nvc|PiVLixN7R!Kr&A`9`!oSnkeGPHLX_Ce%BW zWPha9p!Vqqv*VYofkb#Sp1O!y55j1&8JeELsD^?lp5Pzmk;nY+QrsmflTTk=uU$kJ zyFwUUSx%*#C*0Ta z@T(o5E*7>cdo(Q&bUY=52J>AJ7_7bUv z(+@v0iuUHp+cpOz#BCtfbdAL8oop&$k^XEi+qI~Mf=`^jIm|d09>;_>H zqHj7lmIyz2!1&~%u%aaX;j?>2Ip|8jrV4su)0M5IO+e+>1qINZ-tX@2A3z7)$N=e9 zK&m=JgfkW#bHg9D!&$$uIHY&-yMY5Os*f+hq9^GeSzb^U4JOkcDe`k*x3^Ns-_lgj zgxK3j-)2Zy^p8OQ?&l_^kKu3nuV)Kh-estJP4u$rhq*C+NZEm){KO}}eS~ZQ@*E}f z^}Cz32l{chY(J?4SWwj_FGv~$6)~KA<#dHw+{czf1`P?C#;r8g2nVl6#;Id`l?i?$ z^f@WK-TrKZ<*|u>DnUNFV!QEk#mIKpZGZ^L&>bzk}RqCR?d%7~a;@=dD zgUnB`nAsYQf6d{Fa+2A87s7hs_7%CdU0$6RrNq>1wSg&JhDRc(n+ZY1#&k63N;?)r zeY(RGA+6<-n*-_XwoZ#Z(d8K{S}}%``S1%$owy*+u<0u~cA?zlU@HfbRsJZ>vHwx$ zXlb$Xgt$x~mywGSY1`^FlC~HlGtlPU<(k(}cbty0*|dvbv(Kg?Gqi9I-I=ngW?Ql48dv6Ki0Pes-6Og`1?Gn9{I>P7 z^h~~$0pCZqiL-g?Zqqo}$Aw#)vtl_(F50Hk7|R|fmQvLgd`(UhCO^l?!O#e?|7})mKstV_Nz8r=hM{e=dMWr}Yk| zR&8O1qW^kAu`Mx3S)Gzjk*{BG8IoDtCwL{u_Y|hNojyOdkyh{778ybreO+OH`!gPA z#bQez2z+DK<+J@e3T%XbV0fH&-@K`rjx44W8JtRFb0d8#20OOnQrt2O{lT z5>?m|zH@vEVDEeb-_~IZlXMD0IUw+-SU#Ww=d2T{t^rej?RC9zX#EJXA@&gqW$-y4B;MC+U znfq`uZr;ypngyLq$z`d;MMc-drn*F)&8DNzGQ)mNHNkM_!fVd{&)OLUav8_%w6|ly zp{!}bJC&BA+(CBnA~~VJ?dyBGN7D1IJ`QHQ#s0{6czykac}|izrkQwAEZWlo?bcTB z9=`*+L<2*E%N=EHkbCdf7>Ne{Hz}|zXe3NsF&eZfsLJ5zffig9uAf#!Hur=oRFiLK zcl)jye}!+3iuaqf9XTQXF+brY^I2(%q^Kp8!;78jZEm!9#__r#*WIwQH{0xRmg$&* z8rX;*1-JCcc5K|s(hLH!U*i(l+0{??`;nddUW8Hi=2*Fsh=F*k^JO1m-e#!9N>z!W z)gfrF!ro%X+iDYj{t3K=-atxL?rde??&4pOexu5o=HhJ>^i^+e9;>V#f%eu{AM^Xt z)br;?nslcq8KP-ULEuDa$5)}x~tY&P+xXgS=S;nqY{r3yaq)MrTNi#glqGx^seH! zu+Q&wFVlAD%Py1NBqFXPSV7m;Xf}*w1lUD2YwR+x=v%v-haIeDIB}0zs(kGarvH9| z4L&8O8h#V}MM8|!0vJJPLx|69pERFj+}hgu;9<#{%Hh0!UO4ck^@l;H{5#E1OreTB z-2o6SZBL3xg3vu;7xY{Ad^@(7znT5yL-a(E&|GDiQfeQ@=#vzjw((S zx`Iz((J38Too8Y0u-}{scv!kQhx!^`nkIxw*eYue#mE$a>-}#Zg%I0Oy-LD*fR@kLIJ*=4v8*5*v{1Lb1`mVCKrR-l}S8y7|@)9q21N z{Ok+dcM(q}wBWBRxr1_+v)Z>@H~qtCSk(S454__nw5nuWDeTZwCy-ha#O*C^cnL6| z%5=1TPL*a~nZ8wN8qFC3f>CtREPer>8j+q?ba%T8U7UzmFz(7F`c~UmF>J`RR)A+X z)d&B~`^vlX#qe?;OY}|P*z&GPlW%#5^g3?;wG*w?1>5eIaOk1al3m6R4{RI7)`6iA4NnR|F%{!Q6r>X92%FTx>WK2gW>oUA|?{K5^K5 z1~#1_f#9wpD*7aWQRW#g{iAT|}J zXy6HYx*1D+i!#p_hG9;d*5+I{PKt*fl%jOP48?MxVb_sa(w&PbtQ~#z(>=0(zLnt-)Ldj(K;U@-zi6Lv$h`moQ%E?)M>aPcmLU_E+RtS=(~&0f z0)=IzM@*}8-|h6M+rPaSzY7l}hvF<6lHMBs?H)FRxiJJhVh!U^o-35 z@zJH+5FAuYQB1`5y*1QnkI?!**^(9)8^GeM-;dFu)}}$f#B%>5=#HG_5dkIB*rQr$ z^feCxv@>=L+Rzwc~ ztGlAIa{n^qM-ipQdW=^0r)`Rl|2uoSwgr$JUI5}CV>+FCWLYfFTHQW1eadb3I`$rB z;8yy>v}ko|TC{k|k{)3yH*4ISNN>2iebQL`1SXtcu_i3nY2@x;SLjmN@1(BeZdm0a z4w1;qA?TTyw$SSlp7ULKl6@`ShGkZ?;=b;|G>}0%jo>Z^BoZcG$BmNOH zkNj#uF-de<)9^ayzUtn*517K%J{jj9y&%CNf86>8ogQhd&I(1LpO=>X^}X>$Pz;e; z5W^{`JAYfMne~T{tnI(Eqv#mr+HrQ5t2SjF>&7z_?Mxp=z}vRY=zg3|0$)8@PU!SH zkuX|YEtl&AW;FU{u0&eelEf?QG}~GK_(_d9v(fcuB$EX3n~oZKw}d;DYoXPg^mA6k zagG!gpeA)e!=rz>%>Rm~=t7_g5mch_bGz2!NS+PF{K?ZY5G$3yOG_gbfqY{U@?UF+ zHF=j=C(?g;`iq>L9}wWazJ(VcUIs=jJYfA7*wgcKVOfcn@nie~s6m}Bo{6zJu|5BX z*ezXsl|Uq2i6maq7eKwTB6>|;Y&B4wOj(xFl6KNL;RK)iy&TL?tJfl;%Q<@kBP`mgHlPk-m2 zH#=iC{`!80?lkb@hn_jU$~7Ypdc^0}{wE#)MHXRdw36YqtZWg@?%zQICKe{U8GOe> z$1C9VsRT2b@0(qJh5Pw5B?L9!naSSXh`{SJ^=i%h(~Vg6jydSFbU6vVx==Hepqtoy zF_GXKM)b!J8_lyWx$;hoViC1IP?CD|Kf0=TduVgNtuM< zo1F7?1O(+V{i9vc;*z%DkGH-5OprlMtzRRefBltN%f!HAbL+ycu)Z%Z_aA)b6^C`k ziotbG(MwP^5LMLUm4bAXEBByUYv~sk0NpHuX!YYb6?3jf_e+d(y+!CwUwK92Y`$1G z8mNt0=FGu|WGrDlO?ZqN?9c_8x2frzkO=C!oR;GKe(+x$L6?8yLH`3WI`d89O7UZf5Q(!SqqDiNR7W9larOTa3bJ1Kx(SL)Sf?~}^^?zWbtmC<&YEmbljLYI$cSxL@RJy%( z>}Ot?Hq-pZX<(PJGgHSV+L9*as0ht|_`6++J{(l4bLyj1(EXzU{OV(-2r5YUz=}L} zJnr5Hn=wYi+u571p+_~#7z4$G^Q9`#5vWRNmi?QsVr#$L|LI5Zuj&G5e zl58ucO~$*cjEcHTrcryw2?gHN9GSBqm;{4@b{fxj-fcX?4Sin`kG%;jwmbPh5m2(4 zOOa>+R$i->;$(1nQ#m?$Zl~1fTf74?beSO}({V!n;MERpBfaIa<1G|<#thh zn2x>MNTkAgy^zq1t#!n`*SlD4fb)T);7G%&yq@Jp(j}u+Ipap2*~UZX8HLl-N-=Ab z)T6=$=t9|^6U^Mbx-#lg*Yu0BGgZXcqiy32>spu=Krhen>+$)NeLsmS_L5RxX5FI9 z3<9H6dhc=iK(;~EG6hxk_cwha=m+E^2#24ZQ;IBx{;(puxw)yJ2&t%8^bcxN?AP+F zPhw;Sp35hKUru>h?SRbn^$DBmFQk`)M{kQ-Sd1(${<6y8(KD-u7&j?;JkTE%1X;@3 z#Jas&T3EK01VYmqe*A~vvQ|;1JV}Rwg5s0Cj6+Z;DqV}Dx6<)6#dr013zGF7p|JrG zSt+u)HX!ScWq*XemScc{-~=*`x?ygW-)ca1_hLOBeJ8Ss`z^S`!l>KAX?dk^K?m96 zuYWT+|KyAan6cm1l`RPg!A1p8OVU5gqi*9V^I!a=!2gFqPv#}n0vnes4BA z$R_^{T?OqrR2feA#`fU-?!_6KM;2`dFsY&$v~B9(6nbs=$&(~(-MVB?^;_L zY>EpJ;^{(T=Uut7?pZfS)el73z??=S|A8=V8f_R{<+fHo0H$QoAae@HK?0S6(j1%> zZn#gj?3Y89>AORn81h3Z=uk#nnCI78l@xdZOM1P(h|Qj{O)a-fD_PKr*6RaO=d#MO zCu|ug{j$C4H#ZD$Z8iUirNYe|=sYT43mQFUPnev;j-$jH>+k4t{eVLMc~yw?@{nf> zbbRPdfKY77wxBRYP<7;d%=t3 zp%Sl#h@yw+ypp7tg_|QqL3nm?ihnF#gyRbWFs@+@tFCD*-14n1GI0Xnet$BCYta3~K24CCpsSf%X)f zBz7bgZ=jV{d|W*$GE>&$P-(KLd#$fyhclUr1O1$cAhMjIVDbs?N>PJRZ1ov8`e@)d zwKd;uUZ~D05Wpau{CGgY87G?Mq-Ljid4^JXS`sLE=p5XWR`+MmJgx5E3KL+YM= zZgE!jA_c3J9V&YW_zQ=GLlj+eGYUE(RdoLjxo`3^cs2<~X=W0-wqek7HRgW8ffFk3 zDN?l%WaauNlUS`_bvaQ?lm!E(j@h6|`PW7BHrYn>LVVpn+|HQ2HgY;aaJGZdd-^s~ z&Qt<~xO^x!l@OG^>K>aHS`B{28#NIS8tZ8qyXewGHm0?h#+cR#tFg9MrmB1P!RE=j z1Q@M!!RRndDd>HZwz&0_e7#+wRB8~%$=fZ4t<6?2;iPQ^rss0}tle~zN-h|ZW zA2G?t&t>*|(}5<`Y?bcWY-Aqf_k8)*j2-yswC|=8E{3}(T4iif#M!;Lnt`epb{6)L!O6jENBskNLH8r2DQF$Qn#-@;P9S4I_4gv8UFsJ3LV-&c59L z@*=1xyONFWEegsG5#>Rp;sx^A&8?wZ7u6MKfto(9U2 z2D-3$!%*wqaW=;ks{u(JvBFOK_==-k~y z7zG1hvD|B6O;=dxYNbd%jYrNWdUd9Se02AyM{7yz^TT3^lR~%4NY!g8c+*1E zM^jJ+-FJ~JT7#JAF!Hvsuvt23066}7hD=Y1(0 z3MWkxA2Z=oduxx|+|L8mN~tLF0jMAW?r%A!tk%cmm*(T&3KiWIgY@NS@q*uWzT6&P z;vV6Y^=a(wZ{sP(AHS(vi|Fy(yI@oLQ~DJ~PnW+L1_nftF1c`3&pN=de~I+8bMdV5 zWy(0soh~M^-NEH<$P7wPj#YWh4W`a`Nxs4$#|eijm>k?ro@#1(1Y1Cmd5;m6$&2>% zr0(J%j7B~fQgxIg8fNi%OM-fI^e<+mB&WS>zpH?$h$XP?gv!}_6aNE8#>GJu9bB|D z@DPX%fv%C+>4Z^|h|_d)uRU-Ic4jhGb$yUL4FbzCzM`T8+zb=&mRO_I8Z%YUH&lDw zYDGA@Fg@m#4Tm-jb}kA60B7sV?L2Yn4u14YU4z>wj@sseOKgNMrMzes@==>&R zE$!1$Rs;OwsC9AyPg525V4>23Ma zs8p0uXiI7Qpv@fHN+DHNP?8n3Sg;vyG2~6<-QHvzx z@$}BFe8!hMHggXZhBX-k!0C zi>A||-EbB5$Y4D#9*#$wbKF}|i6ySB+H zkUwZb=vv|Y)J}KO;f>N{pZ#v~ok^UGH0PFnORNrcMoYr;k~n|#hNzG+a8R8`i;fuM zTItu18eRM^?ehPkF6|%c>w;9W8JH4#=!~{B&}Uduy)#W;uN9mk&EN)dgmcy@`1%1J z$yXk~OGGB0JX;*sw!S<)$Z!EgD>V4!(qIfs(Pom#t)LC{yg#M%oa0n`HhLf_27-%Z zxHikjuc(zHu?c{ys+yGh=zQ7N8l2Ei_f&KzZdc)}48BCWF`zYoAUoz+asP@M{!#eOPZ&w#xKDo%G zj9dhKB?!Mj=S(*Nm6fgYuy_Y8q6`K)ugjcJ?7AKzBk22IJlVnAh3N>tQ&)rx-;ht% zKjxjelMb=Fm&qt=j@jisg6!!~DVWCi|lrVv0Q&O5~>|k8^!w%=- z5POXk_^|)^Oc*;0CX#`qH72a}6yS38O(LBo_^0e@_dfRRYmHMur)=6i;H*Pck*cV; zmYxU+MYL2`dstV`7k+*oYT0Ai(n{xetM2hC%|L7UQdgIlY_tvaQrEI4-7Z_Yp~a%r zajCIorLT5G*Bq{o2C6C<-|w^E4f^-IwqnM!kKa|^D;9kgr`fy>mVuyP%5VpG87e+g zT`SC@$%&8I6!C=VDXWR@41AY3x1Tk9`Yf!7DZ3bnSnx0yS}2y@7nWPDx7CGepfQJ7 zQWnpuOk)!fA#?OyyyYQ_OI;sLO09^Jy-#@!1BrzU-7U(oo1lg|ymSIzdk2@pm3XT# zlX*bn#`*}!ytEyNVk+NKf5wUUd^b$79PPS`0wZ#piFdpP>cV91tCBi#-`DJ)Bh+bS zkw-m2-2GEkbHKoi*XCa6j?>q{!;_a5Q6jstvWet)hH&pP{i4+KPzVDTN?808R|7## z`PhNB=irUUXjVbSc2yI)IX9+ZZ3V|*eVSsa%LaNvJ+ob2Yx09ub%>&eAMMI)31wkE z^RTp0A z4e+MYM&$Kqqs2bNClH`-dSO`aIPCK)XjFeA#wLx1VttVIsj~}49))r*GZXo57Jyrg zpPgggl)V?zZBzArs*dIhT-Yq}jk`nj+!khScr&W`68_Mj;!%=Cl1{z#k6TQQrg}nJ z7d%duWCOle?5XnF@zrU5hrJ7@{FRZhGhE-1J?N6;nn#35mAP5*mJFc9NF9&$EvI2g z6~W$Bze+=o|Iq2qbm9^v%u^%h74NL{ef_>$`<*2v;YUVW2iaVF%}tseNo>6Qre&rrQ@rCMMdU!@JRo;$o`ZQSI>x zd{(z3oBp06AhE!?N>Ncc86}5{GdBk*{cau$Mn-!}hUt+bzJDNxbOrgzI27;L?Me(! z8lw%jKWU!puj@XZbaH^$?z&qGB_niJSwYL`Xx3ziUrt_=KP76v9Ua@*;o0Pru&ja{ ztMTK9S*@vIX5RZVhup<*0_{f&cDQ92gg%27RnN#sS!8^AnFJGH=vc^rSH~8ClZYKc zbWDuT4|_>)CVNt~ZO2=_mq)LUW^G=N8LyxUK|{8Si+6_=wGPXtmV?gOW(eatEA4gl zkx9L2Np|kC`%}SAOYNz+X;vHzY0>P@yej~yZAW*U%7y#&J(7xhi?O4TSnA?|MKsiE ze1GHUrDb@;{vUkey-{tp@OE1?Pl7sD%>y@Mbd#Q37z?65UdCoCzvP9>tG_;UL$mB4 z=<8i|WmMa$(S)yAWyvXL2?d}JF(-Q#C6vC-efxE!5QGt(`m1#Pmk2KV7aD+K$-w=c zg{{4UmDNbW-Q5YHhpxQqIqE7$p=}6UXd>0r=W$cUX4bDjQo>~DC9KQz*q;lxZz(sR_8gM)&C1|&CbA8k0( zeNi$+K9g@)m^c6Mn2R??2K|~SO^*)0OG*5)e6^W#keupTn)hp{lKrG6CPz6 z9ys4}Y_jG&c5Z`D%3s)fNHF;EzC8e$le4^59q|p$r4j=W;h~F zprNsZGmfx>L!A%e%}3j=>D)@nKxvNVR7@|^y_$wwITQa5^YeL805gHDT~WQIA+A7G z#=Dy#!0!~VC+yf~$y&X@S;mO7<PtKAMb=W-vhi%X|8E0!@?Q9 zq!DCWlsT(|BQ*{rz+)x>L;d4guaQMkn->ZDi?vrJd);t3jv+~?;+qg@^fvAw@G!=; zdXw9#erpB=CHU(IZY5L|SKA_IE_SM>T>`gs|tv;%cPxNbz2`y11ls$ZFDkwmaAoa>kAJRg#xb+m_{-KOci6hnsbc7&pIgnqvrC5^g7&LAl7?jrK+ ztSJp&89CC9x5u+`Ba`O`h%gLmTtYapnD6<{(aRD34C*oAe%OxXUVfod2dY(pm6W~f zpAKxiJ$^io{|0j<&XCXFsWl+r!#OXUG`#PLq4 z7B>c)4$DrB(GlI~Y%&&Lf%{S)#{ivxQMeCz&y>VzkE}j}ExFPjn<-`syTcLxlK#wK z>y%hGpU!9|o0*v5i87hOLaROLgF<9RloCXb9(g= z_J(LkL!#A?j}X7UM*rF)%n97lHziH_e)}$dw4?%XG`rT=5;ULr2%nN~Le(l7Z1L_Q zI!fC%sBPv*m2>NZ7hQU9%(O#VPkD`c&;zmS9a6 za^v?O&@N82$i)e@dKPYP(b7b&1&UIJemgU{XXTo~i2CI!k2#>8FF6o5{Lg3q4}-` zSXg5dcQeH=0AG9ejw7^QLdP$X%a6{F&UY3XnD-(h`oN}0=gYbHT6LYz!$y*o?R{hL z&Bu$+&bz#lH}MrN&pAU7m0Ok2&HfAdNBtPO9S)sR@4CNFP9NwqW7t*Z<*YER5g2Wt zQmZKP`7}R!Wj0oPHI+8%74OguzV03h9@6Yh{7Fmc@3$y7=)uEgLP_86w)O$VVjKbs zfve2O5jYZeU8?5n?Q}cmx3IRpxB2z)ueVJAEjuTP-R}LW9dx5EtM!XJ&;O$CEd%0M zw=B>gfdma9xJw|oyC%511!-J@yL+%;!5tDbxVvkkO>k-4wQ;xCgtlc_F7x6K&gKFYk06ZmJ%5{G&XxX*5`a-J+$3l8TA774YUE(2wCEkE~a|gnY<$Vl|iPqcWgQZHMhp} zyW2>)Uv=OztvSwM#7y5v&kFOxmJX2IveKA)=X?q8AXgG#wQ$m?#XZ09sQ9-(dE1_e zkNp#_KF9Gx(p}2qf(U)Xu~|{`5s$fVU{*MT$dVZbMvys1(9S-&-0``&8x@P?r*{K* zqo<>1FllkW`csU7>8q+hG+)g*_R1#TB$Zz#i&xecnbl<^+S@|+KKBMF6Q*ph-W_ds zN00tqGLo(Cwpr(GbD1CUIp>(Hg0vS4b#K+5O5q6w2GPw_GrM9Q9nw+%mcT|WupTya zX`NvZz5Fe1uk>;xUg?a&3^s*BZIUXAoCCIH5eXtK_dfp;ww8!Z$7g3hVcklIJK+L- zbQMgug*<8x@nNQYb@^!> zRgeyMVEDl8elu?}GE+3Mc-`VX8CzT~$P5P%YO+|Hgsl|E88k3P6!yD<@6|gT#l-mw zzQ7%+xm-1D<%4~;)ipNVh8$inBTcTuIsF!;s~%THa~R~z!Eu!HcEKpL?eExUDUe&gfm)n}<`>25}KLh%V2_YLz|zaRU;XGNoaW($UeC*wP&src#-WX1*tf z`p@rKMZLlVACHzPD|+zyJTWGK?GH!Fmz$J@cI1KPq~)dmh7)m}yz&Bm?h=xBD_Q9f zLfa0(!}?d`+rz`cNDmF#Nk|mCk&}}f{B}Z%G3YmSeRGW1KQe-P=QF0nh{IS<05GaX z`au3{j~uoOi)~4H=eu`Ub`87}>P@tu5tqMbXLHxW7MQU|pGxCfnATHf@8IH!KFcM& zQ-T6LfU znHjH5yDf(BemkS}Cv86L>C38Lt%+0ZRp!N!swtv2a}pJy3%}o>5`AncYH<<I$#oHA(1)cz|LijEe7*)v2o#Kp~#W5sh%!!`7_F1R?4o4J;|OxbqU zWlF@1liLb?Y-I3m0DUpuBX7GMeybNCg+Vb<{}hf~#r5IQa&BEwz(!0?1^w@M^BBIf z8`3x4ssR~_;$C=_gK&H6bd45W0P59eccY# zUie&XAz(dYR?b}LrQqtc^?gF9RZF0ZmQ`aBg=iuqiHlY0*AZ3M_a=(j_z+wyy-JXN zp5aR|t)wj87*EE!iBJ2gHI~>08tPaUJ;CcC55Sic!N)^ijY=kJsl2z1FD-aO`cd-@PSwZ#&TdHA?sb9X zb9cvevzTUUfYK?Koq@&|6C+P0n;ggxp=gy#_44IQC^UY9w>j?r76W59kdY^BVHOt^ zx8<=90s7U;5cWH_pvW^ZQJnNm$M)I94dyF&Ts{~2{N-{HN^ zVkPop`B|Yw3s2wLwp@UI90A!!pf{?MnU=byMsH+~Sj)LI=k}6EQtOoZ(LUwkNVrh# z*&Nuju%-*Zc|Z4Wm^9e%LH<&9`hI;h`M@@th_5Em-fP>Xt#v~mGBFzKzUKYt(exUb z`7O@zy^2wxt(1XPg#YUK8*9s6Fuq@hSe;cvM?8Q&ccV0#dwz22kz4)Y)P{Bm+;6~y zt5i7bt&fKcq+Y4;yQBpjJbYU;vpjLV*v|3+C1a9Q8JMxOMTsXjY;ojg+zDiDnVl~! z2Sf>8dMwR}R~j!avvAqydt+ljAC1OVLw1_N9Jj;Gq-*GJdvb?ri$35KRi?=A2f4u8 z69*-KYn|7hk5IilqV1micnD;(!9PnhRY^{gan^q|eRLvUlw7`i6PhE($*)DH+3xYW zx7>F9PGCE^{R>Ra=uvjhk>Pl&)EZwduS)k%z^mt+p;KZ zGyI*psNkEGi||QAQgVCzXu%sw^!oOp#FptOre<5q4wefth`^m-v-E?(71uJ!Mhn}} z?AfF39NTxn@IQ`&DaJf=1$|lY_D_`G53O&Bus!js^KW@-9|$ptGe6$eo4mV)A(za! z`e2D2;g@Jyrdspnzgb@ zA9=79SEMlyLc^-h=2#}}@EfXsAW!OdWba8Qu{lQ+QKcT$!r z>n@bbS68a}rFa)Car1Kbm{411mbfKV};0*oFy2<82@vaovr2&;%N~IufOmnz1 zG0J7s%QHPlp+sNp;nm*dlmA*9Y@t8~7SqGG_tWT1M2xOj0NA?RcW=MQ&|F_Qf_;A5dQquGs%UN`g#c%a zi9+fAuq`J!ql8gTs_?J6Pv^xvJypEE%SLE7R8*>9>zNWOf^N9c_C5j48dW|0?fj!( zJ1zRw>O`AqL*>V+dn`-*6O&hJJHi-%3)c3AEL*b9FDrLUS8NZBA)0opqvvkLZ)@5+ zN1GGLj{b3`pPV#VsIS!=y4k|CFta5=Zi&8`=(FjfVjxPsEtCRYm+S7q{IIEqEuo)@ z&ZWw}!6UYtajZTF$Qos41`sOF>9KwOL%k4an&i==FM#iGi^HhdlrL?BRIw!sT}V)* ze?N7mW-8%z;3eI#;1%cA)nx+a4n=sd8hUlI?vXQcj6jW&j_OA?lgayjEg@4mtlF>~ z$;cPB_2f;;Dq)4K!qz~PB$8W?O>Qu{yvaki{Y*Kq( zE+;{n)9V8tSdpkpRdt6Az%w}ZCJ|jqI>K6e@2DhP7x0-qlsPRDg5KTv)nU&sob*UI zoip(YIlsbV6 zXN-#iGw6$#a=fEu>05Sl+{AABu$37GJkXaQ`eNGfO*%3=fTX!luq99=N{l`QcMNEz zC6eVDOuR+zfVnGO)6a}H_JGA6k1I8t3|T$b*lrHWrUDW2k9ecYQ}b-U(RNU;+zQgr zoFA8!`^cforC(7L4X-<`YuxvCnvo>Dbuq+*!~V;RApXAgjh7jJah69+Z?ONEazCgP z$h-B#3D93YDJ;>sLSeJiHn+9Pr|ntLE53Y{b*R<3S6g274!L^m1pya{$ypS)y3ix5 zD;^AeaZokiV^5jPPnAM7Uw*gtPYlTMcK6AV9Qy!6^(Epzz?H)YVo!FNdcg&GHFhb- zH`bDV4+e_T13*oHvintR*XE~T2#C*7hgxyK6+mb-f985&|0!7TNZA3>1E&1eU)t3_ zJX}Lxy#BJjsOVec8P0jJzp1SNB$-=H+4vPP9mmuZ<$LNYPXH&Ku)4as=Cb;1FS{Hl zQ$R*EUK>#c%9@q>x6~1j@Q6xFOK+pXzCe-NeuEcfxW4wQq=fR#tFIi96mMQBepV0W zQs$Dm==e(XMgv8b3`<7)szl8A?6{U2nLtF=Fv( zDfIoe$wZT}h4D{DMseS$|AAZ0Smok^5tvX>n-G(sWT4{j^gqukD+4xQSd^mJnno4jjFQsw$W}Dhy`Nm!Q<+Gh>Ig;WQf- z;lygtMQCO4)o_BH=EH{{H7x=CACmqZke_%E^be+rk-mX)dS7ctW-E6}$PV_KGtVGVUX`KO{m>w^(e0tmO*UPVyeDB{YfWo?Qzdqt; z&XqhsGmR{fADj~SEyxER=2wO5cFmS^%uXkVh6XB7A+x?#%@5u*xaqv8-mM{!`?nao zBv1s0mrp;0FFe0vDNb+i*dFoyWslDbzqkrClm-V{-c_hf80_FbqdC7AmsT(D@vz+l?1_ znL#bb)sl6stsxGW5!WyIpK{ZP2wYUAb9yCNk9^ZNwPJA5s8xxLC(Ll9G@Byu22LUX z%~3Z=S5@||7%VDD)nAnGV{nsesc#G|(ee&;58aY+w>V8Os@-o-+(5eWo0(en8@6*D zm#28Ek#vT%(E@w{t?l4WlNqZ_ch<-%By>EA^-#y!m}W;z@Tg~{2hj{P@VwNr;n2m5 z+J4VLoryS{pd$5juG$&LY+p9wtNz7kr=xX-!vz zQymNc@xA4O5sW%=f#4IxvJMP5l>GqEI?^mgMH4=AwijsaRkJEkSJTUUwc8HuM`FOK z7Tg@i2`#pmT<>yM5uu4)<{j*w17-RCXCBKF;A~c5Mb5Qg9Tn*PpP@xC^{_n_KqVVv zSM<;$<2%>3u?MYkh%{QkjmU!IZyp1yG)hcJXMTkxT{}U3qff0=c-A zYz?dDD%Q3u1x0-WBO5Koy{gK+M)pZ`sr-mS1YW#8>&9=!;3|$j6aV9hk$F_4^d5MW zZ#$uN!>L=c+~f(q_)=_XLC5f;qLxBaZKj5;7YpNY!9p7a?+n{fBN%bW79;JASnb(u zDbasWR=2A)81_8)1XJ*7Qg6HnD&|jl97-sJ0i_1G>rG`4hNMQt$>5jQv~<5BWqVCt zh`X&LdGH6;f=k=~1AqWL{tbYL1nrRCSu&Efw-_B*_ihhV6O%Gbzrx5C373?iZajZy zw#Qe7l9nG<9sP(v;Hb9r`rDS^uw$`8tm6j!_F!rk@trV;;4cd6dxXD_?CEWfr8&4jbuJR}JLnk2ulmMTtnsS$>ENyk6I|Acj^#?r8 z_5_8&Ydm_L#>}9`v{_A@rCCIWrO?px+tlp0p(x957LT%i9w=xdTSMH|D0pL4oIDVu z>h>`cCJws*+HxWM=wkCFXlD0z6EL7`$eV&UU5w};-*x7 ztsMdy+FluG$)(TNM)%!LSIk$HeYJ;PkgsQ{DJdxyTIxV#8#Og7$8Dw^4Y-jdj|CR{ zqTK#B{OVtdilwCGAy;iy>V739B^7O@72y`C=>ndKp&#nerZXP9R#HZ)M++*hTmj1F zMa1N+Ehrnc7v>-`Wo2dNh_YSl;AcB6QE6|ls;>U_6?|7}AI2;A4-9nOL`0=)QX28< zuSG>a{a+)Qezp%b$NdM(^jdwwUhukfkMxi46vFbCQP;x~5fwFlWiJ0eOKg9saDS_` z{qx3uR_glSIR1hs?~VpI=+J9*6PGcbD7TmEdX&xB4!%kSeGr4WM6I4z%6$@=!@auvkK z7hBH9TO*ju7!J`n*t7p(t#QXa@O$L6d+FM}5;Opsy~CP(194QbRtth0m>7+7Q03S- zxr*MBbdL6#4-(N^0=Zbetxd&CL`;#*PRL5agLJWy?he{zAPHwiU(BNR z9ToJ)8Rh2*{wB?}OMw~Y7+?LACKHj&7tZo}OmvdiWP%#;L*y&l*4WGc3LBPHFgeo9 zGG%j0xkcavUvWyXU%TA#l)!5@N> zQd5#*z8)$QtyA?VEA8qV2FFd{VB&H0$vpaR5wG_Do&9Z_xr|mspB2wFc-pgGVqk^V z6VKEjv0BeTJ*v!O2yRq(50z2O5ikbwqsO5`RlosMjyu-S<8&rYFBq z=($9n(=`ZK>^o0U;eO~e1-y>~tDW1Q^N^0nYK$BO%y*xXHb97T3&(EIWw2dK;gKf|*6o_j^A15Af zuMdD9qKfF$O868EE%J3Ca7PmJ?-H5;mmH>9=;c04ac%OwGRceDsoI(ZY{glm-=fZP zd@4E^M72mp0^QhReJ#BU(B=!L+C5aFN{0sxXe3Ve|5c##AqJ9K^Nsh#5U2H56-+y~ z4A{+wHV{TeeklX>SM&=_RbwbY7MqR@LzlIx<0|1546Is8YP3b1RoD0K)H>@C^>H67#o|Y zP?-gj>PX2go0Sh;R{RN@W`lzOvLn~YQkw&Nq_(IHf_J9gUyOtYkcdb@R@BU})>AUH zdTe0<8(NTZ4R%nufSG6h1xhxxNu0WtWF`7>lColAS4&W#>IU|zCBufHE`GQvm2x`3 zMVI*t6GJvtX>n;3&%D3lAv!Hw0XV3=E;aZCZW&6I@}1A^c|wvhm&aSJvZw;^*J0UM zgk7!r*4*!dW7WxV3+@a(5UP0-l!{S7uY6=z)dp)<^c!y?;Nujd>d1c;(VB`ILl@|q z-ZHR8h&Vmv7}|lxkljr;jk8bI(Q8yZS1s$(zaY80q7^@KXB|bDU8pcs%`!88Mw)B9 zz;(tJCI|}B^JywcI6?yZyPTfQYqn;`{YjOr`nq=W8NzhiY6XK1nojZdp-RQ)6*` z4DjLjeNYM{!Yq*fhSF)2m*13{yRqSOG-Ud+e{c|KAB@zToIfyEZ59^lu&*B$+F!x( zeP%j`Cqz<8s*@Row@tb88EdS5;AD&%9F&Ij7uKBMhFaY`6O)FV95sFnj2LEfs9eHq zT+R3D8g652E7-ez=R*>55;(HFQtRcrKR$os+2j=08=^yl^W^j2fX&5$D*9CI&*oN> zC@Oz=gBZSei&S=YHw*LQB3vj45E1@oP3tdd>u-l=ZRdIU$FQ;WJE=5uVGWAI)ZqWY zNxarjcBuMBN>1*8Jnn?{%tHKcn1+AFRQ&bX|7M!Mc#HpAv%LmvIAuQ0JPo$rpK|zI z3;~Xdafpq4imIa{2_xF>EFM>Jm`>Ix=G+hp>BI*O^?W=)KWe#V?@oq2Vtu`B1W&|& z)n-c)WCa&n0tUj}AYocPxDSUWqb|WVX(WK8$LO)Xh6JXwxG)!i$3MTH4M6?j%Ip4a z`7CY5chob4h`!B?pUkMnnsUPQ`ucLQ-pv!Nl?n-^6=QRkW=Bqkq-rU0_~`tU+P zY9*;hbN9Vk_@$3+jk|N8@78R%+oQt359AIZ_E6MUUlyWHZ#F-9u&N9r(*2<@i#1KSR&&2XnInQL^+xsXq4)JR06dK~{6ja)sIQ2FUN)>_6-BXOAF~c% z-hb5Wau}^J5f#Zor)O+%!sn%29eOduACC|_Ao-2D>hV?9;{|D6TNDdFuPbE? zr_c?cWwg$Nls4neCsFRR17VD_#LanJV0;1nYF>!JP_yTU)_f!J1Im1l)0<0KUgUhr z<3<0^^ko*FK)}F|&TtQl{M#%dnWd%Zxe5Lx>Ljk}6NUE+7gu!V5BuV1)7rRY7W^j* z=4h?np|c_7cxH^UpP|{^Q1HhO93(QwzaNB+>M{=m}BB}7{u}0=xw=Pq0D9? zM0KCyV`a$P3*YNZiOijf=Fhy*5}J z5yP2nCiyb5zpT?EpZQ64l`Fk{Wjj+%Me^20sFtGK7ECK7Z&4I?Na7FmVaI@kU(@9r6i$FoKXAoqpc=O;R2yTk3RS=R=RecBT>f%-BOaS#?b~x3$r8rwJ zIC}FlW-W>}>piG8eIJP(WqB#Y#ZRuA@cberb7IJoV3tVgE+U8{Q=YKYeEjIrM=du` zBHSW$nCU=vB@Hi;L(!(yJ-_q3h=QkLY)eX^ae?i@Byh(r_}Kr(T3s*u#~AGA!ZI6^ zrXhbmQ+D+w`9bd&RQazF^wqJyA00N9O??KqP(6GGF!kUOX8yU0b6o> zkDI{j(EcBVMWrfGX*Z6YoxQ>vn8aV_fdy{AjtveDX0Av1{XI?Mq6#I}dRfIn({0ph z{XutApg`B@&iJdz1&Y1EY1U{+xutzYorlRAu5ANIG;ar=FU=1I542H1Vt0-R7qfa- z8M{ZDyM3KeZ2GC&GQdnj*#&5cQr2L8$9&EA6gmIJ*6_x9@N?%}aks$OPgNKQ! zjhp5c*8QH!-Z3!pY+nAnz~^VQT))vYSWC$xW!`gQz=lXl?veQPt=XBrI@KXW8Er=E zyVD_Gqh1u;Z}0kii{OLs_Hyr~A2|FNF`c>S*xwcqkQlM5PDXuKl?@Dp>R9cfiGZQO zpZ8?V8EN~{x#KD`>ODj4n#=Dx3{;dbOt(a15B(T2!!UK?v1fE~#JequJ%zFtl-Osc z#}OLF*>J~hhK*`#$BBt#N?>N+;G5(-T1?h=5AfLwq8HON#lh7$8M0ce2|ZnB@$doB zXY(#yMavvucs|ZZ1LEr9MH_~nADE-ujqnHPz7#wvvy`PcN*2*(lb49vj%g}|IqFco z=In_1w1tZ<{_AX8;z&hwV>$;Kv|k@KI9PO??YKan>1Ivt(;Zb>`V~$)O34x?A>unp*sY#^O+OtVm#_v#5Rj#Mxq!z3%tC+xv|Kt?C25I$h0P1%MA0qTp%! zy&qG6PICQw*|jClAJFo==p^*)u_?SX9amY8b}wg3_&Y1NsFSvY|6CBWb_WNsx7 z9N()`N1fRVoVKEUJSt1j=4z8Gc9PJC_iw(WmkNMySnH2&b=&2RfPLgGMwcSp7w;09 z8-;E>8EXS}>2k?UF{FSpCn4^PslCf5CUXkzw^O?{9&|KiWxXiQkH_m*G~^D&EPn;j zv+4Xdk|~s!4hoRE$H&q|a&vR_aS?)H^q;vmyVF0x>rDsCkK0em{!l=K5cUbGu4VtA zhaw-NoxmXIZhyG$|7m!Rn1wF?Y9QxUg^gML>23||o_p~3osFQOuzn|B5I0ZfJUKmu z{<(RKnCnHP+=$5d(HMn_$9;QEwlwvxe+bau`0edqXilPppU4j5hfM6|*48F$xTvpTT@>j7oW^* z4g>AUXH*Xk3lD4aQ1hq|sWHIC4fY?&FVMn>S(Vht77Kp;#N4>%ZvAJcni~E3r-p)J z2+TZlL=+cs#z%aFt8X3X-&whWTVPS~0e)10b&mySb^1xCXh0gduE zuDeajgan73Q23gvjldv!b!qzt-^Qf#(V*ghH|Y!jl9FVjqykgv3q7Z@)%I_XFwHbzXE!t>P$^D95BJ8(7h0zQLA7n5AtP}9+`)Dwudgt*ZGCn)So@*8Ff^Xd z;|DaqL9zj1A2tC>?mjR7Op^ZX+CMX=f4}y(JO1s)zu*6#vnl>|$G_e9znSd?RGWnc z>FHCl8r=xUp5x+TD2d`7*3_iwCpy@f5yd3|?LCH+XovYKxjEPRA_8LH?v?u3;B#b} z&>8a7Uf?Edq0VnBhT@M_A>MhS;kxyKpaDb1=H*)pON6IsrP@CL^<$5JygnOybq4D8 z+w?eGQ3W4A69}f4PYHfC8@Fs*oTZV1;aY?ft&FYyk5;@p!gDTDn{nz~MQ3vYo&@Ri z=U_*2S4woFqtAosqUdFzoZq5}R_yHAusID`O{+=y@Tm1YnC!W?VL2{O_$y{bl+<8V zs`=wd7C=8)JpeN^-a;6;Af4fKB@EolSHJjxZAYhtu4omlzn~FWsiGqZAH@4Sk40}k z2-ZD?v_)rhXBSe0!k0`t$ZvU#ZuUX^nZDJeRQE@On@(1l$QJRBlwsE9o{s~A`;~_E zxHFVu{6;!F4TL;pnoOh>cwLvd{DYy{MvLhV4^8fonjf#Uf|^I$Tq3UKc{kbR*M53Z z^w0UkenyVi8Q^cAjHLj}D`Mgm3C;wsnfHyfXYstY$+n8zAmQl``^LF*LD(SMlRGCX zYlp#dQ+g88^OrJu1FYiW07pN@&8SU4f%M6$piBOW_olIW=cw9T zGpqF-$Fe)#ixa4eu%XdKY|B*-qA!N**i7c&ppCG54331sa1@L|{p)?Tcccu?YrCDDzwNHiA`~htavb6-ja?(V zR6P73kvOGSUlNEsWsoRzc*%nZN+zJC0M<$;27e?1Otbj)?uUoVf&>|dvNpgmN z8-nVYhYZ&N00p%~3B&)KKE(cpfR{RaXF>Ea{ zs#g0OlZt>XAx)GHzBk#j()m2Ft_rq@3S@TE1q<57R#XM2EJbMMFYqP)k^!8Uh!MOo zT-0aEf7spUaK_)MY-KF0(@;`BJkl(OmUOYi9J z7B`9-r~vt>hiYy$nEuckm9Q|d8c!1p^|L6$MQjJRm#hL+I;!l6%QF=HFLmqhOxGc6 znK33_joajU6P*or#3rgUHi*CVezm!>j}P5?Pm*hrl;#f|EbGZH{IWM*t_`4he|OD_ z9wCWym?RxWB$P54KoMVysC9LY^$A3XR$V?bz01p~9j$E^RHA?zKpe8f=pTaHEgWsj zy$$jM+FqP_y~Pu4>dgr4XWl9=+mKeqUSB`R7`=^YNbh?w!x0+lVCb=L!3wkeO8osi zf(bM#03dJui5J?^S$_pT?xTb5%M2Xt=GQA+8KS%*S7X?#Js65ekhhDYW9Nir#06brNA6j3N3%C&yJw!`Ok-3nTgFqM&@{k73ElFIt zA|)B;YOG89og>^^SFb>lB>$*ofQp=mgNAQs#T?7|_auU6EFv1rQhY*=7}cQFaBV<^ zN2O`4BUlx(e(|7LpG_yG#g3g>umPE)2aE@d9_7_ly>|7z(p^O_Kaz9za^+7IlOZw0 zM-caX4@BG4E}h z5wzGI-%PDz065Fln?`LL)s^Tzu(X|*=FUj!)Ey!r9Rdfp=SAKMKSkGSY5UvWza>uD zr|g;@&J#i8vjO8AaI2zKEWz=%k%2N`qLxp$P8SDw=)G1jO!4(~d4|f2JcfrNjf|f| z@LwjHDE(asK9)cm6p`9I?w|Z;+zKTQpN*lUFU|j)`S+I{`rlZdzcpEZyYc@Yv)w-( zF5bAl+s-&TaaD7@D4J#@Bctr061L*RWnRKO;I6C8u&&~kr{Z#fEI4kb4?G+`dOZ1i zvN}RG7GxpZnQrLx!|+xvbVQq&hIJ@jjMZR(Nd1x1+E_i6Penv9Fcy`+7sdv z5Hz~&vOWqczHAwougK00n4kZwT=GWA- zLA{C*=!mn1K76WJ!w46_^YQ@NW8Ghp(staLptt_){OO))LG6od`PPi;%-DXD&nRB` zKBy%c#@{&_@v5S)^8ceB+hQ z;~1>l>{4mJE)L@2QoxtRDJcd{7*v?*zC421^rje&loyswn73PcfUN2}`FCahfO{1b zfXWTae9dVsFx;X*3N<*zsV3>%4#N23@u#hWuZf_08;pF*#oO|%(6zOn4L*E)5FOc9 zc1C9Io-;O47hh-3dt5b-AqsQOAS%TtET3!U`xC%Z$Jp19JoG0x@Mm8TlTcJlWQ>9O z!kznc0(R8_SfT3XUeBl2c5UXp&Zv<>eDxKzt({;^#OP5&nh9Bl(eK8i_m6fJ(4O@u z6kf>7w|(S{x`RdoU0$Cu_0U=$X>GH@*VoJjya5Jx%0j_2h}I;>YsFc=4YcWJuir%5 z7I(3|$*aTb$$RkvXIe`1qw3+XNq`K3+xoVrg`>c`DckKBaPhIxiWAY+h3;KLa;iJQ z*7mlFvT}d{E+L-_il50)qLQYjBs>1*&30BnU0vc!WNcaDYymZ^U!!P7#LUT4*( z(u8~zzmPQ!@SOd&@@XpqBrkdvtRa-Y6*SlM2!{Fc_&9V8@C_EK=k|+klJMEZHKfZEDph_OvZc{rTFTjUJ3XR+=9y%h4ouC!iU}= z!usk}*RC0&lQt3OG_A!4oX4Z`QKR+F{mODAN>igzUVPVMjjRDQ4K5%8$c z&`o@j7`PoMl16Yd$44}Q_DRIL!Sl+7*!SL^mX>x00-=fzkK z;mPBy|1wkgWd;6e&M83lDQ-czIV69ACL&vo-vy8iH~JJW(u$UEv4-nS58!Irn&X-t zh{=KDR|51x5>2h1-cC>JZ2i_&(!s4aEswTt4~UGLv`FVtbn{f~8VOrvJ-wjP^>l}MY(MIqkYni9 z9@A+C5m-|NuY<_!vmb%&>Omg+iveV6?sav=1Y1A6pQaNoZI>72r?pJWqp8_1e6sv& z?J(Xm0J({s{ZS676((4?S9VK_@_2n;XFc`Bc^&aBZ}@-4q>Jau$=FwHeh$yV(Q||G zgZ2j9+uw(AyO`2wbUPs@;Iv9!^H=f1+E2n1@QJl4h{mM$&}uW_`PflZlz(mrhuS)a zI`AMDEThn^=KH*$UA9rTbahWS>UQ^1Sl0%!FQ7N4VieWWInES~6=NtySF?j!DQdvC3qB z_IAZ}&SOu^=MnT?+{D6YBar~*p^dfW@?)E-XX4ZKB21GtiDmmGIz7=+J_gePH@6Mv zV@kfi_o}YX%^iYr^<*%#ElSJPk|(`(UBpNl7o6Sk%EwE{;!q-kHuPoP9X&D?EZz`> zIs_L#&EJX61(zS~=POW5flAn`&nuE?a}FQES6AU;FBo(CGX2htI!uRyfX|R^f>-W$ z7L_h%6y8OrjyH&Ck$NE}1b*hsk(AsqKs;M)ODQz-l3@nJMUM=_lKHh;*E_7_p7nwB zBQo!wG1K4FN`~291hzCysn&AXlc5?jj?aGX%P+;!5uB3c9qZZ6q_qJ6hJ&h0bp-U& zsSe>^%bkTp3^-<}tZ&+UVUeG3v4F(Aw2L%{6@$OVt zM{9kKSrp6H*53K72^`mVsn=?7dYu>OIjSmyX^qTfXSutQ{FPc%?{`B!CrU{71m zZw=Wp)I_W~xDf@-M%L5$y~6fTuPW-U=|fVh*fyw(=4LO`K4*vvQET`P&dpHqze=+q z86KNq(#g(Gx4=*%P{!}bbB}0Hk;b$Wt7nT{+8lFjr_jyKV2xcC=mV?_MyqD|JMb z^N&~uNA9E99Yiiy-09q=&R0}b#ezWcKIb_kFmuQylarG=Qy|Q`pGsX#wFXg-H}D#! zw|(Z&qlf;-YK7|y*9n}pj08#<_b97ps$qQNG-W$); z_moPG?S60JLu*_Cv9tTG&{AG^tBhUwbmNLWU7TNIMik4esbgG z)~d&vf>NmZO_f)KHiIfdz8G532D*^V@1H2Ds!DPb_PL}VjJQbhFy;egm`5ctE!J4% z3@dRL7X^&1v`Z=KkAu0&c5#0ePAd20i!b!sGS7uO(z9cXj(0yP_qNhL~liN}fzlF?@N&(ff zSmU0kJsGl<%$DHI`-xE~2^-Q+l;g654(&Foz0Meg;pUdpVP3NR3frs=?d98+^8;OC zCK=O;nYp54ZJKaNgfi07QpU(fr*^GcTa&6b6GmIcSy)mog2PskSITw6v5?kI+(Kup z1L4Y1gn;&hZ+F?n#DZ#EoxUhQ?^9OmzW4&wB`el4e;`|R^#!P)f;$n&_mGO)cV8N| z&dmm)=3*DsP89p_E}Mzd6iNJ!$MC26Q=bCBGD(65aZ$g+3-Ygzvi-w7;ff({lS^yrSQjHJKQbOW={&v#;(%EAg4< z?>}EB|G@lh0flT{rmwER>1z^=Zg9PaK;7X=!*?EU{e^84k(#9Bd1!8#@h!`|v+7r+ z5UeusY!kF#^DJ~Q=)u5Q4n1sdBsqNl>ZnpGzM$KRKa07hE2<>sfT6F{~9Y-w+b80o}K5 zywjzYj5*FXs-4!=ImqKO;($&GC-b0(?BNv*ekh+u64dksR&PH5=bCYG;rrC`+?Y)K-MCm4dfYwgWx*H}S zo}i2yFsFXLmN_T_LsC7V6&IC=*AAs}>;8fFr6c)nVgjzq%^9qYI6^-4$Y5v0?!0hI z(b?1Ej0J3~?OMRWwo_N@z?ZlB1B>YPNzS1&K2KEEQaBSNWU?s0R*0?B^#f?J(=kv{ zi)G92qlHCi;udaJko_a{!WOC`K?%AHigOQGGG-LzFiO)Jqtig43CaXnsK7)%fo@Pu zls!_FXQge0A#{m0+GZaG<42LtSfYyx_X&>4P|vh{bx zzKRh}bv$Yv07tUu$RZ`#t~(MG51irtcK1tK;ty(cBFJhsff4N36&P54^!Pf&CE`EK zKNzmd3vyQ0)Ry*r<2t6I-H?${tX+V+~lY6+Jm3qh8n1qTWD6Hm9)OHqP5z*u) zwL0!h|BYlD+LQRHIARWcY!}5}5#o5F<@?~v-Jv=7lfpesBdw2z^OgXWK(k=%hjY`;Mlsq7fVvGqy4fDTW4*QprMqa(N7f3AB>EvhdJ8& zCU~FKDYdH+FI(VUB3A4kuXvZ-_*6o6QOg@!1!}wwxvL3+p}NM!WwB^&xgK)xEo$UtbY`wEwCA2;cDgTk}m>QEP1xQ_W{M*F7_qlgUAB#6m)Z{Fu24mnaa{$89FWldPpaO z>RrE@c@j|(hiv9=|BnDo2D14VQd(d^QG{4$Gjk;on%85c-Q7I|{XR_77(TVm$eX|G zEIzM^zw^|%%ZF~JX%O`L=(UQk3tWM(Nk`{T4(ygBVB*n1{PX!RX@|BLInN( zD=6{~KG(3YJYWR_*gaiDGcK;blIl`()Tr^u^$gulU2dg&!7`SF21mqAlgy^pgoa}R9e%a6oJrFv+)*hk**`iH{)==*N>A^!Z~U2K2so7`@I(|&-L-#o&bZ%5ev z;MZAiIJi!N(|`LT?{Bm z?Pt%@H*{c-W7((}-Pb|y;yOzD&v155M8fQlxv^x)Qg`UcrM#V;7?HcKg;>2WW0-oz`<|7uV3)(>rf# zQkWN-c1^0QDyRLNNe!Ow`NAhnSBK+V%dTD#3s%*W*Ls*Uy)!!?yw>eIu+xWDy(E)KE?#Wa6b=y)ky*;m3XF1drtct?E0$6jwCQL(oxKv~TzPB8m=J9k*XM;Y zwoQ9SCzfU5vn+g;m!QvwH|Qmk$&gB==#LMON~d)e4iOQN*^SY&KPUR;FNqE;ZiI9@ z4F_kiY`C2UXgzt9);X{#<7H&;4Xx#1NRFvniHL~Yz|g3`cy&os6S+2Cl|V#9Wc~-} z`4}3#=1jNC#W0L{Srg+L+Iqg$#5B$8vRw+%A|fL5SSFJp;4_IQGV^ZR$_soXlheO^ zT`HZyW16Hh^RFfWpEaYJq|+IEmPIm^ns+tH3x{V^lgSQO%qvG9+R=!Jh|D+XWSoUX zKD;L2I`iV@HC(ESeU#+;>FMj6c1_~(c=n=j^Cyk{S=;-Vuou2+^ za&KRh;zE<6{K&kkN&5_I(iiQgxUhhQ73Hc)&O?j?p7>v^id~77-B<5s|B6^py~;xzHjaA|fJFjM0PH*&ICztwb#%A|fI(COTjB zx6aNXA|fIpGFglslaS8M*A|fIpQ;X5V z|9TC>z;)f>A?kzs_YFVn%B8^Foc~QkL_|d7W(~!oXJw3k!i_5@;>iB%9eR-K!h!`0 zhC{MD_=h{3n%z+W+8vdl$KIcag13l>h=^RjK%Dat#^}e5yg&NyvHx;au=ZYgQ5P^U zjBFqtJwol`y2juWNB%wD{am40(?&!@L`3A%3)RyP(jy;#Wtn$q6nZE$XM;3T3eY1T zKYn;NrZ_?^A|fIpGE4E Date: Tue, 5 Dec 2017 08:54:59 -0800 Subject: [PATCH 12/64] Fix code example for HTTP Methods `return` is required to make 'http methods' example work --- docs/quickstart.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 7440ccd2..d3f3dea0 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -315,9 +315,9 @@ of the :meth:`~flask.Flask.route` decorator to handle different HTTP methods. @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': - do_the_login() + return do_the_login() else: - show_the_login_form() + return show_the_login_form() If ``GET`` is present, Flask automatically adds support for the ``HEAD`` method and handles ``HEAD`` requests according to the the `HTTP RFC`_. Likewise, From 2d2c0169d47a5345dada2c96b4a445c570f7c112 Mon Sep 17 00:00:00 2001 From: Harry Moreno Date: Fri, 8 Dec 2017 15:18:02 -0500 Subject: [PATCH 13/64] Fix docs, how to get db connection in pattern The docs are inaccurately suggestion a db connection would be available at `g.db`, after calling `get_db()` a connection will be available at `g._database` but even then I think instructing the user to use `get_db()` is the best way forward. --- docs/patterns/sqlite3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/patterns/sqlite3.rst b/docs/patterns/sqlite3.rst index 15f38ea7..eecaaae8 100644 --- a/docs/patterns/sqlite3.rst +++ b/docs/patterns/sqlite3.rst @@ -67,7 +67,7 @@ the application context by hand:: Easy Querying ------------- -Now in each request handling function you can access `g.db` to get the +Now in each request handling function you can access `get_db()` to get the current open database connection. To simplify working with SQLite, a row factory function is useful. It is executed for every result returned from the database to convert the result. For instance, in order to get From 8a5e389da06f7bb7cf5a364edbc47f0e6e7d1771 Mon Sep 17 00:00:00 2001 From: Grey Li Date: Thu, 14 Dec 2017 11:08:33 +0800 Subject: [PATCH 14/64] Docs: Fixed typo --- docs/config.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.rst b/docs/config.rst index 6e30466e..6ed27a83 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -104,7 +104,7 @@ The following configuration values are used internally by Flask: Default: ``False`` -.. py:data:: TRAP_BAD_REQUEST_ERRORS`` +.. py:data:: TRAP_BAD_REQUEST_ERRORS Trying to access a key that doesn't exist from request dicts like ``args`` and ``form`` will return a 400 Bad Request error page. Enable this to treat From 58ea360d431d7d2d430d08d89a75dd70946fb263 Mon Sep 17 00:00:00 2001 From: Grey Li Date: Thu, 14 Dec 2017 14:38:37 +0800 Subject: [PATCH 15/64] Docs: Add missing backslash --- docs/cli.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli.rst b/docs/cli.rst index cdb0fc59..136e43e0 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -176,7 +176,7 @@ Unix Bash, :file:`venv/bin/activate`:: export FLASK_APP=hello -Windows CMD, :file:`venv\Scripts\activate.bat`:: +Windows CMD, :file:`venv\\Scripts\\activate.bat`:: set FLASK_APP=hello From e30c39fe78cb8d3fe8379f032b66f7719b2e99c5 Mon Sep 17 00:00:00 2001 From: Camilo Date: Thu, 14 Dec 2017 01:55:22 -0500 Subject: [PATCH 16/64] fix non-passing tests for logging on pytest > 3.3.0 --- tests/test_logging.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_logging.py b/tests/test_logging.py index 1a010569..cadcdab9 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -17,6 +17,10 @@ def reset_logging(monkeypatch): logger.handlers = [] logger.setLevel(logging.NOTSET) + logging_plugin = pytest.config.pluginmanager.getplugin('logging-plugin') + pytest.config.pluginmanager.unregister(name='logging-plugin') + logging.root.handlers = [] + yield logging.root.handlers[:] = root_handlers @@ -25,6 +29,8 @@ def reset_logging(monkeypatch): logger.handlers = [] logger.setLevel(logging.NOTSET) + pytest.config.pluginmanager.register(logging_plugin, 'logging-plugin') + def test_logger(app): assert app.logger.name == 'flask.app' From 33fa58094701d5b1edbf13ddfe7c93b4c5821b63 Mon Sep 17 00:00:00 2001 From: Camilo Date: Thu, 14 Dec 2017 09:40:34 -0500 Subject: [PATCH 17/64] restore the logging plugin only if it was active to begin with --- tests/test_logging.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_logging.py b/tests/test_logging.py index cadcdab9..be4e76ca 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -29,7 +29,8 @@ def reset_logging(monkeypatch): logger.handlers = [] logger.setLevel(logging.NOTSET) - pytest.config.pluginmanager.register(logging_plugin, 'logging-plugin') + if logging_plugin: + pytest.config.pluginmanager.register(logging_plugin, 'logging-plugin') def test_logger(app): From 604cc758fb6601782745572452715fc295dda011 Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 14 Dec 2017 12:20:03 -0800 Subject: [PATCH 18/64] use config fixture, get plugin via unregister --- tests/test_logging.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_logging.py b/tests/test_logging.py index be4e76ca..80540e84 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -9,17 +9,17 @@ from flask.logging import default_handler, has_level_handler, \ @pytest.fixture(autouse=True) -def reset_logging(monkeypatch): +def reset_logging(pytestconfig): root_handlers = logging.root.handlers[:] + logging.root.handlers = [] root_level = logging.root.level logger = logging.getLogger('flask.app') logger.handlers = [] logger.setLevel(logging.NOTSET) - logging_plugin = pytest.config.pluginmanager.getplugin('logging-plugin') - pytest.config.pluginmanager.unregister(name='logging-plugin') - logging.root.handlers = [] + logging_plugin = pytestconfig.pluginmanager.unregister( + name='logging-plugin') yield @@ -30,7 +30,7 @@ def reset_logging(monkeypatch): logger.setLevel(logging.NOTSET) if logging_plugin: - pytest.config.pluginmanager.register(logging_plugin, 'logging-plugin') + pytestconfig.pluginmanager.register(logging_plugin, 'logging-plugin') def test_logger(app): From 1cdfe0e5e9c1eabfc3038dd2e4b79d768c6e1ed8 Mon Sep 17 00:00:00 2001 From: Andy Craze Date: Thu, 14 Dec 2017 19:45:09 -0800 Subject: [PATCH 19/64] Fix sentry raven install docs The documentation for installing Sentry's raven client was incorrect. It should state that the client must be installed with the extra flask dependencies as mentioned in getsentry/raven-python#1075 --- docs/errorhandling.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/errorhandling.rst b/docs/errorhandling.rst index 413680dd..4c260112 100644 --- a/docs/errorhandling.rst +++ b/docs/errorhandling.rst @@ -42,9 +42,9 @@ aggregates duplicate errors, captures the full stack trace and local variables for debugging, and sends you mails based on new errors or frequency thresholds. -To use Sentry you need to install the `raven` client:: +To use Sentry you need to install the `raven` client with extra `flask` dependencies:: - $ pip install raven + $ pip install raven[flask] And then add this to your Flask app:: From 28d0f66c1f5a6a9d3f0c229822e917d115fa5aea Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 14 Dec 2017 13:05:52 -0800 Subject: [PATCH 20/64] remove tests and docs for python 2.6 and 3.3 --- .travis.yml | 12 ++---------- CHANGES | 2 ++ docs/advanced_foreword.rst | 8 -------- docs/contents.rst.inc | 1 - docs/extensiondev.rst | 2 +- docs/installation.rst | 4 ++-- docs/python3.rst | 23 ----------------------- tox.ini | 10 ++++------ 8 files changed, 11 insertions(+), 51 deletions(-) delete mode 100644 docs/python3.rst diff --git a/.travis.yml b/.travis.yml index 972ddb0c..440bdf95 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,25 +4,17 @@ language: python matrix: include: - python: 3.6 - env: TOXENV=py,codecov + env: TOXENV=py,simplejson,devel,lowest,codecov,docs-html - python: 3.5 env: TOXENV=py,codecov - python: 3.4 env: TOXENV=py,codecov - - python: 3.3 - env: TOXENV=py,codecov - python: 2.7 - env: TOXENV=py,codecov - - python: 2.6 - env: TOXENV=py,codecov + env: TOXENV=py,simplejson,devel,lowest,codecov - python: pypy env: TOXENV=py,codecov - python: nightly env: TOXENV=py - - python: 3.6 - env: TOXENV=docs-html - - python: 3.6 - env: TOXENV=py-simplejson,codecov install: - pip install tox diff --git a/CHANGES b/CHANGES index 2cb24c20..11fb7df2 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,7 @@ Version 0.13 Major release, unreleased +- **Python 2.6 and 3.3 are no longer supported.** (`pallets/meta#24`_) - Minimum Werkzeug version bumped to 0.9, but please use the latest version. - Minimum Click version bumped to 4, but please use the latest version. - Make ``app.run()`` into a noop if a Flask application is run from the @@ -115,6 +116,7 @@ Major release, unreleased - Blueprint view function name may not contain dots. (`#2450`_) - The dev server now uses threads by default. +.. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 .. _#1489: https://github.com/pallets/flask/pull/1489 .. _#1621: https://github.com/pallets/flask/pull/1621 diff --git a/docs/advanced_foreword.rst b/docs/advanced_foreword.rst index 82b3dc58..bd56f53c 100644 --- a/docs/advanced_foreword.rst +++ b/docs/advanced_foreword.rst @@ -45,11 +45,3 @@ spam, links to malicious software, and the like. Flask is no different from any other framework in that you the developer must build with caution, watching for exploits when building to your requirements. - -Python 3 Support in Flask -------------------------- - -Flask, its dependencies, and most Flask extensions all support Python 3. -If you want to use Flask with Python 3 have a look at the :ref:`python3-support` page. - -Continue to :ref:`installation` or the :ref:`quickstart`. diff --git a/docs/contents.rst.inc b/docs/contents.rst.inc index de4d7a91..f76b1591 100644 --- a/docs/contents.rst.inc +++ b/docs/contents.rst.inc @@ -56,7 +56,6 @@ Design notes, legal information and changelog are here for the interested. unicode extensiondev styleguide - python3 upgrading changelog license diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 3e8f30d4..29c33f3c 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -383,7 +383,7 @@ extension to be approved you have to follow these guidelines: (``PackageName==dev``). 9. The ``zip_safe`` flag in the setup script must be set to ``False``, even if the extension would be safe for zipping. -10. An extension currently has to support Python 2.7, Python 3.3 and higher. +10. An extension currently has to support Python 3.4 and newer and 2.7. diff --git a/docs/installation.rst b/docs/installation.rst index 370ce48c..88b9af09 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -6,8 +6,8 @@ Installation Python Version -------------- -We recommend using the latest version of Python 3. Flask supports Python 3.3 -and newer, Python 2.6 and newer, and PyPy. +We recommend using the latest version of Python 3. Flask supports Python 3.4 +and newer, Python 2.7, and PyPy. Dependencies ------------ diff --git a/docs/python3.rst b/docs/python3.rst deleted file mode 100644 index a7a4f165..00000000 --- a/docs/python3.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. _python3-support: - -Python 3 Support -================ - -Flask, its dependencies, and most Flask extensions support Python 3. -You should start using Python 3 for your next project, -but there are a few things to be aware of. - -You need to use Python 3.3 or higher. 3.2 and older are *not* supported. - -You should use the latest versions of all Flask-related packages. -Flask 0.10 and Werkzeug 0.9 were the first versions to introduce Python 3 support. - -Python 3 changed how unicode and bytes are handled, which complicates how low -level code handles HTTP data. This mainly affects WSGI middleware interacting -with the WSGI ``environ`` data. Werkzeug wraps that information in high-level -helpers, so encoding issues should not affect you. - -The majority of the upgrade work is in the lower-level libraries like -Flask and Werkzeug, not the high-level application code. -For example, all of the examples in the Flask repository work on both Python 2 and 3 -and did not require a single line of code changed. diff --git a/tox.ini b/tox.ini index 45d81b65..ed8b99e8 100644 --- a/tox.ini +++ b/tox.ini @@ -1,15 +1,14 @@ [tox] envlist = - py{36,35,34,33,27,26,py} + py{36,35,34,27,py} py{36,27,py}-simplejson - py{36,33,27,26,py}-devel - py{36,33,27,26,py}-lowest + py{36,27,py}-devel + py{36,27,py}-lowest docs-html coverage-report [testenv] passenv = LANG -usedevelop = true deps = pytest>=3 coverage @@ -29,6 +28,7 @@ deps = devel: https://github.com/pallets/click/archive/master.tar.gz simplejson: simplejson + commands = # the examples need to be installed to test successfully pip install -e examples/flaskr -q @@ -59,8 +59,6 @@ passenv = CI TRAVIS TRAVIS_* deps = codecov skip_install = true commands = - # install argparse for 2.6 - python -c 'import sys, pip; sys.version_info < (2, 7) and pip.main(["install", "argparse", "-q"])' coverage combine coverage report codecov From e296a67a08810d2395e8baa2c1b82ce5508fe808 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sat, 16 Dec 2017 07:17:13 -0800 Subject: [PATCH 21/64] add appveyor configuration --- .appveyor.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 00000000..102ff5c3 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,20 @@ +environment: + global: + TOXENV: "py" + + matrix: + - PYTHON: "C:\\Python36" + - PYTHON: "C:\\Python27" + +install: + - "%PYTHON%\\python.exe -m pip install -U pip setuptools wheel tox" + +build: false + +test_script: + - "%PYTHON%\\python.exe -m tox" + +branches: + only: + - master + - /^.*-maintenance$/ From 411b08ff8bcd30aca15f2dc0be5f633879c633db Mon Sep 17 00:00:00 2001 From: Hsiaoming Yang Date: Sun, 17 Dec 2017 02:43:06 +0900 Subject: [PATCH 22/64] Better appveyor config --- .appveyor.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 102ff5c3..107fb409 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -3,16 +3,21 @@ environment: TOXENV: "py" matrix: - - PYTHON: "C:\\Python36" - PYTHON: "C:\\Python27" + - PYTHON: "C:\\Python35" + - PYTHON: "C:\\Python36" + +init: + - SET PATH=%PYTHON%;%PATH% + - python -c "import sys;sys.stdout.write(sys.version)" install: - - "%PYTHON%\\python.exe -m pip install -U pip setuptools wheel tox" + - python -m pip install -U pip setuptools wheel tox build: false test_script: - - "%PYTHON%\\python.exe -m tox" + - python -m tox branches: only: From 94fd3edf3185ea20f1b3af62c247e031cd8136dd Mon Sep 17 00:00:00 2001 From: Grey Li Date: Wed, 20 Dec 2017 20:50:45 +0800 Subject: [PATCH 23/64] Docs: Update CLI for factory pattern --- docs/patterns/appfactories.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/patterns/appfactories.rst b/docs/patterns/appfactories.rst index b6d4a729..3e880205 100644 --- a/docs/patterns/appfactories.rst +++ b/docs/patterns/appfactories.rst @@ -89,17 +89,19 @@ For more information about the design of extensions refer to :doc:`/extensiondev Using Applications ------------------ -To use such an application you have to create it in a separate file first, -otherwise the :command:`flask` command won't be able to find it. Here's an -example :file:`exampleapp.py` file that creates such an application:: +To run such an application, you can use the :command:`flask` command:: - from yourapplication import create_app - app = create_app('/path/to/config.cfg') - -It can then be used with the :command:`flask` command:: + export FLASK_APP=myapp + flask run + +Flask will automatically detect the factory (``create_app`` or ``make_app``) +in ``myapp``. You can also pass arguments to the factory like this:: - export FLASK_APP=exampleapp + export FLASK_APP="myapp:create_app('dev')" flask run + +Then the ``create_app`` factory in ``myapp`` is called with the string +``'dev'`` as the argument. See :doc:`/cli` for more detail. Factory Improvements -------------------- From f7983ae96a5da9c7763ebd65947fb6032e2df36c Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 3 Jan 2018 13:06:14 -0800 Subject: [PATCH 24/64] concat newline in jsonify ref pallets/werkzeug#1130 --- flask/json/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flask/json/__init__.py b/flask/json/__init__.py index 6559c1aa..6a10b737 100644 --- a/flask/json/__init__.py +++ b/flask/json/__init__.py @@ -264,7 +264,7 @@ def jsonify(*args, **kwargs): data = args or kwargs return current_app.response_class( - (dumps(data, indent=indent, separators=separators), '\n'), + dumps(data, indent=indent, separators=separators) + '\n', mimetype=current_app.config['JSONIFY_MIMETYPE'] ) From 3012d20a3f24c8c8afa4be754d6f198506f72286 Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 4 Jan 2018 07:29:15 -0800 Subject: [PATCH 25/64] cleanup --- .appveyor.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 107fb409..3a7d2f63 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,15 +1,13 @@ environment: global: - TOXENV: "py" + TOXENV: py matrix: - - PYTHON: "C:\\Python27" - - PYTHON: "C:\\Python35" - - PYTHON: "C:\\Python36" + - PYTHON: C:\Python36 + - PYTHON: C:\Python27 init: - SET PATH=%PYTHON%;%PATH% - - python -c "import sys;sys.stdout.write(sys.version)" install: - python -m pip install -U pip setuptools wheel tox From c11fe5d00702622f8c31fd72ee1a249c175a0b57 Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 4 Jan 2018 12:34:25 -0800 Subject: [PATCH 26/64] smaller, optimized image reword / reformat the docs fix tox build directory --- docs/_static/pycharm-runconfig.png | Bin 55565 -> 17219 bytes docs/cli.rst | 63 +++++++++++++++++------------ tox.ini | 4 +- 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/docs/_static/pycharm-runconfig.png b/docs/_static/pycharm-runconfig.png index abfccd7af173cd71ccc3a772227e0b81bcd35ec9..dff21fa03bd2fcb62d3a7d047a5005dee9ff15a5 100644 GIT binary patch literal 17219 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 diff --git a/docs/cli.rst b/docs/cli.rst index 1a6da62f..a55ee73e 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -343,40 +343,51 @@ script is available. Note that you don't need to set ``FLASK_APP``. :: PyCharm Integration ------------------- -The new Flask CLI features aren't yet fully integrated into the PyCharm IDE, -so we have to do a few tweaks to get them working smoothly. These instructions -should be similar for any other IDE you might want to use. +The Flask CLI features aren't yet fully integrated into the PyCharm IDE, +so we have to do a few tweaks to get them working smoothly. These +instructions should be similar for any other IDE you might want to use. -In PyCharm, with your project open, click on *Run* from the menu bar and go to -*Edit Configurations*. You'll be greeted by a screen similar to this: +In PyCharm, with your project open, click on *Run* from the menu bar and +go to *Edit Configurations*. You'll be greeted by a screen similar to +this: .. image:: _static/pycharm-runconfig.png - :align: center - :class: screenshot - :alt: screenshot of pycharm's run configuration settings + :align: center + :class: screenshot + :alt: screenshot of pycharm's run configuration settings -There's quite a few options to change, but once we've done it for one command, -we can easily copy the entire configuration and make a single tweak to give us -access to other commands, including any custom ones you may implement yourself. +There's quite a few options to change, but once we've done it for one +command, we can easily copy the entire configuration and make a single +tweak to give us access to other commands, including any custom ones you +may implement yourself. -Since PyCharm 2017.3, you can run modules instead of needing to find ``flask`` -executable. For the *Module name* input (**A**), you just need to input ``flask``. +Click the + (*Add New Configuration*) button and select *Python*. Give +the configuration a good descriptive name such as "Run Flask Server". +For the ``flask run`` command, check "Single instance only" since you +can't run the server more than once at the same time. -The *Parameters* field (**B**) is set to the CLI command you to execute. -In this example we use ``run``, which will run the development server. +Select *Module name* from the dropdown (**A**) then input ``flask``. -You can skip this next step if you're using :ref:`dotenv`. We need to add an -environment variable (**C**) to identify our application. Click on the browse -button and add an entry with ``FLASK_APP`` on the left and the name of the -Python file or package on the right (``app.py`` for example). +The *Parameters* field (**B**) is set to the CLI command to execute +(with any arguments). In this example we use ``run``, which will run +the development server. -Next we need to set the working directory (**D**) to be the same folder where -our application file or package resides. PyCharm changed it to the directory -with the ``flask`` executable when we selected it earlier, which is incorrect. +You can skip this next step if you're using :ref:`dotenv`. We need to +add an environment variable (**C**) to identify our application. Click +on the browse button and add an entry with ``FLASK_APP`` on the left and +the Python import or file on the right (``hello`` for example). -Finally, untick the *PYTHONPATH* options (**E**) and give the configuration a -good descriptive name, such as "Run Flask Server", and click *Apply*. +Next we need to set the working directory (**D**) to be the folder where +our application resides. -Now that we have a configuration which runs ``flask run`` from within PyCharm, -we can simply copy that configuration and alter the *Script* argument +If you have installed your project as a package in your virtualenv, you +may untick the *PYTHONPATH* options (**E**). This will more accurately +match how you deploy the app later. + +Click *Apply* to save the configuration, or *OK* to save and close the +window. Select the configuration in the main PyCharm window and click +the play button next to it to run the server. + +Now that we have a configuration which runs ``flask run`` from within +PyCharm, we can copy that configuration and alter the *Script* argument to run a different CLI command, e.g. ``flask shell``. diff --git a/tox.ini b/tox.ini index 45d81b65..1a9c16fb 100644 --- a/tox.ini +++ b/tox.ini @@ -40,11 +40,11 @@ commands = [testenv:docs-html] deps = sphinx -commands = sphinx-build -W -b html -d {envtmpdir}/doctrees docs docs/_build/html +commands = sphinx-build -W -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html [testenv:docs-linkcheck] deps = sphinx -commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees docs docs/_build/linkcheck +commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees docs {envtmpdir}/linkcheck [testenv:coverage-report] deps = coverage From 0a339545551b5303fb2750e6e5b0e72acbea60d4 Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 4 Jan 2018 08:40:12 -0800 Subject: [PATCH 27/64] improve documentation for session attributes add test for session attributes --- flask/sessions.py | 63 ++++++++++++++++++++++++++------------------- tests/test_basic.py | 11 +++++++- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/flask/sessions.py b/flask/sessions.py index 82b588bc..8f111718 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -10,6 +10,7 @@ """ import hashlib import warnings +from collections import MutableMapping from datetime import datetime from itsdangerous import BadSignature, URLSafeTimedSerializer @@ -19,43 +20,55 @@ from flask.helpers import is_ip, total_seconds from flask.json.tag import TaggedJSONSerializer -class SessionMixin(object): - """Expands a basic dictionary with an accessors that are expected - by Flask extensions and users for the session. - """ +class SessionMixin(MutableMapping): + """Expands a basic dictionary with session attributes.""" - def _get_permanent(self): + @property + def permanent(self): + """This reflects the ``'_permanent'`` key in the dict.""" return self.get('_permanent', False) - def _set_permanent(self, value): + @permanent.setter + def permanent(self, value): self['_permanent'] = bool(value) - #: this reflects the ``'_permanent'`` key in the dict. - permanent = property(_get_permanent, _set_permanent) - del _get_permanent, _set_permanent - - #: some session backends can tell you if a session is new, but that is - #: not necessarily guaranteed. Use with caution. The default mixin - #: implementation just hardcodes ``False`` in. + #: Some implementations can detect whether a session is newly + #: created, but that is not guaranteed. Use with caution. The mixin + # default is hard-coded ``False``. new = False - #: for some backends this will always be ``True``, but some backends will - #: default this to false and detect changes in the dictionary for as - #: long as changes do not happen on mutable structures in the session. - #: The default mixin implementation just hardcodes ``True`` in. + #: Some implementations can detect changes to the session and set + #: this when that happens. The mixin default is hard coded to + #: ``True``. modified = True - #: the accessed variable indicates whether or not the session object has - #: been accessed in that request. This allows flask to append a `Vary: - #: Cookie` header to the response if the session is being accessed. This - #: allows caching proxy servers, like Varnish, to use both the URL and the - #: session cookie as keys when caching pages, preventing multiple users - #: from being served the same cache. + #: Some implementations can detect when session data is read or + #: written and set this when that happens. The mixin default is hard + #: coded to ``True``. accessed = True class SecureCookieSession(CallbackDict, SessionMixin): - """Base class for sessions based on signed cookies.""" + """Base class for sessions based on signed cookies. + + This session backend will set the :attr:`modified` and + :attr:`accessed` attributes. It cannot reliably track whether a + session is new (vs. empty), so :attr:`new` remains hard coded to + ``False``. + """ + + #: When data is changed, this is set to ``True``. Only the session + #: dictionary itself is tracked; if the session contains mutable + #: data (for example a nested dict) then this must be set to + #: ``True`` manually when modifying that data. The session cookie + #: will only be written to the response if this is ``True``. + modified = False + + #: When data is read or written, this is set to ``True``. Used by + # :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie`` + #: header, which allows caching proxies to cache different pages for + #: different users. + accessed = False def __init__(self, initial=None): def on_update(self): @@ -63,8 +76,6 @@ class SecureCookieSession(CallbackDict, SessionMixin): self.accessed = True super(SecureCookieSession, self).__init__(initial, on_update) - self.modified = False - self.accessed = False def __getitem__(self, key): self.accessed = True diff --git a/tests/test_basic.py b/tests/test_basic.py index 0e3076df..d7406baf 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -221,12 +221,21 @@ def test_endpoint_decorator(app, client): def test_session(app, client): @app.route('/set', methods=['POST']) def set(): + assert not flask.session.accessed + assert not flask.session.modified flask.session['value'] = flask.request.form['value'] + assert flask.session.accessed + assert flask.session.modified return 'value set' @app.route('/get') def get(): - return flask.session['value'] + assert not flask.session.accessed + assert not flask.session.modified + v = flask.session.get('value', 'None') + assert flask.session.accessed + assert not flask.session.modified + return v assert client.post('/set', data={'value': '42'}).data == b'value set' assert client.get('/get').data == b'42' From 06f96df67e291caeaeb09ad296aa368c80cc1a58 Mon Sep 17 00:00:00 2001 From: David Lord Date: Fri, 5 Jan 2018 07:40:51 -0800 Subject: [PATCH 28/64] silence ENOTDIR when loading config file --- CHANGES | 8 +++++++- flask/config.py | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 11fb7df2..3517f1a7 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ Flask Changelog Here you can see the full list of changes between each Flask release. + Version 0.13 ------------ @@ -114,7 +115,9 @@ Major release, unreleased depending on ``app.debug``. No handlers are removed, and a handler is only added if no handlers are already configured. (`#2436`_) - Blueprint view function name may not contain dots. (`#2450`_) -- The dev server now uses threads by default. +- The dev server now uses threads by default. (`#2529`_) +- Loading config files with ``silent=True`` will ignore ``ENOTDIR`` + errors. (`#2581`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -149,6 +152,9 @@ Major release, unreleased .. _#2430: https://github.com/pallets/flask/pull/2430 .. _#2436: https://github.com/pallets/flask/pull/2436 .. _#2450: https://github.com/pallets/flask/pull/2450 +.. _#2529: https://github.com/pallets/flask/pull/2529 +.. _#2581: https://github.com/pallets/flask/pull/2581 + Version 0.12.3 -------------- diff --git a/flask/config.py b/flask/config.py index 697add71..f73a4232 100644 --- a/flask/config.py +++ b/flask/config.py @@ -129,7 +129,9 @@ class Config(dict): with open(filename, mode='rb') as config_file: exec(compile(config_file.read(), filename, 'exec'), d.__dict__) except IOError as e: - if silent and e.errno in (errno.ENOENT, errno.EISDIR): + if silent and e.errno in ( + errno.ENOENT, errno.EISDIR, errno.ENOTDIR + ): return False e.strerror = 'Unable to load configuration file (%s)' % e.strerror raise From ffca68fc86718b133668f341ddd8c2635d7e29ec Mon Sep 17 00:00:00 2001 From: David Lord Date: Fri, 5 Jan 2018 12:36:01 -0800 Subject: [PATCH 29/64] fix windows failure to remove temp file --- examples/flaskr/tests/test_flaskr.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/examples/flaskr/tests/test_flaskr.py b/examples/flaskr/tests/test_flaskr.py index b5ade2ec..e1e9a4e7 100644 --- a/examples/flaskr/tests/test_flaskr.py +++ b/examples/flaskr/tests/test_flaskr.py @@ -17,33 +17,25 @@ from flaskr.blueprints.flaskr import init_db @pytest.fixture -def app(request): - - db_fd, temp_db_location = tempfile.mkstemp() +def app(): + db_fd, db_path = tempfile.mkstemp() config = { - 'DATABASE': temp_db_location, + 'DATABASE': db_path, 'TESTING': True, - 'DB_FD': db_fd } - app = create_app(config=config) with app.app_context(): init_db() yield app + os.close(db_fd) + os.unlink(db_path) -@pytest.fixture -def client(request, app): - - client = app.test_client() - - def teardown(): - os.close(app.config['DB_FD']) - os.unlink(app.config['DATABASE']) - request.addfinalizer(teardown) - return client +@pytest.fixture +def client(app): + return app.test_client() def login(client, username, password): From 333865ea34acefbca565170881ff403fd7840d57 Mon Sep 17 00:00:00 2001 From: David Lord Date: Fri, 5 Jan 2018 13:27:31 -0800 Subject: [PATCH 30/64] windows python 2 doesn't provide inet_pton --- flask/helpers.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/flask/helpers.py b/flask/helpers.py index f1011ad0..067e97cb 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -42,8 +42,7 @@ from jinja2 import FileSystemLoader from .signals import message_flashed from .globals import session, _request_ctx_stack, _app_ctx_stack, \ current_app, request -from ._compat import string_types, text_type - +from ._compat import string_types, text_type, PY2 # sentinel _missing = object() @@ -1002,12 +1001,21 @@ def total_seconds(td): def is_ip(value): """Determine if the given string is an IP address. + Python 2 on Windows doesn't provide ``inet_pton``, so this only + checks IPv4 addresses in that environment. + :param value: value to check :type value: str :return: True if string is an IP address :rtype: bool """ + if PY2 and os.name == 'nt': + try: + socket.inet_aton(value) + return True + except socket.error: + return False for family in (socket.AF_INET, socket.AF_INET6): try: From 22e072379b9fcffd229cdd239dd3ff5ed4eed571 Mon Sep 17 00:00:00 2001 From: Hsiaoming Yang Date: Sat, 6 Jan 2018 18:49:01 +0900 Subject: [PATCH 31/64] cleanup werkzeug import (#2582) --- flask/helpers.py | 13 ++----------- flask/testing.py | 6 +----- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/flask/helpers.py b/flask/helpers.py index 067e97cb..412d9caf 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -22,21 +22,12 @@ import unicodedata from werkzeug.routing import BuildError from functools import update_wrapper -try: - from werkzeug.urls import url_quote -except ImportError: - from urlparse import quote as url_quote - +from werkzeug.urls import url_quote from werkzeug.datastructures import Headers, Range from werkzeug.exceptions import BadRequest, NotFound, \ RequestedRangeNotSatisfiable -# this was moved in 0.7 -try: - from werkzeug.wsgi import wrap_file -except ImportError: - from werkzeug.utils import wrap_file - +from werkzeug.wsgi import wrap_file from jinja2 import FileSystemLoader from .signals import message_flashed diff --git a/flask/testing.py b/flask/testing.py index f29c6b17..730ad61d 100644 --- a/flask/testing.py +++ b/flask/testing.py @@ -15,11 +15,7 @@ from contextlib import contextmanager from werkzeug.test import Client, EnvironBuilder from flask import _request_ctx_stack from flask.json import dumps as json_dumps - -try: - from werkzeug.urls import url_parse -except ImportError: - from urlparse import urlsplit as url_parse +from werkzeug.urls import url_parse def make_test_environ_builder( From 60eecb547d8af9916c55163c7356999ca2d5ffb9 Mon Sep 17 00:00:00 2001 From: Hsiaoming Yang Date: Sat, 6 Jan 2018 18:49:50 +0900 Subject: [PATCH 32/64] Remove python 2.6 and 3.3 everywhere. (#2583) --- AUTHORS | 1 + CONTRIBUTING.rst | 4 ++-- docs/deploying/fastcgi.rst | 2 +- setup.py | 2 -- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index cbab2a8c..3237ea65 100644 --- a/AUTHORS +++ b/AUTHORS @@ -21,6 +21,7 @@ Patches and Suggestions - Edmond Burnett - Florent Xicluna - Georg Brandl +- Hsiaoming Yang @lepture - Jeff Widman @jeffwidman - Joshua Bronson @jab - Justin Quick diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index f6ff7015..ef02b732 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -109,8 +109,8 @@ depends on which part of Flask you're working on. Travis-CI will run the full suite when you submit your pull request. The full test suite takes a long time to run because it tests multiple -combinations of Python and dependencies. You need to have Python 2.6, 2.7, 3.3, -3.4, 3.5 3.6, and PyPy 2.7 installed to run all of the environments. Then run:: +combinations of Python and dependencies. You need to have Python 2.7, 3.4, +3.5 3.6, and PyPy 2.7 installed to run all of the environments. Then run:: tox diff --git a/docs/deploying/fastcgi.rst b/docs/deploying/fastcgi.rst index 5ca2a084..46706033 100644 --- a/docs/deploying/fastcgi.rst +++ b/docs/deploying/fastcgi.rst @@ -111,7 +111,7 @@ Set yourapplication.fcgi:: #!/usr/bin/python #: optional path to your local python site-packages folder import sys - sys.path.insert(0, '/lib/python2.6/site-packages') + sys.path.insert(0, '/lib/python/site-packages') from flup.server.fcgi import WSGIServer from yourapplication import app diff --git a/setup.py b/setup.py index bb2aab41..bf2d0bc6 100644 --- a/setup.py +++ b/setup.py @@ -95,10 +95,8 @@ setup( 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', From 2433522d2967b8a5e46f16de587a8fac5088a47c Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 6 Jan 2018 17:07:56 +0100 Subject: [PATCH 33/64] Add Support for FLASK_ENV (#2570) This introduces environments to Flask --- docs/cli.rst | 15 +++++++- docs/config.rst | 43 +++++++++++++++------- docs/patterns/packages.rst | 6 +-- docs/quickstart.rst | 9 +++-- docs/server.rst | 16 ++++++-- docs/tutorial/packaging.rst | 6 ++- flask/app.py | 73 +++++++++++++++++++++---------------- flask/cli.py | 29 +++++++++------ flask/helpers.py | 14 ++++++- tests/test_helpers.py | 17 +++++++-- 10 files changed, 154 insertions(+), 74 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index 9e558ece..55d09963 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -116,6 +116,16 @@ context will be active, and the app instance will be imported. :: Use :meth:`~Flask.shell_context_processor` to add other automatic imports. +Environments +------------ + +.. versionadded:: 1.0 + +The environment in which the Flask app should run is set by the +:envvar:`FLASK_ENV` environment variable. If not set it defaults to +``production``. The other default environment which is known is +``development``. If the env is set to ``development`` the debug mode is +for instance automatically enabled. Debug Mode ---------- @@ -123,11 +133,14 @@ Debug Mode Set the :envvar:`FLASK_DEBUG` environment variable to override the application's :attr:`~Flask.debug` flag. The value ``1`` enables it, ``0`` disables it. Forcing the debug flag on also enables the debugger and reloader -when running the development server. :: +when running the development server. + +:: $ FLASK_DEBUG=1 flask run * Serving Flask app "hello" * Forcing debug mode on + * Env production * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with inotify reloader * Debugger is active! diff --git a/docs/config.rst b/docs/config.rst index 6ed27a83..e8da82d1 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -27,35 +27,52 @@ The :attr:`~flask.Flask.config` is actually a subclass of a dictionary and can be modified just like any dictionary:: app = Flask(__name__) - app.config['DEBUG'] = True + app.config['TESTING'] = True Certain configuration values are also forwarded to the :attr:`~flask.Flask` object so you can read and write them from there:: - app.debug = True + app.testing = True To update multiple keys at once you can use the :meth:`dict.update` method:: app.config.update( - DEBUG=True, + TESTING=True, SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/' ) -.. admonition:: Debug Mode with the ``flask`` Script +Environment and Debug Features +------------------------------ - If you use the :command:`flask` script to start a local development - server, to enable the debug mode, you need to export the ``FLASK_DEBUG`` - environment variable before running the server:: +Some values are special in that they can show unexpected behavior when +changed late. In particular that applies to the Flask environment and +debug mode. - $ export FLASK_DEBUG=1 - $ flask run +If you use the :command:`flask` script to start a local development server +for instance you should tell Flask that you want to work in the +development environment. For safety reasons we default the flask +environment to production mode instead of development. This is done +because development mode can turn on potentially unsafe features such as +the debugger by default. - (On Windows you need to use ``set`` instead of ``export``). +To control the environment and such fundamental features Flask provides +the two environment variables :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG`. +In versions of Flask older than 1.0 the :envvar:`FLASK_ENV` environment +variable did not exist. - ``app.debug`` and ``app.config['DEBUG']`` are not compatible with -   the :command:`flask` script. They only worked when using ``Flask.run()`` - method. +The most common way to switch Flask to development mode is to tell it to +work on the ``development`` environment:: + +$ export FLASK_ENV=development +$ flask run + +(On Windows you need to use ``set`` instead of ``export``). + +While you can attempt to flip the environment and debug flag separately in +the Flask config from the config file this is strongly discouraged as +those flags are often loaded early and changing them late might not apply +to all systems and extensions. Builtin Configuration Values ---------------------------- diff --git a/docs/patterns/packages.rst b/docs/patterns/packages.rst index cc149839..6b0ee7ad 100644 --- a/docs/patterns/packages.rst +++ b/docs/patterns/packages.rst @@ -65,10 +65,10 @@ that tells Flask where to find the application instance:: export FLASK_APP=yourapplication If you are outside of the project directory make sure to provide the exact -path to your application directory. Similarly you can turn on "debug -mode" with this environment variable:: +path to your application directory. Similarly you can turn on the +development features like this:: - export FLASK_DEBUG=true + export FLASK_ENV=development In order to install and run the application you need to issue the following commands:: diff --git a/docs/quickstart.rst b/docs/quickstart.rst index d3f3dea0..284f6d76 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -130,13 +130,16 @@ That is not very nice and Flask can do better. If you enable debug support the server will reload itself on code changes, and it will also provide you with a helpful debugger if things go wrong. -To enable debug mode you can export the ``FLASK_DEBUG`` environment variable +To enable all development features (and to disable the debug mode) you can +export the ``FLASK_ENV`` environment variable and set it to +``development`` before running the server:: - $ export FLASK_DEBUG=1 + $ export FLASK_ENV=development $ flask run -(On Windows you need to use ``set`` instead of ``export``). +(On Windows you need to use ``set`` instead of ``export`` and on Flask +versions older than 1.0 you need to export ``FLASK_DEBUG=1`` instead). This does the following things: diff --git a/docs/server.rst b/docs/server.rst index f8332ebf..7e03d8df 100644 --- a/docs/server.rst +++ b/docs/server.rst @@ -12,12 +12,13 @@ but you can also continue using the :meth:`Flask.run` method. Command Line ------------ -The :command:`flask` command line script (:ref:`cli`) is strongly recommended for -development because it provides a superior reload experience due to how it -loads the application. The basic usage is like this:: +The :command:`flask` command line script (:ref:`cli`) is strongly +recommended for development because it provides a superior reload +experience due to how it loads the application. The basic usage is like +this:: $ export FLASK_APP=my_application - $ export FLASK_DEBUG=1 + $ export FLASK_ENV=development $ flask run This will enable the debugger, the reloader and then start the server on @@ -29,6 +30,13 @@ disabled:: $ flask run --no-reload +.. note:: + + On older Flask version (before 1.0) the :envvar:`FLASK_ENV` + environment variable is not supported and you need to enable the + debug mode separately by setting the :envvar:`FLASK_DEBUG` environment + variable to ``1``. + In Code ------- diff --git a/docs/tutorial/packaging.rst b/docs/tutorial/packaging.rst index 5db921aa..13e11d5c 100644 --- a/docs/tutorial/packaging.rst +++ b/docs/tutorial/packaging.rst @@ -78,11 +78,13 @@ With that out of the way, you should be able to start up the application. Do this on Mac or Linux with the following commands in ``flaskr/``:: export FLASK_APP=flaskr - export FLASK_DEBUG=true + export FLASK_ENV=development flask run (In case you are on Windows you need to use ``set`` instead of ``export``). -The :envvar:`FLASK_DEBUG` flag enables or disables the interactive debugger. +The :envvar:`FLASK_ENV` flag if set to ``development`` turns on all +development features such as enabling the interactive debugger. + *Never leave debug mode activated in a production system*, because it will allow users to execute code on the server! diff --git a/flask/app.py b/flask/app.py index 88ca433c..e84e0a3f 100644 --- a/flask/app.py +++ b/flask/app.py @@ -27,7 +27,7 @@ from .config import Config, ConfigAttribute from .ctx import AppContext, RequestContext, _AppCtxGlobals from .globals import _request_ctx_stack, g, request, session from .helpers import _PackageBoundObject, \ - _endpoint_from_view_func, find_package, get_debug_flag, \ + _endpoint_from_view_func, find_package, get_env, get_debug_flag, \ get_flashed_messages, locked_cached_property, url_for from .logging import create_logger from .sessions import SecureCookieSessionInterface @@ -196,15 +196,6 @@ class Flask(_PackageBoundObject): #: .. versionadded:: 0.11 config_class = Config - #: The debug flag. Set this to ``True`` to enable debugging of the - #: application. In debug mode the debugger will kick in when an unhandled - #: exception occurs and the integrated server will automatically reload - #: the application if changes in the code are detected. - #: - #: This attribute can also be configured from the config with the ``DEBUG`` - #: configuration key. Defaults to ``False``. - debug = ConfigAttribute('DEBUG') - #: The testing flag. Set this to ``True`` to enable the test mode of #: Flask extensions (and in the future probably also Flask itself). #: For example this might activate test helpers that have an @@ -278,7 +269,8 @@ class Flask(_PackageBoundObject): #: Default configuration parameters. default_config = ImmutableDict({ - 'DEBUG': get_debug_flag(default=False), + 'ENV': None, + 'DEBUG': None, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'PRESERVE_CONTEXT_ON_EXCEPTION': None, @@ -647,7 +639,10 @@ class Flask(_PackageBoundObject): root_path = self.root_path if instance_relative: root_path = self.instance_path - return self.config_class(root_path, self.default_config) + defaults = dict(self.default_config) + defaults['ENV'] = get_env() + defaults['DEBUG'] = get_debug_flag() + return self.config_class(root_path, defaults) def auto_find_instance_path(self): """Tries to locate the instance path if it was not provided to the @@ -790,25 +785,38 @@ class Flask(_PackageBoundObject): rv.update(processor()) return rv - def _reconfigure_for_run_debug(self, debug): - """The ``run`` commands will set the application's debug flag. Some - application configuration may already be calculated based on the - previous debug value. This method will recalculate affected values. - - Called by the :func:`flask.cli.run` command or :meth:`Flask.run` - method if the debug flag is set explicitly in the call. - - :param debug: the new value of the debug flag - - .. versionadded:: 1.0 - Reconfigures ``app.jinja_env.auto_reload``. - """ - self.debug = debug + #: The environment value. This is typically set from outside the + #: process by setting the `FLASK_ENV` environment variable and can be + #: used to quickly switch between different environments like + #: `production` and `development`. If not set this defaults to + #: `production`. + env = ConfigAttribute('ENV') + + def _get_debug(self): + return self.config['DEBUG'] + def _set_debug(self, value): + self._set_debug_value(value) + + #: The debug flag. If this is ``True`` it enables debugging of the + #: application. In debug mode the debugger will kick in when an + #: unhandled exception occurs and the integrated server will + #: automatically reload the application if changes in the code are + #: detected. + #: + #: This value should only be configured by the :envvar:`FLASK_DEBUG` + #: environment variable. Changing it by other means will not yield + #: consistent results. The default value depends on the Flask + #: environment and will be true for the development environment and false + #: otherwise. + debug = property(_get_debug, _set_debug) + del _get_debug, _set_debug + + def _set_debug_value(self, value): + self.config['DEBUG'] = value self.jinja_env.auto_reload = self.templates_auto_reload - def run( - self, host=None, port=None, debug=None, load_dotenv=True, **options - ): + def run(self, host=None, port=None, debug=None, + load_dotenv=True, **options): """Runs the application on a local development server. Do not use ``run()`` in a production setting. It is not intended to @@ -872,11 +880,11 @@ class Flask(_PackageBoundObject): load_dotenv() if debug is not None: - self._reconfigure_for_run_debug(bool(debug)) + self.debug = bool(debug) _host = '127.0.0.1' _port = 5000 - server_name = self.config.get("SERVER_NAME") + server_name = self.config.get('SERVER_NAME') sn_host, sn_port = None, None if server_name: @@ -1055,7 +1063,8 @@ class Flask(_PackageBoundObject): return iter(self._blueprint_order) @setupmethod - def add_url_rule(self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options): + def add_url_rule(self, rule, endpoint=None, view_func=None, + provide_automatic_options=None, **options): """Connects a URL rule. Works exactly like the :meth:`route` decorator. If a view_func is provided it will be registered with the endpoint. diff --git a/flask/cli.py b/flask/cli.py index 1be7957c..2adadcc7 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -25,7 +25,7 @@ import click from . import __version__ from ._compat import getargspec, iteritems, reraise from .globals import current_app -from .helpers import get_debug_flag +from .helpers import get_debug_flag, get_env try: import dotenv @@ -341,9 +341,8 @@ class ScriptInfo(object): else: for path in ('wsgi.py', 'app.py'): import_name = prepare_import(path) - app = locate_app( - self, import_name, None, raise_if_not_found=False - ) + app = locate_app(self, import_name, None, + raise_if_not_found=False) if app: break @@ -357,8 +356,10 @@ class ScriptInfo(object): debug = get_debug_flag() + # Update the app's debug flag through the descriptor so that other + # values repopulate as well. if debug is not None: - app._reconfigure_for_run_debug(debug) + app.debug = debug self._loaded_app = app return app @@ -432,10 +433,8 @@ class FlaskGroup(AppGroup): from :file:`.env` and :file:`.flaskenv` files. """ - def __init__( - self, add_default_commands=True, create_app=None, - add_version_option=True, load_dotenv=True, **extra - ): + def __init__(self, add_default_commands=True, create_app=None, + add_version_option=True, load_dotenv=True, **extra): params = list(extra.pop('params', None) or ()) if add_version_option: @@ -610,6 +609,13 @@ def run_command(info, host, port, reload, debugger, eager_loading, """ from werkzeug.serving import run_simple + if get_env() == 'production': + click.secho('Warning: Detected a production environment. Do not ' + 'use `flask run` for production use.', + fg='red') + click.secho('Use a production ready WSGI server instead', + dim=True) + debug = get_debug_flag() if reload is None: reload = bool(debug) @@ -629,6 +635,7 @@ def run_command(info, host, port, reload, debugger, eager_loading, # we won't print anything. if info.app_import_path is not None: print(' * Serving Flask app "%s"' % info.app_import_path) + print(' * Env %s' % get_env()) if debug is not None: print(' * Forcing debug mode %s' % (debug and 'on' or 'off')) @@ -649,11 +656,11 @@ def shell_command(): import code from flask.globals import _app_ctx_stack app = _app_ctx_stack.top.app - banner = 'Python %s on %s\nApp: %s%s\nInstance: %s' % ( + banner = 'Python %s on %s\nApp: %s [%s]\nInstance: %s' % ( sys.version, sys.platform, app.import_name, - app.debug and ' [debug]' or '', + app.env, app.instance_path, ) ctx = {} diff --git a/flask/helpers.py b/flask/helpers.py index 412d9caf..705ea3e1 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -46,10 +46,20 @@ _os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, '/')) -def get_debug_flag(default=None): +def get_env(): + val = os.environ.get('FLASK_ENV') + if not val: + val = 'production' + return val + + +def get_debug_flag(): val = os.environ.get('FLASK_DEBUG') if not val: - return default + env = get_env() + if env == 'development': + return True + return False return val.lower() not in ('0', 'false', 'no') diff --git a/tests/test_helpers.py b/tests/test_helpers.py index d497c40d..1ddde116 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -21,7 +21,7 @@ from werkzeug.http import http_date, parse_cache_control_header, \ import flask from flask._compat import StringIO, text_type -from flask.helpers import get_debug_flag +from flask.helpers import get_debug_flag, get_env def has_encoding(name): @@ -886,7 +886,7 @@ class TestSafeJoin(object): class TestHelpers(object): @pytest.mark.parametrize('debug, expected_flag, expected_default_flag', [ - ('', None, True), + ('', False, False), ('0', False, False), ('False', False, False), ('No', False, False), @@ -898,7 +898,18 @@ class TestHelpers(object): assert get_debug_flag() is None else: assert get_debug_flag() == expected_flag - assert get_debug_flag(default=True) == expected_default_flag + assert get_debug_flag() == expected_default_flag + + @pytest.mark.parametrize('env, ref_env, debug', [ + ('', 'production', False), + ('production', 'production', False), + ('development', 'development', True), + ('other', 'other', False), + ]) + def test_get_env(self, monkeypatch, env, ref_env, debug): + monkeypatch.setenv('FLASK_ENV', env) + assert get_debug_flag() == debug + assert get_env() == ref_env def test_make_response(self): app = flask.Flask(__name__) From 3738f7ff99661fa0319ebe2d8228ad8c479fb46a Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 10 Jan 2018 12:02:13 -0800 Subject: [PATCH 34/64] match run command behavior in app.run output extra server information handle env var changed by load_dotenv enable threading by default --- flask/app.py | 27 ++++++++++++++++---- flask/cli.py | 70 +++++++++++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/flask/app.py b/flask/app.py index e84e0a3f..1079bb27 100644 --- a/flask/app.py +++ b/flask/app.py @@ -864,21 +864,34 @@ class Flask(_PackageBoundObject): If installed, python-dotenv will be used to load environment variables from :file:`.env` and :file:`.flaskenv` files. - .. versionchanged:: 0.10 - The default port is now picked from the ``SERVER_NAME`` variable. + If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` + environment variables will override :attr:`env` and + :attr:`debug`. + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. """ # Change this into a no-op if the server is invoked from the - # command line. Have a look at cli.py for more information. + # command line. Have a look at cli.py for more information. if os.environ.get('FLASK_RUN_FROM_CLI') == 'true': from .debughelpers import explain_ignored_app_run explain_ignored_app_run() return if load_dotenv: - from flask.cli import load_dotenv - load_dotenv() + cli.load_dotenv() + # if set, let env vars override previous values + if 'FLASK_ENV' in os.environ: + self.env = get_env() + self.debug = get_debug_flag() + elif 'FLASK_DEBUG' in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources if debug is not None: self.debug = bool(debug) @@ -892,8 +905,12 @@ class Flask(_PackageBoundObject): host = host or sn_host or _host port = int(port or sn_port or _port) + options.setdefault('use_reloader', self.debug) options.setdefault('use_debugger', self.debug) + options.setdefault('threaded', True) + + cli.show_server_banner(self.env, self.debug, self.name) from werkzeug.serving import run_simple diff --git a/flask/cli.py b/flask/cli.py index 2adadcc7..52a4f596 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -577,6 +577,28 @@ def load_dotenv(path=None): return new_dir is not None # at least one file was located and loaded +def show_server_banner(env, debug, app_import_path): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': + return + + if app_import_path is not None: + print(' * Serving Flask app "{0}"'.format(app_import_path)) + + print(' * Environment: {0}'.format(env)) + + if env == 'production': + click.secho( + ' WARNING: Do not use the development server in a production' + ' environment.', fg='red') + click.secho(' Use a production WSGI server instead.', dim=True) + + if debug is not None: + print(' * Debug mode: {0}'.format('on' if debug else 'off')) + + @click.command('run', short_help='Runs a development server.') @click.option('--host', '-h', default='127.0.0.1', help='The interface to bind to.') @@ -596,51 +618,31 @@ def load_dotenv(path=None): @pass_script_info def run_command(info, host, port, reload, debugger, eager_loading, with_threads): - """Runs a local development server for the Flask application. + """Run a local development server. - This local server is recommended for development purposes only but it - can also be used for simple intranet deployments. By default it will - not support any sort of concurrency at all to simplify debugging. This - can be changed with the --with-threads option which will enable basic - multithreading. + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. - The reloader and debugger are by default enabled if the debug flag of - Flask is enabled and disabled otherwise. + The reloader and debugger are enabled by default if + FLASK_ENV=development or FLASK_DEBUG=1. """ - from werkzeug.serving import run_simple - - if get_env() == 'production': - click.secho('Warning: Detected a production environment. Do not ' - 'use `flask run` for production use.', - fg='red') - click.secho('Use a production ready WSGI server instead', - dim=True) - debug = get_debug_flag() + if reload is None: - reload = bool(debug) + reload = debug + if debugger is None: - debugger = bool(debug) + debugger = debug + if eager_loading is None: eager_loading = not reload + show_server_banner(get_env(), debug, info.app_import_path) app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) - # Extra startup messages. This depends a bit on Werkzeug internals to - # not double execute when the reloader kicks in. - if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': - # If we have an import path we can print it out now which can help - # people understand what's being served. If we do not have an - # import path because the app was loaded through a callback then - # we won't print anything. - if info.app_import_path is not None: - print(' * Serving Flask app "%s"' % info.app_import_path) - print(' * Env %s' % get_env()) - if debug is not None: - print(' * Forcing debug mode %s' % (debug and 'on' or 'off')) - - run_simple(host, port, app, use_reloader=reload, - use_debugger=debugger, threaded=with_threads) + from werkzeug.serving import run_simple + run_simple(host, port, app, use_reloader=reload, use_debugger=debugger, + threaded=with_threads) @click.command('shell', short_help='Runs a shell in the app context.') From 8bdf820e9b9c166883ef9717e127ba46ebe43cae Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 10 Jan 2018 13:53:45 -0800 Subject: [PATCH 35/64] reset standard os env after each test --- tests/conftest.py | 42 +++++++++++++++++++++++++++++++++++++++--- tests/test_cli.py | 19 ++++--------------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 3a8ae69e..486d4b0a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,16 +6,52 @@ :copyright: (c) 2015 by the Flask Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ -import flask import gc import os -import sys import pkgutil -import pytest +import sys import textwrap + +import pytest +from _pytest import monkeypatch + +import flask from flask import Flask as _Flask +@pytest.fixture(scope='session', autouse=True) +def _standard_os_environ(): + """Set up ``os.environ`` at the start of the test session to have + standard values. Returns a list of operations that is used by + :func:`._reset_os_environ` after each test. + """ + mp = monkeypatch.MonkeyPatch() + out = ( + (os.environ, 'FLASK_APP', monkeypatch.notset), + (os.environ, 'FLASK_ENV', monkeypatch.notset), + (os.environ, 'FLASK_DEBUG', monkeypatch.notset), + (os.environ, 'FLASK_RUN_FROM_CLI', monkeypatch.notset), + (os.environ, 'WERKZEUG_RUN_MAIN', monkeypatch.notset), + ) + + for _, key, value in out: + if value is monkeypatch.notset: + mp.delenv(key, False) + else: + mp.setenv(key, value) + + yield out + mp.undo() + + +@pytest.fixture(autouse=True) +def _reset_os_environ(monkeypatch, _standard_os_environ): + """Reset ``os.environ`` to the standard environ after each test, + in case a test changed something without cleaning up. + """ + monkeypatch._setitem.extend(_standard_os_environ) + + class Flask(_Flask): testing = True secret_key = 'test key' diff --git a/tests/test_cli.py b/tests/test_cli.py index 811ef0c8..d9216f3d 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -23,9 +23,11 @@ from _pytest.monkeypatch import notset from click.testing import CliRunner from flask import Flask, current_app -from flask.cli import AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, \ - find_best_app, get_version, load_dotenv, locate_app, prepare_import, \ +from flask.cli import ( + AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, + find_best_app, get_version, load_dotenv, locate_app, prepare_import, with_appcontext +) cwd = os.getcwd() test_path = os.path.abspath(os.path.join( @@ -33,19 +35,6 @@ test_path = os.path.abspath(os.path.join( )) -@pytest.fixture(autouse=True) -def manage_os_environ(monkeypatch): - # can't use monkeypatch.delitem since we don't want to restore a value - os.environ.pop('FLASK_APP', None) - os.environ.pop('FLASK_DEBUG', None) - # use monkeypatch internals to force-delete environ keys - monkeypatch._setitem.extend(( - (os.environ, 'FLASK_APP', notset), - (os.environ, 'FLASK_DEBUG', notset), - (os.environ, 'FLASK_RUN_FROM_CLI', notset), - )) - - @pytest.fixture def runner(): return CliRunner() From 87c2e121e0bf32f5234eabbf4773a82f9d5523d2 Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 10 Jan 2018 15:38:52 -0800 Subject: [PATCH 36/64] clean up FLASK_ENV docs [ci skip] --- docs/cli.rst | 35 +++++++++------- docs/config.rst | 84 +++++++++++++++++++++++++------------ docs/quickstart.rst | 11 ++--- docs/server.rst | 14 ++++--- docs/tutorial/packaging.rst | 4 +- flask/app.py | 43 ++++++++++--------- flask/helpers.py | 21 ++++++---- 7 files changed, 129 insertions(+), 83 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index 55d09963..b82d5aff 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -116,37 +116,42 @@ context will be active, and the app instance will be imported. :: Use :meth:`~Flask.shell_context_processor` to add other automatic imports. + Environments ------------ .. versionadded:: 1.0 -The environment in which the Flask app should run is set by the -:envvar:`FLASK_ENV` environment variable. If not set it defaults to -``production``. The other default environment which is known is -``development``. If the env is set to ``development`` the debug mode is -for instance automatically enabled. +The environment in which the Flask app runs is set by the +:envvar:`FLASK_ENV` environment variable. If not set it defaults to +``production``. The other recognized environment is ``development``. +Flask and extensions may choose to enable behaviors based on the +environment. -Debug Mode ----------- - -Set the :envvar:`FLASK_DEBUG` environment variable to override the -application's :attr:`~Flask.debug` flag. The value ``1`` enables it, ``0`` -disables it. Forcing the debug flag on also enables the debugger and reloader -when running the development server. +If the env is set to ``development``, the ``flask`` command will enable +debug mode and ``flask run`` will enable the interactive debugger and +reloader. :: - $ FLASK_DEBUG=1 flask run + $ FLASK_ENV=development flask run * Serving Flask app "hello" - * Forcing debug mode on - * Env production + * Environment: development + * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with inotify reloader * Debugger is active! * Debugger PIN: 223-456-919 +Debug Mode +---------- + +Debug mode will be enabled when :envvar:`FLASK_ENV` is ``development``, +as described above. If you want to control debug mode separately, use +:envvar:`FLASK_DEBUG`. The value ``1`` enables it, ``0`` disables it. + + .. _dotenv: Environment Variables From dotenv diff --git a/docs/config.rst b/docs/config.rst index e8da82d1..777a1d28 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -20,6 +20,7 @@ object. This is the place where Flask itself puts certain configuration values and also where extensions can put their configuration values. But this is also where you can have your own configuration. + Configuration Basics -------------------- @@ -42,52 +43,77 @@ method:: SECRET_KEY=b'_5#y2L"F4Q8z\n\xec]/' ) + Environment and Debug Features ------------------------------ -Some values are special in that they can show unexpected behavior when -changed late. In particular that applies to the Flask environment and -debug mode. +The :data:`ENV` and :data:`DEBUG` config values are special because they +may behave inconsistently if changed after the app has begun setting up. +In order to set the environment and debug mode reliably, Flask uses +environment variables. -If you use the :command:`flask` script to start a local development server -for instance you should tell Flask that you want to work in the -development environment. For safety reasons we default the flask -environment to production mode instead of development. This is done -because development mode can turn on potentially unsafe features such as -the debugger by default. +The environment is used to indicate to Flask, extensions, and other +programs, like Sentry, what context Flask is running in. It is +controlled with the :envvar:`FLASK_ENV` environment variable and +defaults to ``production``. -To control the environment and such fundamental features Flask provides -the two environment variables :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG`. -In versions of Flask older than 1.0 the :envvar:`FLASK_ENV` environment -variable did not exist. +Setting :envvar:`FLASK_ENV` to ``development`` will enable debug mode. +``flask run`` will use the interactive debugger and reloader by default +in debug mode. To control this separately from the environment, use the +:envvar:`FLASK_DEBUG` flag. + +.. versionchanged:: 1.0 + Added :envvar:`FLASK_ENV` to control the environment separately + from debug mode. The development environment enables debug mode. -The most common way to switch Flask to development mode is to tell it to -work on the ``development`` environment:: +To switch Flask to the development environment and enable debug mode, +set :envvar:`FLASK_ENV`:: -$ export FLASK_ENV=development -$ flask run + $ export FLASK_ENV=development + $ flask run -(On Windows you need to use ``set`` instead of ``export``). +(On Windows, use ``set`` instead of ``export``.) + +Using the environment variables as described above is recommended. While +it is possible to set :data:`ENV` and :data:`DEBUG` in your config or +code, this is strongly discouraged. They can't be read early by the +``flask`` command, and some systems or extensions may have already +configured themselves based on a previous value. -While you can attempt to flip the environment and debug flag separately in -the Flask config from the config file this is strongly discouraged as -those flags are often loaded early and changing them late might not apply -to all systems and extensions. Builtin Configuration Values ---------------------------- The following configuration values are used internally by Flask: +.. py:data:: ENV + + What environment the app is running in. Flask and extensions may + enable behaviors based on the environment, such as enabling debug + mode. The :attr:`~flask.Flask.env` attribute maps to this config + key. This is set by the :envvar:`FLASK_ENV` environment variable and + may not behave as expected if set in code. + + **Do not enable development when deploying in production.** + + Default: ``'production'`` + + .. versionadded:: 1.0 + .. py:data:: DEBUG - Enable debug mode. When using the development server with ``flask run`` or - ``app.run``, an interactive debugger will be shown for unhanlded - exceptions, and the server will be reloaded when code changes. + Whether debug mode is enabled. When using ``flask run`` to start the + development server, an interactive debugger will be shown for + unhandled exceptions, and the server will be reloaded when code + changes. The :attr:`~flask.Flask.debug` attribute maps to this + config key. This is enabled when :data:`ENV` is ``'development'`` + and is overridden by the ``FLASK_DEBUG`` environment variable. It + may not behave as expected if set in code. - **Do not enable debug mode in production.** + **Do not enable debug mode when deploying in production.** - Default: ``False`` + Default: ``True`` if :data:`ENV` is ``'production'``, or ``False`` + otherwise. .. py:data:: TESTING @@ -339,6 +365,10 @@ The following configuration values are used internally by Flask: ``LOGGER_NAME`` and ``LOGGER_HANDLER_POLICY`` were removed. See :ref:`logging` for information about configuration. + Added :data:`ENV` to reflect the :envvar:`FLASK_ENV` environment + variable. + + Configuring from Files ---------------------- diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 284f6d76..334d7dc4 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -130,16 +130,14 @@ That is not very nice and Flask can do better. If you enable debug support the server will reload itself on code changes, and it will also provide you with a helpful debugger if things go wrong. -To enable all development features (and to disable the debug mode) you can -export the ``FLASK_ENV`` environment variable and set it to -``development`` +To enable all development features (including debug mode) you can export +the ``FLASK_ENV`` environment variable and set it to ``development`` before running the server:: $ export FLASK_ENV=development $ flask run -(On Windows you need to use ``set`` instead of ``export`` and on Flask -versions older than 1.0 you need to export ``FLASK_DEBUG=1`` instead). +(On Windows you need to use ``set`` instead of ``export``.) This does the following things: @@ -147,6 +145,9 @@ This does the following things: 2. it activates the automatic reloader 3. it enables the debug mode on the Flask application. +You can also control debug mode separately from the environment by +exporting ``FLASK_DEBUG=1``. + There are more parameters that are explained in the :ref:`server` docs. .. admonition:: Attention diff --git a/docs/server.rst b/docs/server.rst index 7e03d8df..db431a6c 100644 --- a/docs/server.rst +++ b/docs/server.rst @@ -21,21 +21,23 @@ this:: $ export FLASK_ENV=development $ flask run -This will enable the debugger, the reloader and then start the server on +This enables the development environment, including the interactive +debugger and reloader, and then starts the server on *http://localhost:5000/*. The individual features of the server can be controlled by passing more -arguments to the ``run`` option. For instance the reloader can be +arguments to the ``run`` option. For instance the reloader can be disabled:: $ flask run --no-reload .. note:: - On older Flask version (before 1.0) the :envvar:`FLASK_ENV` - environment variable is not supported and you need to enable the - debug mode separately by setting the :envvar:`FLASK_DEBUG` environment - variable to ``1``. + Prior to Flask 1.0 the :envvar:`FLASK_ENV` environment variable was + not supported and you needed to enable debug mode by exporting + ``FLASK_DEBUG=1``. This can still be used to control debug mode, but + you should prefer setting the development environment as shown + above. In Code ------- diff --git a/docs/tutorial/packaging.rst b/docs/tutorial/packaging.rst index 13e11d5c..e08f26fa 100644 --- a/docs/tutorial/packaging.rst +++ b/docs/tutorial/packaging.rst @@ -82,8 +82,8 @@ Do this on Mac or Linux with the following commands in ``flaskr/``:: flask run (In case you are on Windows you need to use ``set`` instead of ``export``). -The :envvar:`FLASK_ENV` flag if set to ``development`` turns on all -development features such as enabling the interactive debugger. +Exporting ``FLASK_ENV=development`` turns on all development features +such as enabling the interactive debugger. *Never leave debug mode activated in a production system*, because it will allow users to execute code on the server! diff --git a/flask/app.py b/flask/app.py index 1079bb27..a31eac91 100644 --- a/flask/app.py +++ b/flask/app.py @@ -785,36 +785,39 @@ class Flask(_PackageBoundObject): rv.update(processor()) return rv - #: The environment value. This is typically set from outside the - #: process by setting the `FLASK_ENV` environment variable and can be - #: used to quickly switch between different environments like - #: `production` and `development`. If not set this defaults to - #: `production`. + #: What environment the app is running in. Flask and extensions may + #: enable behaviors based on the environment, such as enabling debug + #: mode. This maps to the :data:`ENV` config key. This is set by the + #: :envvar:`FLASK_ENV` environment variable and may not behave as + #: expected if set in code. + #: + #: **Do not enable development when deploying in production.** + #: + #: Default: ``'production'`` env = ConfigAttribute('ENV') def _get_debug(self): return self.config['DEBUG'] + def _set_debug(self, value): - self._set_debug_value(value) + self.config['DEBUG'] = value + self.jinja_env.auto_reload = self.templates_auto_reload - #: The debug flag. If this is ``True`` it enables debugging of the - #: application. In debug mode the debugger will kick in when an - #: unhandled exception occurs and the integrated server will - #: automatically reload the application if changes in the code are - #: detected. + #: Whether debug mode is enabled. When using ``flask run`` to start + #: the development server, an interactive debugger will be shown for + #: unhandled exceptions, and the server will be reloaded when code + #: changes. This maps to the :data:`DEBUG` config key. This is + #: enabled when :attr:`env` is ``'development'`` and is overridden + #: by the ``FLASK_DEBUG`` environment variable. It may not behave as + #: expected if set in code. #: - #: This value should only be configured by the :envvar:`FLASK_DEBUG` - #: environment variable. Changing it by other means will not yield - #: consistent results. The default value depends on the Flask - #: environment and will be true for the development environment and false - #: otherwise. + #: **Do not enable debug mode when deploying in production.** + #: + #: Default: ``True`` if :attr:`env` is ``'development'``, or + #: ``False`` otherwise. debug = property(_get_debug, _set_debug) del _get_debug, _set_debug - def _set_debug_value(self, value): - self.config['DEBUG'] = value - self.jinja_env.auto_reload = self.templates_auto_reload - def run(self, host=None, port=None, debug=None, load_dotenv=True, **options): """Runs the application on a local development server. diff --git a/flask/helpers.py b/flask/helpers.py index 705ea3e1..922509cf 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -47,19 +47,24 @@ _os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] def get_env(): - val = os.environ.get('FLASK_ENV') - if not val: - val = 'production' - return val + """Get the environment the app is running in, indicated by the + :envvar:`FLASK_ENV` environment variable. The default is + ``'production'``. + """ + return os.environ.get('FLASK_ENV') or 'production' def get_debug_flag(): + """Get whether debug mode should be enabled for the app, indicated + by the :envvar:`FLASK_DEBUG` environment variable. The default is + ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` + otherwise. + """ val = os.environ.get('FLASK_DEBUG') + if not val: - env = get_env() - if env == 'development': - return True - return False + return get_env() == 'development' + return val.lower() not in ('0', 'false', 'no') From a9646716d25c1705cfa33561d41482ba0e1c06d4 Mon Sep 17 00:00:00 2001 From: Nickatak Date: Sun, 14 Jan 2018 16:02:43 -0800 Subject: [PATCH 37/64] Fix typo in example. --- docs/patterns/fileuploads.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/patterns/fileuploads.rst b/docs/patterns/fileuploads.rst index d0215c58..c7ae14f9 100644 --- a/docs/patterns/fileuploads.rst +++ b/docs/patterns/fileuploads.rst @@ -65,7 +65,7 @@ the file and redirects the user to the URL for the uploaded file:: if file and allowed_file(file.filename): filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) - return redirect(url_for('uploaded_file', + return redirect(url_for('upload_file', filename=filename)) return ''' From a1d9ebe4abebdb824aa9a397b001de5f9130e7a3 Mon Sep 17 00:00:00 2001 From: Fadhel_Chaabane Date: Tue, 23 Jan 2018 13:57:50 +0000 Subject: [PATCH 38/64] New Feature: Added Support for cookie's SameSite attribute. --- docs/config.rst | 9 ++++++++- docs/security.rst | 6 ++++-- flask/app.py | 1 + flask/sessions.py | 11 ++++++++++- tests/test_basic.py | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/docs/config.rst b/docs/config.rst index 777a1d28..c1854c8e 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -208,6 +208,14 @@ The following configuration values are used internally by Flask: Default: ``False`` +.. py:data:: SESSION_COOKIE_SAMESITE + + Browser will only send cookies to the domain that created them. + There are two possible values for the same-site attribute: "Strict" and "Lax" + If set to "None", the samesite flag is not set. + + Default: ``None`` + .. py:data:: PERMANENT_SESSION_LIFETIME If ``session.permanent`` is true, the cookie's expiration will be set this @@ -635,4 +643,3 @@ Example usage for both:: # or via open_instance_resource: with app.open_instance_resource('application.cfg') as f: config = f.read() - diff --git a/docs/security.rst b/docs/security.rst index 13ea2e33..b68e909e 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -195,16 +195,18 @@ They can be set on other cookies too. - ``HttpOnly`` protects the contents of cookies from being read with JavaScript. - ``SameSite`` ensures that cookies can only be requested from the same - domain that created them. It is not supported by Flask yet. + domain that created them. There are two possible values for the same-site + attribute: "Strict" and "Lax" :: app.config.update( SESSION_COOKIE_SECURE=True, SESSION_COOKIE_HTTPONLY=True, + SESSION_COOKIE_SAMESITE='Strict' ) - response.set_cookie('username', 'flask', secure=True, httponly=True) + response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Strict') Specifying ``Expires`` or ``Max-Age`` options, will remove the cookie after the given time, or the current time plus the age, respectively. If neither diff --git a/flask/app.py b/flask/app.py index a31eac91..200b5c20 100644 --- a/flask/app.py +++ b/flask/app.py @@ -284,6 +284,7 @@ class Flask(_PackageBoundObject): 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_HTTPONLY': True, 'SESSION_COOKIE_SECURE': False, + 'SESSION_COOKIE_SAMESITE': None, 'SESSION_REFRESH_EACH_REQUEST': True, 'MAX_CONTENT_LENGTH': None, 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), diff --git a/flask/sessions.py b/flask/sessions.py index 8f111718..eb028027 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -249,6 +249,13 @@ class SessionInterface(object): """ return app.config['SESSION_COOKIE_SECURE'] + def get_cookie_samesite(self, app): + """Returns "Strict", "Lax" or None if the cookie should use + samesite attribute. This currently just returns the value of + the ``SESSION_COOKIE_SAMESITE`` setting. + """ + return app.config['SESSION_COOKIE_SAMESITE'] + def get_expiration_time(self, app, session): """A helper method that returns an expiration date for the session or ``None`` if the session is linked to the browser session. The @@ -362,6 +369,7 @@ class SecureCookieSessionInterface(SessionInterface): httponly = self.get_cookie_httponly(app) secure = self.get_cookie_secure(app) + samesite = self.get_cookie_samesite(app) expires = self.get_expiration_time(app, session) val = self.get_signing_serializer(app).dumps(dict(session)) response.set_cookie( @@ -371,5 +379,6 @@ class SecureCookieSessionInterface(SessionInterface): httponly=httponly, domain=domain, path=path, - secure=secure + secure=secure, + samesite=samesite ) diff --git a/tests/test_basic.py b/tests/test_basic.py index d7406baf..b0397ee6 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -319,6 +319,7 @@ def test_session_using_session_settings(app, client): SESSION_COOKIE_DOMAIN='.example.com', SESSION_COOKIE_HTTPONLY=False, SESSION_COOKIE_SECURE=True, + SESSION_COOKIE_SAMESITE='Strict', SESSION_COOKIE_PATH='/' ) @@ -333,8 +334,45 @@ def test_session_using_session_settings(app, client): assert 'path=/' in cookie assert 'secure' in cookie assert 'httponly' not in cookie + assert 'samesite' in cookie +def test_session_using_samesite_attribute(app, client): + app.config.update( + SERVER_NAME='www.example.com:8080', + APPLICATION_ROOT='/test', + SESSION_COOKIE_DOMAIN='.example.com', + SESSION_COOKIE_HTTPONLY=False, + SESSION_COOKIE_SECURE=True, + SESSION_COOKIE_SAMESITE='anyvalue', + SESSION_COOKIE_PATH='/' + ) + + @app.route('/') + def index(): + flask.session['testing'] = 42 + return 'Hello World' + + # assert excption when samesite is not set to 'Strict', 'Lax' or None + with pytest.raises(ValueError): + rv = client.get('/', 'http://www.example.com:8080/test/') + + # assert the samesite flag is not set in the cookie, when set to None + app.config.update(SESSION_COOKIE_SAMESITE=None) + rv = client.get('/', 'http://www.example.com:8080/test/') + cookie = rv.headers['set-cookie'].lower() + assert 'samesite' not in cookie + + app.config.update(SESSION_COOKIE_SAMESITE='Strict') + rv = client.get('/', 'http://www.example.com:8080/test/') + cookie = rv.headers['set-cookie'].lower() + assert 'samesite=strict' in cookie + + app.config.update(SESSION_COOKIE_SAMESITE='Lax') + rv = client.get('/', 'http://www.example.com:8080/test/') + cookie = rv.headers['set-cookie'].lower() + assert 'samesite=lax' in cookie + def test_session_localhost_warning(recwarn, app, client): app.config.update( SERVER_NAME='localhost:5000', From db5735c3ceaa04e9d9d05d942686bd6e369d0f34 Mon Sep 17 00:00:00 2001 From: Fadhel_Chaabane Date: Tue, 23 Jan 2018 15:02:07 +0000 Subject: [PATCH 39/64] Changed Werkzeug min version to 0.14 to support SameSite cookie's attribute --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 4bfaaed1..a88f5fff 100644 --- a/tox.ini +++ b/tox.ini @@ -16,7 +16,7 @@ deps = blinker python-dotenv - lowest: Werkzeug==0.9 + lowest: Werkzeug==0.14 lowest: Jinja2==2.4 lowest: itsdangerous==0.21 lowest: Click==4.0 From 2beedabaafb16f2ba255c54c0875beb0d43664fd Mon Sep 17 00:00:00 2001 From: David Lord Date: Mon, 22 Jan 2018 12:16:37 -0800 Subject: [PATCH 40/64] add HTTPS support for flask run command --- CHANGES | 3 ++ flask/cli.py | 99 ++++++++++++++++++++++++++++++++++++++++++++--- tests/test_cli.py | 65 ++++++++++++++++++++++++++++++- 3 files changed, 159 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 3517f1a7..cf9f6de4 100644 --- a/CHANGES +++ b/CHANGES @@ -118,6 +118,8 @@ Major release, unreleased - The dev server now uses threads by default. (`#2529`_) - Loading config files with ``silent=True`` will ignore ``ENOTDIR`` errors. (`#2581`_) +- Pass ``--cert`` and ``--key`` options to ``flask run`` to run the + development server over HTTPS. (`#2606`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -154,6 +156,7 @@ Major release, unreleased .. _#2450: https://github.com/pallets/flask/pull/2450 .. _#2529: https://github.com/pallets/flask/pull/2529 .. _#2581: https://github.com/pallets/flask/pull/2581 +.. _#2606: https://github.com/pallets/flask/pull/2606 Version 0.12.3 diff --git a/flask/cli.py b/flask/cli.py index 52a4f596..43e6aa5a 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -14,6 +14,7 @@ import ast import inspect import os import re +import ssl import sys import traceback from functools import update_wrapper @@ -21,9 +22,10 @@ from operator import attrgetter from threading import Lock, Thread import click +from werkzeug.utils import import_string from . import __version__ -from ._compat import getargspec, iteritems, reraise +from ._compat import getargspec, iteritems, reraise, text_type from .globals import current_app from .helpers import get_debug_flag, get_env @@ -599,25 +601,110 @@ def show_server_banner(env, debug, app_import_path): print(' * Debug mode: {0}'.format('on' if debug else 'off')) +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = 'path' + + def __init__(self): + self.path_type = click.Path( + exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == 'adhoc': + try: + import OpenSSL + except ImportError: + raise click.BadParameter( + 'Using ad-hoc certificates requires pyOpenSSL.', + ctx, param) + + return value + + obj = import_string(value, silent=True) + + if sys.version_info < (2, 7): + if obj: + return obj + else: + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get('cert') + is_adhoc = cert == 'adhoc' + + if sys.version_info < (2, 7): + is_context = cert and not isinstance(cert, (text_type, bytes)) + else: + is_context = isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', + ctx, param) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', + ctx, param) + + if not cert: + raise click.BadParameter( + '"--cert" must also be specified.', + ctx, param) + + ctx.params['cert'] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter( + 'Required when using "--cert".', + ctx, param) + + return value + + @click.command('run', short_help='Runs a development server.') @click.option('--host', '-h', default='127.0.0.1', help='The interface to bind to.') @click.option('--port', '-p', default=5000, help='The port to bind to.') +@click.option('--cert', type=CertParamType(), + help='Specify a certificate file to use HTTPS.') +@click.option('--key', + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, expose_value=False, + help='The key file to use when specifying a certificate.') @click.option('--reload/--no-reload', default=None, - help='Enable or disable the reloader. By default the reloader ' + help='Enable or disable the reloader. By default the reloader ' 'is active if debug is enabled.') @click.option('--debugger/--no-debugger', default=None, - help='Enable or disable the debugger. By default the debugger ' + help='Enable or disable the debugger. By default the debugger ' 'is active if debug is enabled.') @click.option('--eager-loading/--lazy-loader', default=None, - help='Enable or disable eager loading. By default eager ' + help='Enable or disable eager loading. By default eager ' 'loading is enabled if the reloader is disabled.') @click.option('--with-threads/--without-threads', default=True, help='Enable or disable multithreading.') @pass_script_info def run_command(info, host, port, reload, debugger, eager_loading, - with_threads): + with_threads, cert): """Run a local development server. This server is for development purposes only. It does not provide @@ -642,7 +729,7 @@ def run_command(info, host, port, reload, debugger, eager_loading, from werkzeug.serving import run_simple run_simple(host, port, app, use_reloader=reload, use_debugger=debugger, - threaded=with_threads) + threaded=with_threads, ssl_context=cert) @click.command('shell', short_help='Runs a shell in the app context.') diff --git a/tests/test_cli.py b/tests/test_cli.py index d9216f3d..f1e5eba7 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -14,7 +14,9 @@ from __future__ import absolute_import import os +import ssl import sys +import types from functools import partial import click @@ -24,8 +26,8 @@ from click.testing import CliRunner from flask import Flask, current_app from flask.cli import ( - AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, - find_best_app, get_version, load_dotenv, locate_app, prepare_import, + AppGroup, FlaskGroup, NoAppException, ScriptInfo, dotenv, find_best_app, + get_version, load_dotenv, locate_app, prepare_import, run_command, with_appcontext ) @@ -464,3 +466,62 @@ def test_dotenv_optional(monkeypatch): monkeypatch.chdir(test_path) load_dotenv() assert 'FOO' not in os.environ + + +def test_run_cert_path(): + # no key + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--cert', __file__]) + + # no cert + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--key', __file__]) + + ctx = run_command.make_context( + 'run', ['--cert', __file__, '--key', __file__]) + assert ctx.params['cert'] == (__file__, __file__) + + +def test_run_cert_adhoc(monkeypatch): + monkeypatch.setitem(sys.modules, 'OpenSSL', None) + + # pyOpenSSL not installed + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--cert', 'adhoc']) + + # pyOpenSSL installed + monkeypatch.setitem(sys.modules, 'OpenSSL', types.ModuleType('OpenSSL')) + ctx = run_command.make_context('run', ['--cert', 'adhoc']) + assert ctx.params['cert'] == 'adhoc' + + # no key with adhoc + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--cert', 'adhoc', '--key', __file__]) + + +def test_run_cert_import(monkeypatch): + monkeypatch.setitem(sys.modules, 'not_here', None) + + # ImportError + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--cert', 'not_here']) + + # not an SSLContext + if sys.version_info >= (2, 7): + with pytest.raises(click.BadParameter): + run_command.make_context('run', ['--cert', 'flask']) + + # SSLContext + if sys.version_info < (2, 7): + ssl_context = object() + else: + ssl_context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + + monkeypatch.setitem(sys.modules, 'ssl_context', ssl_context) + ctx = run_command.make_context('run', ['--cert', 'ssl_context']) + assert ctx.params['cert'] is ssl_context + + # no --key with SSLContext + with pytest.raises(click.BadParameter): + run_command.make_context( + 'run', ['--cert', 'ssl_context', '--key', __file__]) From 382b13581ed44e0bc740968353bb5a25945bafdf Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 23 Jan 2018 15:11:50 -0800 Subject: [PATCH 41/64] clean up samesite docs --- docs/config.rst | 12 ++++++++---- docs/security.rst | 18 +++++++++++++----- flask/sessions.py | 6 +++--- tests/test_basic.py | 25 ++++++++----------------- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/config.rst b/docs/config.rst index c1854c8e..2e2833f9 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -210,12 +210,14 @@ The following configuration values are used internally by Flask: .. py:data:: SESSION_COOKIE_SAMESITE - Browser will only send cookies to the domain that created them. - There are two possible values for the same-site attribute: "Strict" and "Lax" - If set to "None", the samesite flag is not set. + Restrict how cookies are sent with requests from external sites. Can + be set to ``'Lax'`` (recommended) or ``'Strict'``. + See :ref:`security-cookie`. Default: ``None`` + .. versionadded:: 1.0 + .. py:data:: PERMANENT_SESSION_LIFETIME If ``session.permanent`` is true, the cookie's expiration will be set this @@ -369,13 +371,15 @@ The following configuration values are used internally by Flask: ``LOGGER_HANDLER_POLICY``, ``EXPLAIN_TEMPLATE_LOADING`` .. versionchanged:: 1.0 - ``LOGGER_NAME`` and ``LOGGER_HANDLER_POLICY`` were removed. See :ref:`logging` for information about configuration. Added :data:`ENV` to reflect the :envvar:`FLASK_ENV` environment variable. + Added :data:`SESSION_COOKIE_SAMESITE` to control the session + cookie's ``SameSite`` option. + Configuring from Files ---------------------- diff --git a/docs/security.rst b/docs/security.rst index b68e909e..44c095ac 100644 --- a/docs/security.rst +++ b/docs/security.rst @@ -184,6 +184,9 @@ contains the same data. :: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection + +.. _security-cookie: + Set-Cookie options ~~~~~~~~~~~~~~~~~~ @@ -194,19 +197,21 @@ They can be set on other cookies too. - ``Secure`` limits cookies to HTTPS traffic only. - ``HttpOnly`` protects the contents of cookies from being read with JavaScript. -- ``SameSite`` ensures that cookies can only be requested from the same - domain that created them. There are two possible values for the same-site - attribute: "Strict" and "Lax" +- ``SameSite`` restricts how cookies are sent with requests from + external sites. Can be set to ``'Lax'`` (recommended) or ``'Strict'``. + ``Lax`` prevents sending cookies with CSRF-prone requests from + external sites, such as submitting a form. ``Strict`` prevents sending + cookies with all external requests, including following regular links. :: app.config.update( SESSION_COOKIE_SECURE=True, SESSION_COOKIE_HTTPONLY=True, - SESSION_COOKIE_SAMESITE='Strict' + SESSION_COOKIE_SAMESITE='Lax', ) - response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Strict') + response.set_cookie('username', 'flask', secure=True, httponly=True, samesite='Lax') Specifying ``Expires`` or ``Max-Age`` options, will remove the cookie after the given time, or the current time plus the age, respectively. If neither @@ -239,6 +244,9 @@ values (or any values that need secure signatures). - https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie +.. _samesite_support: https://caniuse.com/#feat=same-site-cookie-attribute + + HTTP Public Key Pinning (HPKP) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/flask/sessions.py b/flask/sessions.py index eb028027..621f3f5e 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -250,9 +250,9 @@ class SessionInterface(object): return app.config['SESSION_COOKIE_SECURE'] def get_cookie_samesite(self, app): - """Returns "Strict", "Lax" or None if the cookie should use - samesite attribute. This currently just returns the value of - the ``SESSION_COOKIE_SAMESITE`` setting. + """Return ``'Strict'`` or ``'Lax'`` if the cookie should use the + ``SameSite`` attribute. This currently just returns the value of + the :data:`SESSION_COOKIE_SAMESITE` setting. """ return app.config['SESSION_COOKIE_SAMESITE'] diff --git a/tests/test_basic.py b/tests/test_basic.py index b0397ee6..0e55b52e 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -319,7 +319,7 @@ def test_session_using_session_settings(app, client): SESSION_COOKIE_DOMAIN='.example.com', SESSION_COOKIE_HTTPONLY=False, SESSION_COOKIE_SECURE=True, - SESSION_COOKIE_SAMESITE='Strict', + SESSION_COOKIE_SAMESITE='Lax', SESSION_COOKIE_PATH='/' ) @@ -338,41 +338,32 @@ def test_session_using_session_settings(app, client): def test_session_using_samesite_attribute(app, client): - app.config.update( - SERVER_NAME='www.example.com:8080', - APPLICATION_ROOT='/test', - SESSION_COOKIE_DOMAIN='.example.com', - SESSION_COOKIE_HTTPONLY=False, - SESSION_COOKIE_SECURE=True, - SESSION_COOKIE_SAMESITE='anyvalue', - SESSION_COOKIE_PATH='/' - ) - @app.route('/') def index(): flask.session['testing'] = 42 return 'Hello World' - # assert excption when samesite is not set to 'Strict', 'Lax' or None + app.config.update(SESSION_COOKIE_SAMESITE='invalid') + with pytest.raises(ValueError): - rv = client.get('/', 'http://www.example.com:8080/test/') + client.get('/') - # assert the samesite flag is not set in the cookie, when set to None app.config.update(SESSION_COOKIE_SAMESITE=None) - rv = client.get('/', 'http://www.example.com:8080/test/') + rv = client.get('/') cookie = rv.headers['set-cookie'].lower() assert 'samesite' not in cookie app.config.update(SESSION_COOKIE_SAMESITE='Strict') - rv = client.get('/', 'http://www.example.com:8080/test/') + rv = client.get('/') cookie = rv.headers['set-cookie'].lower() assert 'samesite=strict' in cookie app.config.update(SESSION_COOKIE_SAMESITE='Lax') - rv = client.get('/', 'http://www.example.com:8080/test/') + rv = client.get('/') cookie = rv.headers['set-cookie'].lower() assert 'samesite=lax' in cookie + def test_session_localhost_warning(recwarn, app, client): app.config.update( SERVER_NAME='localhost:5000', From 0570393bc471d72eca128ded5edc868f13a87b0a Mon Sep 17 00:00:00 2001 From: Grey Li Date: Mon, 22 Jan 2018 11:07:37 +0800 Subject: [PATCH 42/64] Update cli help for FLASK_ENV --- flask/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flask/cli.py b/flask/cli.py index 52a4f596..76ca125d 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -731,12 +731,12 @@ A general utility script for Flask applications. Provides commands from Flask, extensions, and the application. Loads the application defined in the FLASK_APP environment variable, or from a wsgi.py -file. Debug mode can be controlled with the FLASK_DEBUG -environment variable. +file. Setting the FLASK_ENV environment variable to 'development' will enable +debug mode. \b {prefix}{cmd} FLASK_APP=hello.py - {prefix}{cmd} FLASK_DEBUG=1 + {prefix}{cmd} FLASK_ENV=development {prefix}flask run """.format( cmd='export' if os.name == 'posix' else 'set', From 213afec771a92e20516e5ea468bdd2186915f186 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 23 Jan 2018 15:34:52 -0800 Subject: [PATCH 43/64] add rst extension for changelog fix changelog version --- CHANGES => CHANGES.rst | 25 +++++++++++-------------- docs/changelog.rst | 2 +- scripts/make-release.py | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) rename CHANGES => CHANGES.rst (98%) diff --git a/CHANGES b/CHANGES.rst similarity index 98% rename from CHANGES rename to CHANGES.rst index cf9f6de4..88d585db 100644 --- a/CHANGES +++ b/CHANGES.rst @@ -1,16 +1,15 @@ Flask Changelog =============== -Here you can see the full list of changes between each Flask release. +Version 1.0 +----------- -Version 0.13 ------------- - -Major release, unreleased +unreleased - **Python 2.6 and 3.3 are no longer supported.** (`pallets/meta#24`_) -- Minimum Werkzeug version bumped to 0.9, but please use the latest version. +- Minimum Werkzeug version bumped to 0.14, but please use the latest + version. - Minimum Click version bumped to 4, but please use the latest version. - Make ``app.run()`` into a noop if a Flask application is run from the development server on the command line. This avoids some behavior that @@ -115,11 +114,15 @@ Major release, unreleased depending on ``app.debug``. No handlers are removed, and a handler is only added if no handlers are already configured. (`#2436`_) - Blueprint view function name may not contain dots. (`#2450`_) +- Fix a ``ValueError`` caused by invalid Range requests in some cases. + (`#2526`_) - The dev server now uses threads by default. (`#2529`_) - Loading config files with ``silent=True`` will ignore ``ENOTDIR`` errors. (`#2581`_) - Pass ``--cert`` and ``--key`` options to ``flask run`` to run the development server over HTTPS. (`#2606`_) +- Added :data:`SESSION_COOKIE_SAMESITE` to control the ``SameSite`` + attribute on the session cookie. (`#2607`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -154,17 +157,11 @@ Major release, unreleased .. _#2430: https://github.com/pallets/flask/pull/2430 .. _#2436: https://github.com/pallets/flask/pull/2436 .. _#2450: https://github.com/pallets/flask/pull/2450 +.. _#2526: https://github.com/pallets/flask/issues/2526 .. _#2529: https://github.com/pallets/flask/pull/2529 .. _#2581: https://github.com/pallets/flask/pull/2581 .. _#2606: https://github.com/pallets/flask/pull/2606 - - -Version 0.12.3 --------------- - -Bugfix release, unreleased - -- Fix a ValueError caused by invalid Range requests in some cases +.. _#2607: https://github.com/pallets/flask/pull/2607 Version 0.12.2 diff --git a/docs/changelog.rst b/docs/changelog.rst index d6c5f48c..d9e113ec 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1 +1 @@ -.. include:: ../CHANGES +.. include:: ../CHANGES.rst diff --git a/scripts/make-release.py b/scripts/make-release.py index fc6421ab..7fb42787 100644 --- a/scripts/make-release.py +++ b/scripts/make-release.py @@ -21,7 +21,7 @@ _date_clean_re = re.compile(r'(\d+)(st|nd|rd|th)') def parse_changelog(): - with open('CHANGES') as f: + with open('CHANGES.rst') as f: lineiter = iter(f) for line in lineiter: match = re.search('^Version\s+(.*)', line.strip()) From 8a1f3626c5b21191fd02cc4eb72cb3ff62d240e3 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 23 Jan 2018 15:37:33 -0800 Subject: [PATCH 44/64] fix changelog list formatting --- CHANGES.rst | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 88d585db..b352dc42 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -87,17 +87,17 @@ unreleased if ``app.jinja_env`` was already accessed. (`#2373`_) - The following old deprecated code was removed. (`#2385`_) - - ``flask.ext`` - import extensions directly by their name instead of - through the ``flask.ext`` namespace. For example, - ``import flask.ext.sqlalchemy`` becomes ``import flask_sqlalchemy``. - - ``Flask.init_jinja_globals`` - extend ``Flask.create_jinja_environment`` - instead. - - ``Flask.error_handlers`` - tracked by ``Flask.error_handler_spec``, - use ``@app.errorhandler`` to register handlers. - - ``Flask.request_globals_class`` - use ``Flask.app_ctx_globals_class`` - instead. - - ``Flask.static_path`` - use ``Flask.static_url_path`` instead. - - ``Request.module`` - use ``Request.blueprint`` instead. + - ``flask.ext`` - import extensions directly by their name instead of + through the ``flask.ext`` namespace. For example, + ``import flask.ext.sqlalchemy`` becomes ``import flask_sqlalchemy``. + - ``Flask.init_jinja_globals`` - extend ``Flask.create_jinja_environment`` + instead. + - ``Flask.error_handlers`` - tracked by ``Flask.error_handler_spec``, + use ``@app.errorhandler`` to register handlers. + - ``Flask.request_globals_class`` - use ``Flask.app_ctx_globals_class`` + instead. + - ``Flask.static_path`` - use ``Flask.static_url_path`` instead. + - ``Request.module`` - use ``Request.blueprint`` instead. - The ``request.json`` property is no longer deprecated. (`#1421`_) - Support passing an existing ``EnvironBuilder`` or ``dict`` to From 2cba0d77eef983b605bf2f5c85a9d02fe212eda0 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sun, 28 Jan 2018 11:20:42 -0800 Subject: [PATCH 45/64] use traceback to detect call more reliably --- flask/cli.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/flask/cli.py b/flask/cli.py index 0a556ddc..383fe459 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -33,14 +33,6 @@ except ImportError: dotenv = None -def _called_with_wrong_args(factory, exc_info): - exc_type, exc_value, tb = exc_info - return exc_type is TypeError and \ - str(exc_value).startswith(( - '%s() takes' % factory.__name__, - '%s() missing' % factory.__name__)) - - class NoAppException(click.UsageError): """Raised if an application cannot be found or loaded.""" @@ -83,7 +75,7 @@ def find_best_app(script_info, module): if isinstance(app, Flask): return app except TypeError: - if not _called_with_wrong_args(app_factory, sys.exc_info()): + if not _called_with_wrong_args(app_factory): raise raise NoAppException( 'Detected factory "{factory}" in module "{module}", but ' @@ -121,6 +113,30 @@ def call_factory(script_info, app_factory, arguments=()): return app_factory() +def _called_with_wrong_args(factory): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param factory: the factory function that was called + :return: true if the call failed + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is factory.__code__: + # in the factory, it was called successfully + return False + + tb = tb.tb_next + + # didn't reach the factory + return True + finally: + del tb + + def find_app_by_string(script_info, module, app_name): """Checks if the given string is a variable name or a function. If it is a function, it checks for specified arguments and whether it takes a @@ -158,8 +174,9 @@ def find_app_by_string(script_info, module, app_name): try: app = call_factory(script_info, attr, args) except TypeError as e: - if not _called_with_wrong_args(attr, sys.exc_info()): + if not _called_with_wrong_args(attr): raise + raise NoAppException( '{e}\nThe factory "{app_name}" in module "{module}" could not ' 'be called with the specified arguments.'.format( From 8bddd3bf4da669717acea4fa71cdccc433090570 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sun, 28 Jan 2018 12:06:59 -0800 Subject: [PATCH 46/64] allow nightly to fail on travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 440bdf95..e156d1b3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,9 @@ matrix: env: TOXENV=py,codecov - python: nightly env: TOXENV=py + allow_failures: + - python: nightly + env: TOXENV=py install: - pip install tox From 7fb2ddcaf613438820a4c095ba9c972e41fc154b Mon Sep 17 00:00:00 2001 From: David Lord Date: Sun, 28 Jan 2018 14:25:48 -0800 Subject: [PATCH 47/64] add note about syntax errors in custom scripts mention pycharm version support --- docs/cli.rst | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/cli.rst b/docs/cli.rst index b82d5aff..e378a91a 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -355,15 +355,25 @@ script is available. Note that you don't need to set ``FLASK_APP``. :: $ pip install -e . $ wiki run +.. admonition:: Errors in Custom Scripts + + When using a custom script, if you introduce an error in your + module-level code, the reloader will fail because it can no longer + load the entry point. + + The ``flask`` command, being separate from your code, does not have + this issue and is recommended in most cases. + .. _console script: https://packaging.python.org/tutorials/distributing-packages/#console-scripts PyCharm Integration ------------------- -The Flask CLI features aren't yet fully integrated into the PyCharm IDE, -so we have to do a few tweaks to get them working smoothly. These -instructions should be similar for any other IDE you might want to use. +Prior to PyCharm 2018.1, the Flask CLI features weren't yet fully +integrated into PyCharm. We have to do a few tweaks to get them working +smoothly. These instructions should be similar for any other IDE you +might want to use. In PyCharm, with your project open, click on *Run* from the menu bar and go to *Edit Configurations*. You'll be greeted by a screen similar to From ae30fe7de00e2afa1835062a26f2c2f3f4e42e4b Mon Sep 17 00:00:00 2001 From: David Lord Date: Sun, 28 Jan 2018 18:48:39 -0800 Subject: [PATCH 48/64] document testing cli commands --- docs/cli.rst | 3 +++ docs/testing.rst | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/docs/cli.rst b/docs/cli.rst index e378a91a..456fdc03 100644 --- a/docs/cli.rst +++ b/docs/cli.rst @@ -247,6 +247,9 @@ group. This is useful if you want to organize multiple related commands. :: flask user create demo +See :ref:`testing-cli` for an overview of how to test your custom +commands. + Application Context ~~~~~~~~~~~~~~~~~~~ diff --git a/docs/testing.rst b/docs/testing.rst index a040b7ef..79856341 100644 --- a/docs/testing.rst +++ b/docs/testing.rst @@ -406,3 +406,50 @@ Passing the ``json`` argument in the test client methods sets the request data to the JSON-serialized object and sets the content type to ``application/json``. You can get the JSON data from the request or response with ``get_json``. + + +.. _testing-cli: + +Testing CLI Commands +-------------------- + +Click comes with `utilities for testing`_ your CLI commands. + +Use :meth:`CliRunner.invoke ` to call +commands in the same way they would be called from the command line. The +:class:`~click.testing.CliRunner` runs the command in isolation and +captures the output in a :class:`~click.testing.Result` object. :: + + import click + from click.testing import CliRunner + + @app.cli.command('hello') + @click.option('--name', default='World') + def hello_command(name) + click.echo(f'Hello, {name}!') + + def test_hello(): + runner = CliRunner() + result = runner.invoke(hello_command, ['--name', 'Flask']) + assert 'Hello, Flask' in result.output + +If you want to test how your command parses parameters, without running +the command, use the command's :meth:`~click.BaseCommand.make_context` +method. This is useful for testing complex validation rules and custom +types. :: + + def upper(ctx, param, value): + if value is not None: + return value.upper() + + @app.cli.command('hello') + @click.option('--name', default='World', callback=upper) + def hello_command(name) + click.echo(f'Hello, {name}!') + + def test_hello_params(): + context = hello_command.make_context('hello', ['--name', 'flask']) + assert context.params['name'] == 'FLASK' + +.. _click: http://click.pocoo.org/ +.. _utilities for testing: http://click.pocoo.org/testing From af32ea0b9449a2f4aeb858f546cdfea7254342fb Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 6 Feb 2018 08:03:09 -0800 Subject: [PATCH 49/64] bump dependency versions --- CHANGES.rst | 7 ++++--- flask/helpers.py | 19 +++++++------------ setup.py | 29 +++++++++++++++-------------- tox.ini | 6 +++--- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index b352dc42..b1b65a45 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,9 +8,9 @@ Version 1.0 unreleased - **Python 2.6 and 3.3 are no longer supported.** (`pallets/meta#24`_) -- Minimum Werkzeug version bumped to 0.14, but please use the latest - version. -- Minimum Click version bumped to 4, but please use the latest version. +- Bump minimum dependency versions to the latest stable versions: + Werkzeug >= 0.14, Jinja >= 2.10, itsdangerous >= 0.24, Click >= 5.1. + (`#2586`_) - Make ``app.run()`` into a noop if a Flask application is run from the development server on the command line. This avoids some behavior that was confusing to debug for newcomers. @@ -159,6 +159,7 @@ unreleased .. _#2450: https://github.com/pallets/flask/pull/2450 .. _#2526: https://github.com/pallets/flask/issues/2526 .. _#2529: https://github.com/pallets/flask/pull/2529 +.. _#2586: https://github.com/pallets/flask/issues/2586 .. _#2581: https://github.com/pallets/flask/pull/2581 .. _#2606: https://github.com/pallets/flask/pull/2606 .. _#2607: https://github.com/pallets/flask/pull/2607 diff --git a/flask/helpers.py b/flask/helpers.py index 922509cf..49968bfc 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -608,18 +608,13 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, 'headers' % filename, stacklevel=2) if conditional: - if callable(getattr(Range, 'to_content_range_header', None)): - # Werkzeug supports Range Requests - # Remove this test when support for Werkzeug <0.12 is dropped - try: - rv = rv.make_conditional(request, accept_ranges=True, - complete_length=fsize) - except RequestedRangeNotSatisfiable: - if file is not None: - file.close() - raise - else: - rv = rv.make_conditional(request) + try: + rv = rv.make_conditional(request, accept_ranges=True, + complete_length=fsize) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + raise # make sure we don't send x-sendfile for servers that # ignore the 304 status code for x-sendfile. if rv.status_code == 304: diff --git a/setup.py b/setup.py index bf2d0bc6..2ece939a 100644 --- a/setup.py +++ b/setup.py @@ -68,28 +68,26 @@ setup( include_package_data=True, zip_safe=False, platforms='any', + python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*', install_requires=[ - 'Werkzeug>=0.9', - 'Jinja2>=2.4', - 'itsdangerous>=0.21', - 'click>=4.0', + 'Werkzeug>=0.14', + 'Jinja2>=2.10', + 'itsdangerous>=0.24', + 'click>=5.1', ], extras_require={ 'dotenv': ['python-dotenv'], 'dev': [ - 'blinker', - 'python-dotenv', - 'greenlet', 'pytest>=3', 'coverage', 'tox', 'sphinx', - 'sphinxcontrib-log-cabinet' ], }, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', + 'Framework :: Flask', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', @@ -101,10 +99,13 @@ setup( 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', - 'Topic :: Software Development :: Libraries :: Python Modules' + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', + 'Topic :: Software Development :: Libraries :: Application Frameworks', + 'Topic :: Software Development :: Libraries :: Python Modules', ], - entry_points=''' - [console_scripts] - flask=flask.cli:main - ''' + entry_points={ + 'console_scripts': [ + 'flask = flask.cli:main', + ], + }, ) diff --git a/tox.ini b/tox.ini index a88f5fff..d74c8758 100644 --- a/tox.ini +++ b/tox.ini @@ -17,9 +17,9 @@ deps = python-dotenv lowest: Werkzeug==0.14 - lowest: Jinja2==2.4 - lowest: itsdangerous==0.21 - lowest: Click==4.0 + lowest: Jinja2==2.10 + lowest: itsdangerous==0.24 + lowest: Click==5.1 devel: https://github.com/pallets/werkzeug/archive/master.tar.gz devel: https://github.com/pallets/markupsafe/archive/master.tar.gz From 9bf5c3b3a3bdc3f2f2dcca2b5747378470d0d354 Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 7 Feb 2018 06:56:14 -0800 Subject: [PATCH 50/64] update project metadata new readme readme as setup.py long_description links in changes git in authors add travis osx env break out docs build in travis remove python_requires for now --- .gitattributes | 2 +- .travis.yml | 11 +- AUTHORS | 46 ++---- CHANGES.rst | 213 +++++++++++++------------ CONTRIBUTING.rst | 18 ++- LICENSE | 48 +++--- MANIFEST.in | 2 +- Makefile | 18 --- README | 49 ------ README.rst | 62 ++++++++ docs/index.rst | 33 ++-- scripts/flaskext_tester.py | 309 ------------------------------------- scripts/make-release.py | 82 ++++++---- setup.cfg | 2 +- setup.py | 65 ++------ test-requirements.txt | 3 - 16 files changed, 310 insertions(+), 653 deletions(-) delete mode 100644 README create mode 100644 README.rst delete mode 100644 scripts/flaskext_tester.py mode change 100644 => 100755 scripts/make-release.py mode change 100644 => 100755 setup.py delete mode 100644 test-requirements.txt diff --git a/.gitattributes b/.gitattributes index 8383fff9..6f9ff673 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -CHANGES merge=union +CHANGES.rst merge=union diff --git a/.travis.yml b/.travis.yml index e156d1b3..e487c353 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,9 @@ language: python matrix: include: - python: 3.6 - env: TOXENV=py,simplejson,devel,lowest,codecov,docs-html + env: TOXENV=py,simplejson,devel,lowest,codecov + - python: 3.6 + env: TOXENV=docs-html - python: 3.5 env: TOXENV=py,codecov - python: 3.4 @@ -15,9 +17,16 @@ matrix: env: TOXENV=py,codecov - python: nightly env: TOXENV=py + - os: osx + language: generic + env: TOXENV=py allow_failures: - python: nightly env: TOXENV=py + - os: osx + language: generic + env: TOXENV=py + fast_finish: true install: - pip install tox diff --git a/AUTHORS b/AUTHORS index 3237ea65..220046ed 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,40 +1,12 @@ -Flask is written and maintained by Armin Ronacher and -various contributors: +Flask is developed and maintained by the Pallets team and community +contributors. It was created by Armin Ronacher. The core maintainers +are: -Development Lead -```````````````` +- David Lord (davidism) +- Adrian Mönnich (ThiefMaster) +- Armin Ronacher (mitsuhiko) +- Marcus Unterwaditzer (untitaker) -- Armin Ronacher +A full list of contributors is available from git with:: -Patches and Suggestions -``````````````````````` - -- Adam Byrtek -- Adam Zapletal -- Ali Afshar -- Chris Edgemon -- Chris Grindstaff -- Christopher Grebs -- Daniel Neuhäuser -- Dan Sully -- David Lord @davidism -- Edmond Burnett -- Florent Xicluna -- Georg Brandl -- Hsiaoming Yang @lepture -- Jeff Widman @jeffwidman -- Joshua Bronson @jab -- Justin Quick -- Kenneth Reitz -- Keyan Pishdadian -- Marian Sigler -- Martijn Pieters -- Matt Campell -- Matthew Frazier -- Michael van Tellingen -- Ron DuPlain -- Sebastien Estienne -- Simon Sapin -- Stephane Wirtel -- Thomas Schranz -- Zhao Xiaohong + git shortlog -sne diff --git a/CHANGES.rst b/CHANGES.rst index b1b65a45..58ea4b16 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,5 @@ +.. currentmodule:: flask + Flask Changelog =============== @@ -11,114 +13,126 @@ unreleased - Bump minimum dependency versions to the latest stable versions: Werkzeug >= 0.14, Jinja >= 2.10, itsdangerous >= 0.24, Click >= 5.1. (`#2586`_) -- Make ``app.run()`` into a noop if a Flask application is run from the - development server on the command line. This avoids some behavior that - was confusing to debug for newcomers. -- Change default configuration ``JSONIFY_PRETTYPRINT_REGULAR=False``. - ``jsonify()`` method returns compressed response by default, and pretty - response in debug mode. (`#2193`_) -- Change ``Flask.__init__`` to accept two new keyword arguments, - ``host_matching`` and ``static_host``. This enables ``host_matching`` to be - set properly by the time the constructor adds the static route, and enables - the static route to be properly associated with the required host. - (``#1559``) -- ``send_file`` supports Unicode in ``attachment_filename``. (`#2223`_) -- Pass ``_scheme`` argument from ``url_for`` to ``handle_build_error``. - (`#2017`_) -- Add support for ``provide_automatic_options`` in ``add_url_rule`` to disable - adding OPTIONS method when the ``view_func`` argument is not a class. - (`#1489`_). -- ``MethodView`` can inherit method handlers from base classes. (`#1936`_) -- Errors caused while opening the session at the beginning of the request are - handled by the app's error handlers. (`#2254`_) -- Blueprints gained ``json_encoder`` and ``json_decoder`` attributes to - override the app's encoder and decoder. (`#1898`_) -- ``Flask.make_response`` raises ``TypeError`` instead of ``ValueError`` for - bad response types. The error messages have been improved to describe why the - type is invalid. (`#2256`_) -- Add ``routes`` CLI command to output routes registered on the application. - (`#2259`_) +- Skip :meth:`app.run ` when a Flask application is run from + the command line. This avoids some behavior that was confusing to + debug. +- Change the default for :data:`JSONIFY_PRETTYPRINT_REGULAR` to + ``False``. :func:`~json.jsonify` returns a compact format by default, + and an indented format in debug mode. (`#2193`_) +- :meth:`Flask.__init__ ` accepts the ``host_matching`` argument + and sets it on :attr:`~Flask.url_map`. (`#1559`_) +- :meth:`Flask.__init__ ` accepts the ``static_host`` argument + and passes it as the ``host`` argument when defining the static route. + (`#1559`_) +- :func:`send_file` supports Unicode in ``attachment_filename``. + (`#2223`_) +- Pass ``_scheme`` argument from :func:`url_for` to + :meth:`~Flask.handle_url_build_error`. (`#2017`_) +- :meth:`~Flask.add_url_rule` accepts the ``provide_automatic_options`` + argument to disable adding the ``OPTIONS`` method. (`#1489`_) +- :class:`~views.MethodView` subclasses inherit method handlers from + base classes. (`#1936`_) +- Errors caused while opening the session at the beginning of the + request are handled by the app's error handlers. (`#2254`_) +- Blueprints gained :attr:`~Blueprint.json_encoder` and + :attr:`~Blueprint.json_decoder` attributes to override the app's + encoder and decoder. (`#1898`_) +- :meth:`Flask.make_response` raises ``TypeError`` instead of + ``ValueError`` for bad response types. The error messages have been + improved to describe why the type is invalid. (`#2256`_) +- Add ``routes`` CLI command to output routes registered on the + application. (`#2259`_) - Show warning when session cookie domain is a bare hostname or an IP - address, as these may not behave properly in some browsers, such as Chrome. - (`#2282`_) + address, as these may not behave properly in some browsers, such as + Chrome. (`#2282`_) - Allow IP address as exact session cookie domain. (`#2282`_) -- ``SESSION_COOKIE_DOMAIN`` is set if it is detected through ``SERVER_NAME``. - (`#2282`_) -- Auto-detect zero-argument app factory called ``create_app`` or ``make_app`` - from ``FLASK_APP``. (`#2297`_) -- Factory functions are not required to take a ``script_info`` parameter to - work with the ``flask`` command. If they take a single parameter or a - parameter named ``script_info``, the ``ScriptInfo`` object will be passed. - (`#2319`_) -- FLASK_APP=myproject.app:create_app('dev') support. -- ``FLASK_APP`` can be set to an app factory, with arguments if needed, for - example ``FLASK_APP=myproject.app:create_app('dev')``. (`#2326`_) -- ``FLASK_APP`` can point to local packages that are not installed in dev mode, - although `pip install -e` should still be preferred. (`#2414`_) -- ``View.provide_automatic_options = True`` is set on the view function from - ``View.as_view``, to be detected in ``app.add_url_rule``. (`#2316`_) +- ``SESSION_COOKIE_DOMAIN`` is set if it is detected through + ``SERVER_NAME``. (`#2282`_) +- Auto-detect zero-argument app factory called ``create_app`` or + ``make_app`` from ``FLASK_APP``. (`#2297`_) +- Factory functions are not required to take a ``script_info`` parameter + to work with the ``flask`` command. If they take a single parameter or + a parameter named ``script_info``, the :class:`~cli.ScriptInfo` object + will be passed. (`#2319`_) +- ``FLASK_APP`` can be set to an app factory, with arguments if needed, + for example ``FLASK_APP=myproject.app:create_app('dev')``. (`#2326`_) +- ``FLASK_APP`` can point to local packages that are not installed in + editable mode, although ``pip install -e`` is still preferred. + (`#2414`_) +- The :class:`~views.View` class attribute + :attr:`~views.View.provide_automatic_options` is set in + :meth:`~views.View.as_view`, to be detected by + :meth:`~Flask.add_url_rule`. (`#2316`_) - Error handling will try handlers registered for ``blueprint, code``, - ``app, code``, ``blueprint, exception``, ``app, exception``. (`#2314`_) -- ``Cookie`` is added to the response's ``Vary`` header if the session is - accessed at all during the request (and it wasn't deleted). (`#2288`_) -- ``app.test_request_context()`` take ``subdomain`` and ``url_scheme`` - parameters for use when building base URL. (`#1621`_) -- Set ``APPLICATION_ROOT = '/'`` by default. This was already the implicit - default when it was set to ``None``. -- ``TRAP_BAD_REQUEST_ERRORS`` is enabled by default in debug mode. - ``BadRequestKeyError`` has a message with the bad key in debug mode instead - of the generic bad request message. (`#2348`_) -- Allow registering new tags with ``TaggedJSONSerializer`` to support - storing other types in the session cookie. (`#2352`_) -- Only open the session if the request has not been pushed onto the context - stack yet. This allows ``stream_with_context`` generators to access the same - session that the containing view uses. (`#2354`_) -- Add ``json`` keyword argument for the test client request methods. This will - dump the given object as JSON and set the appropriate content type. - (`#2358`_) -- Extract JSON handling to a mixin applied to both the request and response - classes used by Flask. This adds the ``is_json`` and ``get_json`` methods to - the response to make testing JSON response much easier. (`#2358`_) -- Removed error handler caching because it caused unexpected results for some - exception inheritance hierarchies. Register handlers explicitly for each - exception if you don't want to traverse the MRO. (`#2362`_) + ``app, code``, ``blueprint, exception``, ``app, exception``. + (`#2314`_) +- ``Cookie`` is added to the response's ``Vary`` header if the session + is accessed at all during the request (and not deleted). (`#2288`_) +- :meth:`~Flask.test_request_context` accepts ``subdomain`` and + ``url_scheme`` arguments for use when building the base URL. + (`#1621`_) +- Set :data:`APPLICATION_ROOT` to ``'/'`` by default. This was already + the implicit default when it was set to ``None``. +- :data:`TRAP_BAD_REQUEST_ERRORS` is enabled by default in debug mode. + ``BadRequestKeyError`` has a message with the bad key in debug mode + instead of the generic bad request message. (`#2348`_) +- Allow registering new tags with + :class:`~json.tag.TaggedJSONSerializer` to support storing other types + in the session cookie. (`#2352`_) +- Only open the session if the request has not been pushed onto the + context stack yet. This allows :func:`~stream_with_context` + generators to access the same session that the containing view uses. + (`#2354`_) +- Add ``json`` keyword argument for the test client request methods. + This will dump the given object as JSON and set the appropriate + content type. (`#2358`_) +- Extract JSON handling to a mixin applied to both the :class:`Request` + and :class:`Response` classes. This adds the :meth:`~Response.is_json` + and :meth:`~Response.get_json` methods to the response to make testing + JSON response much easier. (`#2358`_) +- Removed error handler caching because it caused unexpected results for + some exception inheritance hierarchies. Register handlers explicitly + for each exception if you want to avoid traversing the MRO. (`#2362`_) - Fix incorrect JSON encoding of aware, non-UTC datetimes. (`#2374`_) -- Template auto reloading will honor the ``run`` command's ``debug`` flag even - if ``app.jinja_env`` was already accessed. (`#2373`_) +- Template auto reloading will honor debug mode even even if + :attr:`~Flask.jinja_env` was already accessed. (`#2373`_) - The following old deprecated code was removed. (`#2385`_) - ``flask.ext`` - import extensions directly by their name instead of through the ``flask.ext`` namespace. For example, ``import flask.ext.sqlalchemy`` becomes ``import flask_sqlalchemy``. - - ``Flask.init_jinja_globals`` - extend ``Flask.create_jinja_environment`` - instead. - - ``Flask.error_handlers`` - tracked by ``Flask.error_handler_spec``, - use ``@app.errorhandler`` to register handlers. - - ``Flask.request_globals_class`` - use ``Flask.app_ctx_globals_class`` - instead. - - ``Flask.static_path`` - use ``Flask.static_url_path`` instead. - - ``Request.module`` - use ``Request.blueprint`` instead. - -- The ``request.json`` property is no longer deprecated. (`#1421`_) -- Support passing an existing ``EnvironBuilder`` or ``dict`` to - ``test_client.open``. (`#2412`_) -- The ``flask`` command and ``app.run`` will load environment variables using - from ``.env`` and ``.flaskenv`` files if python-dotenv is installed. - (`#2416`_) -- When passing a full URL to the test client, use the scheme in the URL instead - of the ``PREFERRED_URL_SCHEME``. (`#2430`_) -- ``app.logger`` has been simplified. ``LOGGER_NAME`` and - ``LOGGER_HANDLER_POLICY`` config was removed. The logger is always named - ``flask.app``. The level is only set on first access, it doesn't check - ``app.debug`` each time. Only one format is used, not different ones - depending on ``app.debug``. No handlers are removed, and a handler is only - added if no handlers are already configured. (`#2436`_) -- Blueprint view function name may not contain dots. (`#2450`_) -- Fix a ``ValueError`` caused by invalid Range requests in some cases. - (`#2526`_) -- The dev server now uses threads by default. (`#2529`_) -- Loading config files with ``silent=True`` will ignore ``ENOTDIR`` - errors. (`#2581`_) + - ``Flask.init_jinja_globals`` - extend + :meth:`Flask.create_jinja_environment` instead. + - ``Flask.error_handlers`` - tracked by + :attr:`Flask.error_handler_spec`, use :meth:`Flask.errorhandler` to + register handlers. + - ``Flask.request_globals_class`` - use + :attr:`Flask.app_ctx_globals_class` instead. + - ``Flask.static_path`` - use :attr:`Flask.static_url_path` instead. + - ``Request.module`` - use :attr:`Request.blueprint` instead. + +- The :attr:`Request.json` property is no longer deprecated. (`#1421`_) +- Support passing a :class:`~werkzeug.test.EnvironBuilder` or + ``dict`` to :meth:`test_client.open `. + (`#2412`_) +- The ``flask`` command and :meth:`Flask.run` will load environment + variables from ``.env`` and ``.flaskenv`` files if python-dotenv is + installed. (`#2416`_) +- When passing a full URL to the test client, the scheme in the URL is + used instead of :data:`PREFERRED_URL_SCHEME`. (`#2430`_) +- :attr:`Flask.logger` has been simplified. ``LOGGER_NAME`` and + ``LOGGER_HANDLER_POLICY`` config was removed. The logger is always + named ``flask.app``. The level is only set on first access, it doesn't + check :attr:`Flask.debug` each time. Only one format is used, not + different ones depending on :attr:`Flask.debug`. No handlers are + removed, and a handler is only added if no handlers are already + configured. (`#2436`_) +- Blueprint view function names may not contain dots. (`#2450`_) +- Fix a ``ValueError`` caused by invalid ``Range`` requests in some + cases. (`#2526`_) +- The development server uses threads by default. (`#2529`_) +- Loading config files with ``silent=True`` will ignore + :data:`~errno.ENOTDIR` errors. (`#2581`_) - Pass ``--cert`` and ``--key`` options to ``flask run`` to run the development server over HTTPS. (`#2606`_) - Added :data:`SESSION_COOKIE_SAMESITE` to control the ``SameSite`` @@ -127,6 +141,7 @@ unreleased .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 .. _#1489: https://github.com/pallets/flask/pull/1489 +.. _#1559: https://github.com/pallets/flask/issues/1559 .. _#1621: https://github.com/pallets/flask/pull/1621 .. _#1898: https://github.com/pallets/flask/pull/1898 .. _#1936: https://github.com/pallets/flask/pull/1936 diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index ef02b732..a9bcace6 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -131,8 +131,22 @@ Read more about `coverage `_. Running the full test suite with ``tox`` will combine the coverage reports from all runs. -``make`` targets -~~~~~~~~~~~~~~~~ + +Building the docs +~~~~~~~~~~~~~~~~~ + +Build the docs in the ``docs`` directory using Sphinx:: + + cd docs + make html + +Open ``_build/html/index.html`` in your browser to view the docs. + +Read more about `Sphinx `_. + + +make targets +~~~~~~~~~~~~ Flask provides a ``Makefile`` with various shortcuts. They will ensure that all dependencies are installed. diff --git a/LICENSE b/LICENSE index a7da10e1..8f9252f4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,33 +1,31 @@ -Copyright (c) 2015 by Armin Ronacher and contributors. See AUTHORS -for more details. +Copyright © 2010 by the Pallets team. Some rights reserved. -Redistribution and use in source and binary forms of the software as well -as documentation, with or without modification, are permitted provided -that the following conditions are met: +Redistribution and use in source and binary forms of the software as +well as documentation, with or without modification, are permitted +provided that the following conditions are met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -* The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in index 3616212e..d8a725b5 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include Makefile CHANGES LICENSE AUTHORS tox.ini +include Makefile CHANGES.rst LICENSE AUTHORS tox.ini graft artwork graft tests diff --git a/Makefile b/Makefile index aef8a782..7df5fd00 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,6 @@ test: clean-pyc install-dev pytest coverage: clean-pyc install-dev - pip install -q -e .[test] coverage run -m pytest coverage report coverage html @@ -34,20 +33,3 @@ clean-pyc: find . -name '*.pyc' -exec rm -f {} + find . -name '*.pyo' -exec rm -f {} + find . -name '*~' -exec rm -f {} + - -upload-docs: - $(MAKE) -C docs html dirhtml latex epub - $(MAKE) -C docs/_build/latex all-pdf - cd docs/_build/; mv html flask-docs; zip -r flask-docs.zip flask-docs; mv flask-docs html - rsync -a docs/_build/dirhtml/ flow.srv.pocoo.org:/srv/websites/flask.pocoo.org/docs/ - rsync -a docs/_build/latex/Flask.pdf flow.srv.pocoo.org:/srv/websites/flask.pocoo.org/docs/flask-docs.pdf - rsync -a docs/_build/flask-docs.zip flow.srv.pocoo.org:/srv/websites/flask.pocoo.org/docs/flask-docs.zip - rsync -a docs/_build/epub/Flask.epub flow.srv.pocoo.org:/srv/websites/flask.pocoo.org/docs/flask-docs.epub - -# ebook-convert docs: http://manual.calibre-ebook.com/cli/ebook-convert.html -ebook: - @echo 'Using .epub from `make upload-docs` to create .mobi.' - @echo 'Command `ebook-covert` is provided by calibre package.' - @echo 'Requires X-forwarding for Qt features used in conversion (ssh -X).' - @echo 'Do not mind "Invalid value for ..." CSS errors if .mobi renders.' - ssh -X pocoo.org ebook-convert /var/www/flask.pocoo.org/docs/flask-docs.epub /var/www/flask.pocoo.org/docs/flask-docs.mobi --cover http://flask.pocoo.org/docs/_images/logo-full.png --authors 'Armin Ronacher' diff --git a/README b/README deleted file mode 100644 index 75c5e7b1..00000000 --- a/README +++ /dev/null @@ -1,49 +0,0 @@ - - - // Flask // - - web development, one drop at a time - - - ~ What is Flask? - - Flask is a microframework for Python based on Werkzeug - and Jinja2. It's intended for getting started very quickly - and was developed with best intentions in mind. - - ~ Is it ready? - - It's still not 1.0 but it's shaping up nicely and is - already widely used. Consider the API to slightly - improve over time but we don't plan on breaking it. - - ~ What do I need? - - All dependencies are installed by using `pip install Flask`. - We encourage you to use a virtualenv. Check the docs for - complete installation and usage instructions. - - ~ Where are the docs? - - Go to http://flask.pocoo.org/docs/ for a prebuilt version - of the current documentation. Otherwise build them yourself - from the sphinx sources in the docs folder. - - ~ Where are the tests? - - Good that you're asking. The tests are in the - tests/ folder. To run the tests use the - `pytest` testing tool: - - $ pytest - - Details on contributing can be found in CONTRIBUTING.rst - - ~ Where can I get help? - - Either use the #pocoo IRC channel on irc.freenode.net or - ask on the mailinglist: http://flask.pocoo.org/mailinglist/ - - See http://flask.pocoo.org/community/ for more resources. - - diff --git a/README.rst b/README.rst new file mode 100644 index 00000000..ef01ca5b --- /dev/null +++ b/README.rst @@ -0,0 +1,62 @@ +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Flask + + +A Simple Example +---------------- + +.. code-block:: python + + from flask import Flask + + app = Flask(__name__) + + @app.route('/') + def hello(): + return 'Hello, World!' + +.. code-block:: none + + $ FLASK_APP=hello.py flask run + * Running on http://localhost:5000/ + + +Links +----- + +* Website: https://www.palletsprojects.com/p/flask/ +* Releases: https://pypi.org/project/Flask/ +* Code: https://github.com/pallets/flask +* Issue tracker: https://github.com/pallets/flask/issues +* Test status: + + * Linux, Mac: https://travis-ci.org/pallets/flask + * Windows: https://ci.appveyor.com/project/pallets/flask + +* Test coverage: https://codecov.io/gh/pallets/flask + +.. _WSGI: https://wsgi.readthedocs.io +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _pip: https://pip.pypa.io/en/stable/quickstart/ diff --git a/docs/index.rst b/docs/index.rst index 617104ee..5e9f8426 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,28 +4,23 @@ Welcome to Flask ================ .. image:: _static/logo-full.png - :alt: Flask: web development, one drop at a time - :class: floatingflask + :alt: Flask: web development, one drop at a time + :class: floatingflask -Welcome to Flask's documentation. This documentation is divided into -different parts. I recommend that you get started with -:ref:`installation` and then head over to the :ref:`quickstart`. -Besides the quickstart, there is also a more detailed :ref:`tutorial` that -shows how to create a complete (albeit small) application with Flask. If -you'd rather dive into the internals of Flask, check out -the :ref:`api` documentation. Common patterns are described in the -:ref:`patterns` section. +Welcome to Flask's documentation. Get started with :ref:`installation` +and then get an overview with the :ref:`quickstart`. There is also a +more detailed :ref:`tutorial` that shows how to create a small but +complete application with Flask. Common patterns are described in the +:ref:`patterns` section. The rest of the docs desribe each component of +Flask in detail, with a full reference in the :ref:`api` section. -Flask depends on two external libraries: the `Jinja2`_ template -engine and the `Werkzeug`_ WSGI toolkit. These libraries are not documented -here. If you want to dive into their documentation, check out the -following links: +Flask depends on the `Jinja`_ template engine and the `Werkzeug`_ WSGI +toolkit. The documentation for these libraries can be found at: -- `Jinja2 Documentation `_ -- `Werkzeug Documentation `_ +- `Jinja documentation `_ +- `Werkzeug documentation `_ - -.. _Jinja2: http://jinja.pocoo.org/ -.. _Werkzeug: http://werkzeug.pocoo.org/ +.. _Jinja: https://www.palletsprojects.com/p/jinja/ +.. _Werkzeug: https://www.palletsprojects.com/p/werkzeug/ .. include:: contents.rst.inc diff --git a/scripts/flaskext_tester.py b/scripts/flaskext_tester.py deleted file mode 100644 index 93ab0ad7..00000000 --- a/scripts/flaskext_tester.py +++ /dev/null @@ -1,309 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Flask Extension Tests - ~~~~~~~~~~~~~~~~~~~~~ - - Tests the Flask extensions. - - :copyright: (c) 2015 by Ali Afshar. - :license: BSD, see LICENSE for more details. -""" - -import os -import sys -import shutil -import urllib2 -import tempfile -import subprocess -import argparse - -from flask import json - -from setuptools.package_index import PackageIndex -from setuptools.archive_util import unpack_archive - -flask_svc_url = 'http://flask.pocoo.org/extensions/' - - -# OS X has awful paths when using mkstemp or gettempdir(). I don't -# care about security or clashes here, so pick something that is -# actually memorable. -if sys.platform == 'darwin': - _tempdir = '/private/tmp' -else: - _tempdir = tempfile.gettempdir() -tdir = _tempdir + '/flaskext-test' -flaskdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) - - -# virtualenv hack *cough* -os.environ['PYTHONDONTWRITEBYTECODE'] = '' - - -RESULT_TEMPATE = u'''\ - -Flask-Extension Test Results - -

Flask-Extension Test Results

-

- This page contains the detailed test results for the test run of - all {{ 'approved' if approved }} Flask extensions. -

Summary

- - - - - - - {%- for result in results %} - {% set outcome = 'success' if result.success else 'failed' %} - - - {%- endfor %} - -
Extension - Version - Author - License - Outcome - {%- for iptr, _ in results[0].logs|dictsort %} - {{ iptr }} - {%- endfor %} -
{{ result.name }} - {{ result.version }} - {{ result.author }} - {{ result.license }} - {{ outcome }} - {%- for iptr, _ in result.logs|dictsort %} - see log - {%- endfor %} -
-

Test Logs

-

Detailed test logs for all tests on all platforms: -{%- for result in results %} - {%- for iptr, log in result.logs|dictsort %} -

- {{ result.name }} - {{ result.version }} [{{ iptr }}]

-
{{ log }}
- {%- endfor %} -{%- endfor %} -''' - - -def log(msg, *args): - print('[EXTTEST] ' + (msg % args)) - - -class TestResult(object): - - def __init__(self, name, folder, statuscode, interpreters): - intrptr = os.path.join(folder, '.tox/%s/bin/python' - % interpreters[0]) - self.statuscode = statuscode - self.folder = folder - self.success = statuscode == 0 - - def fetch(field): - try: - c = subprocess.Popen([intrptr, 'setup.py', - '--' + field], cwd=folder, - stdout=subprocess.PIPE) - return c.communicate()[0].strip() - except OSError: - return '?' - self.name = name - self.license = fetch('license') - self.author = fetch('author') - self.version = fetch('version') - - self.logs = {} - for interpreter in interpreters: - logfile = os.path.join(folder, '.tox/%s/log/test.log' - % interpreter) - if os.path.isfile(logfile): - self.logs[interpreter] = open(logfile).read() - else: - self.logs[interpreter] = '' - - -def create_tdir(): - try: - shutil.rmtree(tdir) - except Exception: - pass - os.mkdir(tdir) - - -def package_flask(): - distfolder = tdir + '/.flask-dist' - c = subprocess.Popen(['python', 'setup.py', 'sdist', '--formats=gztar', - '--dist', distfolder], cwd=flaskdir) - c.wait() - return os.path.join(distfolder, os.listdir(distfolder)[0]) - - -def get_test_command(checkout_dir): - if os.path.isfile(checkout_dir + '/Makefile'): - return 'make test' - return 'python setup.py test' - - -def fetch_extensions_list(): - req = urllib2.Request(flask_svc_url, headers={'accept':'application/json'}) - d = urllib2.urlopen(req).read() - data = json.loads(d) - for ext in data['extensions']: - yield ext - - -def checkout_extension(name): - log('Downloading extension %s to temporary folder', name) - root = os.path.join(tdir, name) - os.mkdir(root) - checkout_path = PackageIndex().download(name, root) - - unpack_archive(checkout_path, root) - path = None - for fn in os.listdir(root): - path = os.path.join(root, fn) - if os.path.isdir(path): - break - log('Downloaded to %s', path) - return path - - -tox_template = """[tox] -envlist=%(env)s - -[testenv] -deps= - %(deps)s - distribute - py -commands=bash flaskext-runtest.sh {envlogdir}/test.log -downloadcache=%(cache)s -""" - - -def create_tox_ini(checkout_path, interpreters, flask_dep): - tox_path = os.path.join(checkout_path, 'tox-flask-test.ini') - if not os.path.exists(tox_path): - with open(tox_path, 'w') as f: - f.write(tox_template % { - 'env': ','.join(interpreters), - 'cache': tdir, - 'deps': flask_dep - }) - return tox_path - - -def iter_extensions(only_approved=True): - for ext in fetch_extensions_list(): - if ext['approved'] or not only_approved: - yield ext['name'] - - -def test_extension(name, interpreters, flask_dep): - checkout_path = checkout_extension(name) - log('Running tests with tox in %s', checkout_path) - - # figure out the test command and write a wrapper script. We - # can't write that directly into the tox ini because tox does - # not invoke the command from the shell so we have no chance - # to pipe the output into a logfile. The /dev/null hack is - # to trick py.test (if used) into not guessing widths from the - # invoking terminal. - test_command = get_test_command(checkout_path) - log('Test command: %s', test_command) - f = open(checkout_path + '/flaskext-runtest.sh', 'w') - f.write(test_command + ' &> "$1" < /dev/null\n') - f.close() - - # if there is a tox.ini, remove it, it will cause troubles - # for us. Remove it if present, we are running tox ourselves - # afterall. - - create_tox_ini(checkout_path, interpreters, flask_dep) - rv = subprocess.call(['tox', '-c', 'tox-flask-test.ini'], cwd=checkout_path) - return TestResult(name, checkout_path, rv, interpreters) - - -def run_tests(extensions, interpreters): - results = {} - create_tdir() - log('Packaging Flask') - flask_dep = package_flask() - log('Running extension tests') - log('Temporary Environment: %s', tdir) - for name in extensions: - log('Testing %s', name) - result = test_extension(name, interpreters, flask_dep) - if result.success: - log('Extension test succeeded') - else: - log('Extension test failed') - results[name] = result - return results - - -def render_results(results, approved): - from jinja2 import Template - items = results.values() - items.sort(key=lambda x: x.name.lower()) - rv = Template(RESULT_TEMPATE, autoescape=True).render(results=items, - approved=approved) - fd, filename = tempfile.mkstemp(suffix='.html') - os.fdopen(fd, 'w').write(rv.encode('utf-8') + '\n') - return filename - - -def main(): - parser = argparse.ArgumentParser(description='Runs Flask extension tests') - parser.add_argument('--all', dest='all', action='store_true', - help='run against all extensions, not just approved') - parser.add_argument('--browse', dest='browse', action='store_true', - help='show browser with the result summary') - parser.add_argument('--env', dest='env', default='py25,py26,py27', - help='the tox environments to run against') - parser.add_argument('--extension=', dest='extension', default=None, - help='tests a single extension') - args = parser.parse_args() - - if args.extension is not None: - only_approved = False - extensions = [args.extension] - else: - only_approved = not args.all - extensions = iter_extensions(only_approved) - - results = run_tests(extensions, [x.strip() for x in args.env.split(',')]) - filename = render_results(results, only_approved) - if args.browse: - import webbrowser - webbrowser.open('file:///' + filename.lstrip('/')) - print('Results written to {}'.format(filename)) - - -if __name__ == '__main__': - main() diff --git a/scripts/make-release.py b/scripts/make-release.py old mode 100644 new mode 100755 index 7fb42787..e1ca54f8 --- a/scripts/make-release.py +++ b/scripts/make-release.py @@ -1,23 +1,13 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- -""" - make-release - ~~~~~~~~~~~~ - - Helper script that performs a release. Does pretty much everything - automatically for us. - - :copyright: (c) 2015 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" from __future__ import print_function -import sys + import os import re -from datetime import datetime, date -from subprocess import Popen, PIPE +import sys +from datetime import date, datetime +from subprocess import PIPE, Popen -_date_clean_re = re.compile(r'(\d+)(st|nd|rd|th)') +_date_strip_re = re.compile(r'(?<=\d)(st|nd|rd|th)') def parse_changelog(): @@ -25,18 +15,27 @@ def parse_changelog(): lineiter = iter(f) for line in lineiter: match = re.search('^Version\s+(.*)', line.strip()) + if match is None: continue + version = match.group(1).strip() - if lineiter.next().count('-') != len(match.group(0)): + + if next(lineiter).count('-') != len(match.group(0)): continue + while 1: - change_info = lineiter.next().strip() + change_info = next(lineiter).strip() + if change_info: break - match = re.search(r'released on (\w+\s+\d+\w+\s+\d+)' - r'(?:, codename (.*))?(?i)', change_info) + match = re.search( + r'released on (\w+\s+\d+\w+\s+\d+)(?:, codename (.*))?', + change_info, + flags=re.IGNORECASE + ) + if match is None: continue @@ -46,15 +45,16 @@ def parse_changelog(): def bump_version(version): try: - parts = map(int, version.split('.')) + parts = [int(i) for i in version.split('.')] except ValueError: fail('Current version is not numeric') + parts[-1] += 1 return '.'.join(map(str, parts)) def parse_date(string): - string = _date_clean_re.sub(r'\1', string) + string = _date_strip_re.sub('', string) return datetime.strptime(string, '%B %d %Y') @@ -65,9 +65,13 @@ def set_filename_version(filename, version_number, pattern): before, old, after = match.groups() changed.append(True) return before + version_number + after + with open(filename) as f: - contents = re.sub(r"^(\s*%s\s*=\s*')(.+?)(')(?sm)" % pattern, - inject_version, f.read()) + contents = re.sub( + r"^(\s*%s\s*=\s*')(.+?)(')" % pattern, + inject_version, f.read(), + flags=re.DOTALL | re.MULTILINE + ) if not changed: fail('Could not find %s in %s', pattern, filename) @@ -81,8 +85,9 @@ def set_init_version(version): set_filename_version('flask/__init__.py', version, '__version__') -def build_and_upload(): - Popen([sys.executable, 'setup.py', 'release', 'sdist', 'bdist_wheel', 'upload']).wait() +def build(): + cmd = [sys.executable, 'setup.py', 'sdist', 'bdist_wheel'] + Popen(cmd).wait() def fail(message, *args): @@ -95,7 +100,9 @@ def info(message, *args): def get_git_tags(): - return set(Popen(['git', 'tag'], stdout=PIPE).communicate()[0].splitlines()) + return set( + Popen(['git', 'tag'], stdout=PIPE).communicate()[0].splitlines() + ) def git_is_clean(): @@ -116,29 +123,40 @@ def main(): os.chdir(os.path.join(os.path.dirname(__file__), '..')) rv = parse_changelog() + if rv is None: fail('Could not parse changelog') version, release_date, codename = rv - dev_version = bump_version(version) + '-dev' + dev_version = bump_version(version) + '.dev' - info('Releasing %s (codename %s, release date %s)', - version, codename, release_date.strftime('%d/%m/%Y')) + info( + 'Releasing %s (codename %s, release date %s)', + version, codename, release_date.strftime('%d/%m/%Y') + ) tags = get_git_tags() if version in tags: fail('Version "%s" is already tagged', version) + if release_date.date() != date.today(): - fail('Release date is not today (%s != %s)', - release_date.date(), date.today()) + fail( + 'Release date is not today (%s != %s)', + release_date.date(), date.today() + ) if not git_is_clean(): fail('You have uncommitted changes in git') + try: + import wheel # noqa: F401 + except ImportError: + fail('You need to install the wheel package.') + set_init_version(version) make_git_commit('Bump version number to %s', version) make_git_tag(version) - build_and_upload() + build() set_init_version(dev_version) diff --git a/setup.cfg b/setup.cfg index 527dd3e6..c7641dfc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [aliases] -release = egg_info -RDb '' +release = egg_info -Db '' [bdist_wheel] universal = 1 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 2ece939a..22a39b64 --- a/setup.py +++ b/setup.py @@ -1,74 +1,27 @@ -""" -Flask ------ - -Flask is a microframework for Python based on Werkzeug, Jinja 2 and good -intentions. And before you ask: It's BSD licensed! - -Flask is Fun -```````````` - -Save in a hello.py: - -.. code:: python - - from flask import Flask - app = Flask(__name__) - - @app.route("/") - def hello(): - return "Hello World!" - - if __name__ == "__main__": - app.run() - -And Easy to Setup -````````````````` - -And run it: - -.. code:: bash - - $ pip install Flask - $ python hello.py - * Running on http://localhost:5000/ - -Ready for production? `Read this first `. - -Links -````` - -* `website `_ -* `documentation `_ -* `development version - `_ - -""" +#!/usr/bin/env python +import io import re -import ast from setuptools import setup -_version_re = re.compile(r'__version__\s+=\s+(.*)') +with io.open('README.rst', 'rt', encoding='utf8') as f: + readme = f.read() -with open('flask/__init__.py', 'rb') as f: - version = str(ast.literal_eval(_version_re.search( - f.read().decode('utf-8')).group(1))) +with io.open('flask/__init__.py', 'rt', encoding='utf8') as f: + version = re.search(r'__version__ = \'(.*?)\'', f.read()).group(1) setup( name='Flask', version=version, - url='https://github.com/pallets/flask/', + url='https://www.palletsprojects.com/p/flask/', license='BSD', author='Armin Ronacher', author_email='armin.ronacher@active-4.com', - description='A microframework based on Werkzeug, Jinja2 ' - 'and good intentions', - long_description=__doc__, + description='A simple framework for building complex web applications.', + long_description=readme, packages=['flask', 'flask.json'], include_package_data=True, zip_safe=False, platforms='any', - python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*', install_requires=[ 'Werkzeug>=0.14', 'Jinja2>=2.10', diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index edf1abb9..00000000 --- a/test-requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -tox -pytest -pytest-cov \ No newline at end of file From 310fbfcf64f40f237068fddbbbe45315f9935eca Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 8 Feb 2018 10:57:40 -0800 Subject: [PATCH 51/64] revert copyright year to project start add copyright header to files --- docs/conf.py | 16 ++++++++++++++++ examples/blueprintexample/blueprintexample.py | 9 +++++++++ .../blueprintexample/test_blueprintexample.py | 8 +++++--- examples/flaskr/flaskr/blueprints/flaskr.py | 2 +- examples/flaskr/flaskr/factory.py | 2 +- examples/flaskr/setup.py | 2 +- examples/flaskr/tests/test_flaskr.py | 2 +- examples/jqueryexample/jqueryexample.py | 3 ++- examples/minitwit/minitwit/minitwit.py | 2 +- examples/minitwit/tests/test_minitwit.py | 3 ++- .../patterns/largerapp/tests/test_largerapp.py | 11 ++++++++++- .../largerapp/yourapplication/__init__.py | 9 +++++++++ .../patterns/largerapp/yourapplication/views.py | 11 ++++++++++- flask/__init__.py | 2 +- flask/__main__.py | 3 +-- flask/_compat.py | 3 ++- flask/app.py | 3 ++- flask/blueprints.py | 3 ++- flask/cli.py | 3 ++- flask/config.py | 2 +- flask/ctx.py | 2 +- flask/debughelpers.py | 3 ++- flask/globals.py | 2 +- flask/helpers.py | 2 +- flask/json/__init__.py | 8 ++++++++ flask/json/tag.py | 3 +++ flask/logging.py | 9 +++++++++ flask/sessions.py | 3 ++- flask/signals.py | 3 ++- flask/templating.py | 3 ++- flask/testing.py | 2 +- flask/views.py | 3 ++- flask/wrappers.py | 5 +++-- setup.py | 3 +++ tests/conftest.py | 3 ++- tests/test_appctx.py | 2 +- tests/test_basic.py | 2 +- tests/test_blueprints.py | 2 +- tests/test_cli.py | 11 +++++------ tests/test_config.py | 3 +-- tests/test_helpers.py | 2 +- tests/test_instance_config.py | 3 ++- tests/test_json_tag.py | 9 +++++++++ tests/test_logging.py | 9 +++++++++ tests/test_regression.py | 2 +- tests/test_reqctx.py | 2 +- tests/test_signals.py | 2 +- tests/test_subclassing.py | 2 +- tests/test_templating.py | 2 +- tests/test_testing.py | 3 ++- tests/test_user_error_handler.py | 8 ++++++++ tests/test_views.py | 2 +- 52 files changed, 167 insertions(+), 52 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 94cae16d..682391f3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,8 @@ import pkg_resources import time import datetime +from sphinx.application import Sphinx + BUILD_DATE = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) # If extensions (or modules to document with autodoc) are in another directory, @@ -296,3 +298,17 @@ def unwrap_decorators(): unwrap_decorators() del unwrap_decorators + + +def setup(app: Sphinx): + def cut_module_meta(app, what, name, obj, options, lines): + """Remove metadata from autodoc output.""" + if what != 'module': + return + + lines[:] = [ + line for line in lines + if not line.startswith((':copyright:', ':license:')) + ] + + app.connect('autodoc-process-docstring', cut_module_meta) diff --git a/examples/blueprintexample/blueprintexample.py b/examples/blueprintexample/blueprintexample.py index 78ee3a5b..6ca0dd13 100644 --- a/examples/blueprintexample/blueprintexample.py +++ b/examples/blueprintexample/blueprintexample.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +Blueprint Example +~~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from flask import Flask from simple_page.simple_page import simple_page diff --git a/examples/blueprintexample/test_blueprintexample.py b/examples/blueprintexample/test_blueprintexample.py index 2f3dd93f..44df7762 100644 --- a/examples/blueprintexample/test_blueprintexample.py +++ b/examples/blueprintexample/test_blueprintexample.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- """ - Blueprint Example Tests - ~~~~~~~~~~~~~~ +Blueprint Example Tests +~~~~~~~~~~~~~~~~~~~~~~~ - Tests the Blueprint example app +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. """ + import pytest import blueprintexample diff --git a/examples/flaskr/flaskr/blueprints/flaskr.py b/examples/flaskr/flaskr/blueprints/flaskr.py index 7b64dd9e..e42bee62 100644 --- a/examples/flaskr/flaskr/blueprints/flaskr.py +++ b/examples/flaskr/flaskr/blueprints/flaskr.py @@ -6,7 +6,7 @@ A microblog example application written as Flask tutorial with Flask and sqlite3. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/examples/flaskr/flaskr/factory.py b/examples/flaskr/flaskr/factory.py index 7541ec3c..b504f64a 100644 --- a/examples/flaskr/flaskr/factory.py +++ b/examples/flaskr/flaskr/factory.py @@ -6,7 +6,7 @@ A microblog example application written as Flask tutorial with Flask and sqlite3. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/examples/flaskr/setup.py b/examples/flaskr/setup.py index 7f1dae53..f8995a07 100644 --- a/examples/flaskr/setup.py +++ b/examples/flaskr/setup.py @@ -5,7 +5,7 @@ Tests the Flaskr application. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/examples/flaskr/tests/test_flaskr.py b/examples/flaskr/tests/test_flaskr.py index e1e9a4e7..6e7618d5 100644 --- a/examples/flaskr/tests/test_flaskr.py +++ b/examples/flaskr/tests/test_flaskr.py @@ -5,7 +5,7 @@ Tests the Flaskr application. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/examples/jqueryexample/jqueryexample.py b/examples/jqueryexample/jqueryexample.py index 39b81951..561e5375 100644 --- a/examples/jqueryexample/jqueryexample.py +++ b/examples/jqueryexample/jqueryexample.py @@ -5,9 +5,10 @@ A simple application that shows how Flask and jQuery get along. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from flask import Flask, jsonify, render_template, request app = Flask(__name__) diff --git a/examples/minitwit/minitwit/minitwit.py b/examples/minitwit/minitwit/minitwit.py index 50693dd8..2fe002e2 100644 --- a/examples/minitwit/minitwit/minitwit.py +++ b/examples/minitwit/minitwit/minitwit.py @@ -5,7 +5,7 @@ A microblogging application written with Flask and sqlite3. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/examples/minitwit/tests/test_minitwit.py b/examples/minitwit/tests/test_minitwit.py index c8992e57..3decc6da 100644 --- a/examples/minitwit/tests/test_minitwit.py +++ b/examples/minitwit/tests/test_minitwit.py @@ -5,9 +5,10 @@ Tests the MiniTwit application. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import os import tempfile import pytest diff --git a/examples/patterns/largerapp/tests/test_largerapp.py b/examples/patterns/largerapp/tests/test_largerapp.py index 6bc0531e..32553d7c 100644 --- a/examples/patterns/largerapp/tests/test_largerapp.py +++ b/examples/patterns/largerapp/tests/test_largerapp.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +Larger App Tests +~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from yourapplication import app import pytest @@ -9,4 +18,4 @@ def client(): def test_index(client): rv = client.get('/') - assert b"Hello World!" in rv.data \ No newline at end of file + assert b"Hello World!" in rv.data diff --git a/examples/patterns/largerapp/yourapplication/__init__.py b/examples/patterns/largerapp/yourapplication/__init__.py index 09407711..c2e05dda 100644 --- a/examples/patterns/largerapp/yourapplication/__init__.py +++ b/examples/patterns/largerapp/yourapplication/__init__.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +yourapplication +~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from flask import Flask app = Flask('yourapplication') diff --git a/examples/patterns/largerapp/yourapplication/views.py b/examples/patterns/largerapp/yourapplication/views.py index b112328e..5337eab7 100644 --- a/examples/patterns/largerapp/yourapplication/views.py +++ b/examples/patterns/largerapp/yourapplication/views.py @@ -1,5 +1,14 @@ +# -*- coding: utf-8 -*- +""" +yourapplication.views +~~~~~~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from yourapplication import app @app.route('/') def index(): - return 'Hello World!' \ No newline at end of file + return 'Hello World!' diff --git a/flask/__init__.py b/flask/__init__.py index bb6c4c18..08fb1dad 100644 --- a/flask/__init__.py +++ b/flask/__init__.py @@ -6,7 +6,7 @@ A microframework based on Werkzeug. It's extensively documented and follows best practice patterns. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/__main__.py b/flask/__main__.py index cbefccd2..4aee6543 100644 --- a/flask/__main__.py +++ b/flask/__main__.py @@ -5,11 +5,10 @@ Alias for flask.run for the command line. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ - if __name__ == '__main__': from .cli import main main(as_module=True) diff --git a/flask/_compat.py b/flask/_compat.py index 173b3689..a3b5b9c1 100644 --- a/flask/_compat.py +++ b/flask/_compat.py @@ -7,9 +7,10 @@ version of six so we don't have to depend on a specific version of it. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import sys PY2 = sys.version_info[0] == 2 diff --git a/flask/app.py b/flask/app.py index 200b5c20..7fa0d109 100644 --- a/flask/app.py +++ b/flask/app.py @@ -5,9 +5,10 @@ This module implements the central WSGI application object. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import os import sys import warnings diff --git a/flask/blueprints.py b/flask/blueprints.py index 4c9938e2..6291c3c0 100644 --- a/flask/blueprints.py +++ b/flask/blueprints.py @@ -6,9 +6,10 @@ Blueprints are the recommended way to implement larger or more pluggable applications in Flask 0.7 and later. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from functools import update_wrapper from .helpers import _PackageBoundObject, _endpoint_from_view_func diff --git a/flask/cli.py b/flask/cli.py index a812ae2e..2a65498e 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -5,9 +5,10 @@ A simple command line application to run flask apps. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from __future__ import print_function import ast diff --git a/flask/config.py b/flask/config.py index f73a4232..d6074baa 100644 --- a/flask/config.py +++ b/flask/config.py @@ -5,7 +5,7 @@ Implements the configuration related objects. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/ctx.py b/flask/ctx.py index 9e184c18..3438d63f 100644 --- a/flask/ctx.py +++ b/flask/ctx.py @@ -5,7 +5,7 @@ Implements the objects required to keep the context. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/debughelpers.py b/flask/debughelpers.py index 9e44fe69..e9765f20 100644 --- a/flask/debughelpers.py +++ b/flask/debughelpers.py @@ -5,9 +5,10 @@ Various helpers to make the development experience better. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import os from warnings import warn diff --git a/flask/globals.py b/flask/globals.py index 0b70a3ef..f99238cd 100644 --- a/flask/globals.py +++ b/flask/globals.py @@ -6,7 +6,7 @@ Defines all the global objects that are proxies to the current active context. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/helpers.py b/flask/helpers.py index 49968bfc..1b8e323b 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -5,7 +5,7 @@ Implements various helpers. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/json/__init__.py b/flask/json/__init__.py index 6a10b737..f482c72c 100644 --- a/flask/json/__init__.py +++ b/flask/json/__init__.py @@ -1,4 +1,12 @@ # -*- coding: utf-8 -*- +""" +flask.json +~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + import io import uuid from datetime import date, datetime diff --git a/flask/json/tag.py b/flask/json/tag.py index 3c57884e..1e51d6fc 100644 --- a/flask/json/tag.py +++ b/flask/json/tag.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Tagged JSON ~~~~~~~~~~~ @@ -37,6 +38,8 @@ processes dicts first, so insert the new tag at the front of the order since app.session_interface.serializer.register(TagOrderedDict, 0) +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. """ from base64 import b64decode, b64encode diff --git a/flask/logging.py b/flask/logging.py index 86a3fa33..389c2c22 100644 --- a/flask/logging.py +++ b/flask/logging.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +flask.logging +~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from __future__ import absolute_import import logging diff --git a/flask/sessions.py b/flask/sessions.py index 621f3f5e..ec4253d5 100644 --- a/flask/sessions.py +++ b/flask/sessions.py @@ -5,9 +5,10 @@ Implements cookie based sessions based on itsdangerous. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import hashlib import warnings from collections import MutableMapping diff --git a/flask/signals.py b/flask/signals.py index dd52cdb5..18f26307 100644 --- a/flask/signals.py +++ b/flask/signals.py @@ -6,9 +6,10 @@ Implements signals based on blinker if available, otherwise falls silently back to a noop. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + signals_available = False try: from blinker import Namespace diff --git a/flask/templating.py b/flask/templating.py index 2da4926d..02402008 100644 --- a/flask/templating.py +++ b/flask/templating.py @@ -5,9 +5,10 @@ Implements the bridge to Jinja2. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from jinja2 import BaseLoader, Environment as BaseEnvironment, \ TemplateNotFound diff --git a/flask/testing.py b/flask/testing.py index 730ad61d..586084eb 100644 --- a/flask/testing.py +++ b/flask/testing.py @@ -6,7 +6,7 @@ Implements test support helpers. This module is lazily imported and usually not used in production environments. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/flask/views.py b/flask/views.py index b3027970..1f2c997b 100644 --- a/flask/views.py +++ b/flask/views.py @@ -5,9 +5,10 @@ This module provides class-based views inspired by the ones in Django. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from .globals import request from ._compat import with_metaclass diff --git a/flask/wrappers.py b/flask/wrappers.py index 807059d0..25d119ba 100644 --- a/flask/wrappers.py +++ b/flask/wrappers.py @@ -5,9 +5,10 @@ Implements the WSGI wrappers (request and response). - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + from werkzeug.exceptions import BadRequest from werkzeug.wrappers import Request as RequestBase, Response as ResponseBase @@ -122,7 +123,7 @@ class Request(RequestBase, JSONMixin): #: Though if the request's method was invalid for the URL rule, #: the valid list is available in ``routing_exception.valid_methods`` #: instead (an attribute of the Werkzeug exception :exc:`~werkzeug.exceptions.MethodNotAllowed`) - #: because the request was never internally bound. + #: because the request was never internally bound. #: #: .. versionadded:: 0.6 url_rule = None diff --git a/setup.py b/setup.py index 22a39b64..4ad54766 100755 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- import io import re from setuptools import setup @@ -16,6 +17,8 @@ setup( license='BSD', author='Armin Ronacher', author_email='armin.ronacher@active-4.com', + maintainer='Pallets team', + maintainer_email='contact@palletsprojects.com', description='A simple framework for building complex web applications.', long_description=readme, packages=['flask', 'flask.json'], diff --git a/tests/conftest.py b/tests/conftest.py index 486d4b0a..7b01d864 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,9 +3,10 @@ tests.conftest ~~~~~~~~~~~~~~ - :copyright: (c) 2015 by the Flask Team, see AUTHORS for more details. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import gc import os import pkgutil diff --git a/tests/test_appctx.py b/tests/test_appctx.py index fc2f6b13..5121c4a2 100644 --- a/tests/test_appctx.py +++ b/tests/test_appctx.py @@ -5,7 +5,7 @@ Tests the application context. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_basic.py b/tests/test_basic.py index 0e55b52e..a054ae39 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -5,7 +5,7 @@ The basic functionality. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index c58a0d3b..ba69073c 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -5,7 +5,7 @@ Blueprints (and currently modules) - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_cli.py b/tests/test_cli.py index 3ffb3034..f7755258 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -3,14 +3,13 @@ tests.test_cli ~~~~~~~~~~~~~~ - :copyright: (c) 2016 by the Flask Team, see AUTHORS for more details. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ -# -# This file was part of Flask-CLI and was modified under the terms its license, -# the Revised BSD License. -# Copyright (C) 2015 CERN. -# + +# This file was part of Flask-CLI and was modified under the terms of +# its Revised BSD License. Copyright © 2015 CERN. + from __future__ import absolute_import import os diff --git a/tests/test_config.py b/tests/test_config.py index 1f817c3e..5584ed25 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -3,11 +3,10 @@ tests.test_config ~~~~~~~~~~~~~~~~~ - :copyright: (c) 2015 by the Flask Team, see AUTHORS for more details. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ - from datetime import timedelta import os import textwrap diff --git a/tests/test_helpers.py b/tests/test_helpers.py index 1ddde116..73c43297 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -5,7 +5,7 @@ Various helpers. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_instance_config.py b/tests/test_instance_config.py index 7c2ce6ff..bc912c64 100644 --- a/tests/test_instance_config.py +++ b/tests/test_instance_config.py @@ -3,9 +3,10 @@ tests.test_instance ~~~~~~~~~~~~~~~~~~~ - :copyright: (c) 2015 by the Flask Team, see AUTHORS for more details. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import os import sys diff --git a/tests/test_json_tag.py b/tests/test_json_tag.py index b8cb6550..6f42539e 100644 --- a/tests/test_json_tag.py +++ b/tests/test_json_tag.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +tests.test_json_tag +~~~~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from datetime import datetime from uuid import uuid4 diff --git a/tests/test_logging.py b/tests/test_logging.py index 80540e84..7577ecec 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +""" +tests.test_logging +~~~~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + import logging import sys diff --git a/tests/test_regression.py b/tests/test_regression.py index d2c088f7..d0765354 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -5,7 +5,7 @@ Tests regressions. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_reqctx.py b/tests/test_reqctx.py index 87e9a0fb..75d79c67 100644 --- a/tests/test_reqctx.py +++ b/tests/test_reqctx.py @@ -5,7 +5,7 @@ Tests the request context. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_signals.py b/tests/test_signals.py index 5e4113f6..fccd8e2f 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -5,7 +5,7 @@ Signalling. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_subclassing.py b/tests/test_subclassing.py index 82739a7e..43a1625a 100644 --- a/tests/test_subclassing.py +++ b/tests/test_subclassing.py @@ -6,7 +6,7 @@ Test that certain behavior of flask can be customized by subclasses. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_templating.py b/tests/test_templating.py index d871ca4d..5073ae46 100644 --- a/tests/test_templating.py +++ b/tests/test_templating.py @@ -5,7 +5,7 @@ Template functionality - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ diff --git a/tests/test_testing.py b/tests/test_testing.py index a673c2e1..615f120e 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -5,9 +5,10 @@ Test client and more. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ + import pytest import flask diff --git a/tests/test_user_error_handler.py b/tests/test_user_error_handler.py index cd76aa6b..18d5f277 100644 --- a/tests/test_user_error_handler.py +++ b/tests/test_user_error_handler.py @@ -1,4 +1,12 @@ # -*- coding: utf-8 -*- +""" +tests.test_user_error_handler +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:copyright: © 2010 by the Pallets team. +:license: BSD, see LICENSE for more details. +""" + from werkzeug.exceptions import ( Forbidden, InternalServerError, diff --git a/tests/test_views.py b/tests/test_views.py index 4176e542..69bd9131 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -5,7 +5,7 @@ Pluggable views. - :copyright: (c) 2015 by Armin Ronacher. + :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ From a9a078c93f412094492ea547492d697ff48ee0cd Mon Sep 17 00:00:00 2001 From: David Lord Date: Thu, 8 Feb 2018 13:04:19 -0800 Subject: [PATCH 52/64] install python in travis osx env --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.travis.yml b/.travis.yml index e487c353..0ff95ecd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +os: linux sudo: false language: python @@ -28,6 +29,14 @@ matrix: env: TOXENV=py fast_finish: true +before_install: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew update; + brew install python3 redis memcached; + virtualenv -p python3 ~/py-env; + . ~/py-env/bin/activate; + fi + install: - pip install tox From 575021c07be6b168ca4c3664ea484248c9ffe960 Mon Sep 17 00:00:00 2001 From: Josh Holland Date: Mon, 12 Feb 2018 22:26:02 +0000 Subject: [PATCH 53/64] Fix docs for test_request_context Fixes #2627. --- flask/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask/app.py b/flask/app.py index 7fa0d109..bbd66be7 100644 --- a/flask/app.py +++ b/flask/app.py @@ -2140,8 +2140,8 @@ class Flask(_PackageBoundObject): return RequestContext(self, environ) def test_request_context(self, *args, **kwargs): - """Creates a WSGI environment from the given values (see - :class:`werkzeug.test.EnvironBuilder` for more information, this + """Creates a :class:`~flask.ctx.RequestContext` from the given values + (see :class:`werkzeug.test.EnvironBuilder` for more information, this function accepts the same arguments plus two additional). Additional arguments (only if ``base_url`` is not specified): From cf5525f98a2a9a15f6bb93b050dfd43f2bd90d97 Mon Sep 17 00:00:00 2001 From: David Lord Date: Mon, 19 Feb 2018 15:34:46 -0800 Subject: [PATCH 54/64] add test_cli_runner for testing app.cli commands --- CHANGES.rst | 3 +++ docs/api.rst | 9 ++++++++ docs/testing.rst | 30 +++++++++++++++++--------- flask/app.py | 25 ++++++++++++++++++++++ flask/testing.py | 36 +++++++++++++++++++++++++++++++ tests/test_testing.py | 49 +++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 140 insertions(+), 12 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 58ea4b16..84fa436f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -137,6 +137,8 @@ unreleased development server over HTTPS. (`#2606`_) - Added :data:`SESSION_COOKIE_SAMESITE` to control the ``SameSite`` attribute on the session cookie. (`#2607`_) +- Added :meth:`~flask.Flask.test_cli_runner` to create a Click runner + that can invoke Flask CLI commands for testing. (`#2636`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -178,6 +180,7 @@ unreleased .. _#2581: https://github.com/pallets/flask/pull/2581 .. _#2606: https://github.com/pallets/flask/pull/2606 .. _#2607: https://github.com/pallets/flask/pull/2607 +.. _#2636: https://github.com/pallets/flask/pull/2636 Version 0.12.2 diff --git a/docs/api.rst b/docs/api.rst index e24160c4..de33ff95 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -188,6 +188,15 @@ Test Client :members: +Test CLI Runner +--------------- + +.. currentmodule:: flask.testing + +.. autoclass:: FlaskCliRunner + :members: + + Application Globals ------------------- diff --git a/docs/testing.rst b/docs/testing.rst index 79856341..4a272df6 100644 --- a/docs/testing.rst +++ b/docs/testing.rst @@ -413,15 +413,17 @@ with ``get_json``. Testing CLI Commands -------------------- -Click comes with `utilities for testing`_ your CLI commands. +Click comes with `utilities for testing`_ your CLI commands. A +:class:`~click.testing.CliRunner` runs commands in isolation and +captures the output in a :class:`~click.testing.Result` object. -Use :meth:`CliRunner.invoke ` to call -commands in the same way they would be called from the command line. The -:class:`~click.testing.CliRunner` runs the command in isolation and -captures the output in a :class:`~click.testing.Result` object. :: +Flask provides :meth:`~flask.Flask.test_cli_runner` to create a +:class:`~flask.testing.FlaskCliRunner` that passes the Flask app to the +CLI automatically. Use its :meth:`~flask.testing.FlaskCliRunner.invoke` +method to call commands in the same way they would be called from the +command line. :: import click - from click.testing import CliRunner @app.cli.command('hello') @click.option('--name', default='World') @@ -429,14 +431,22 @@ captures the output in a :class:`~click.testing.Result` object. :: click.echo(f'Hello, {name}!') def test_hello(): - runner = CliRunner() + runner = app.test_cli_runner() + + # invoke the command directly result = runner.invoke(hello_command, ['--name', 'Flask']) assert 'Hello, Flask' in result.output + # or by name + result = runner.invoke(args=['hello']) + assert 'World' in result.output + +In the example above, invoking the command by name is useful because it +verifies that the command was correctly registered with the app. + If you want to test how your command parses parameters, without running -the command, use the command's :meth:`~click.BaseCommand.make_context` -method. This is useful for testing complex validation rules and custom -types. :: +the command, use its :meth:`~click.BaseCommand.make_context` method. +This is useful for testing complex validation rules and custom types. :: def upper(ctx, param, value): if value is not None: diff --git a/flask/app.py b/flask/app.py index bbd66be7..7c53a583 100644 --- a/flask/app.py +++ b/flask/app.py @@ -311,6 +311,14 @@ class Flask(_PackageBoundObject): #: .. versionadded:: 0.7 test_client_class = None + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class = None + #: the session interface to use. By default an instance of #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. #: @@ -983,6 +991,23 @@ class Flask(_PackageBoundObject): from flask.testing import FlaskClient as cls return cls(self, self.response_class, use_cookies=use_cookies, **kwargs) + def test_cli_runner(self, **kwargs): + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from flask.testing import FlaskCliRunner as cls + + return cls(self, **kwargs) + def open_session(self, request): """Creates or opens a new session. Default implementation stores all session data in a signed cookie. This requires that the diff --git a/flask/testing.py b/flask/testing.py index 586084eb..cd346ce0 100644 --- a/flask/testing.py +++ b/flask/testing.py @@ -12,6 +12,9 @@ import werkzeug from contextlib import contextmanager + +from click.testing import CliRunner +from flask.cli import ScriptInfo from werkzeug.test import Client, EnvironBuilder from flask import _request_ctx_stack from flask.json import dumps as json_dumps @@ -193,3 +196,36 @@ class FlaskClient(Client): top = _request_ctx_stack.top if top is not None and top.preserved: top.pop() + + +class FlaskCliRunner(CliRunner): + """A :class:`~click.testing.CliRunner` for testing a Flask app's + CLI commands. Typically created using + :meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`. + """ + def __init__(self, app, **kwargs): + self.app = app + super(FlaskCliRunner, self).__init__(**kwargs) + + def invoke(self, cli=None, args=None, **kwargs): + """Invokes a CLI command in an isolated environment. See + :meth:`CliRunner.invoke ` for + full method documentation. See :ref:`testing-cli` for examples. + + If the ``obj`` argument is not given, passes an instance of + :class:`~flask.cli.ScriptInfo` that knows how to load the Flask + app being tested. + + :param cli: Command object to invoke. Default is the app's + :attr:`~flask.app.Flask.cli` group. + :param args: List of strings to invoke the command with. + + :return: a :class:`~click.testing.Result` object. + """ + if cli is None: + cli = self.app.cli + + if 'obj' not in kwargs: + kwargs['obj'] = ScriptInfo(create_app=lambda: self.app) + + return super(FlaskCliRunner, self).invoke(cli, args, **kwargs) diff --git a/tests/test_testing.py b/tests/test_testing.py index 615f120e..b0619d2c 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -8,15 +8,16 @@ :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ - +import click import pytest import flask import werkzeug from flask._compat import text_type +from flask.cli import ScriptInfo from flask.json import jsonify -from flask.testing import make_test_environ_builder +from flask.testing import make_test_environ_builder, FlaskCliRunner def test_environ_defaults_from_config(app, client): @@ -335,3 +336,47 @@ def test_nosubdomain(app, client): assert 200 == response.status_code assert b'xxx' == response.data + + +def test_cli_runner_class(app): + runner = app.test_cli_runner() + assert isinstance(runner, FlaskCliRunner) + + class SubRunner(FlaskCliRunner): + pass + + app.test_cli_runner_class = SubRunner + runner = app.test_cli_runner() + assert isinstance(runner, SubRunner) + + +def test_cli_invoke(app): + @app.cli.command('hello') + def hello_command(): + click.echo('Hello, World!') + + runner = app.test_cli_runner() + # invoke with command name + result = runner.invoke(args=['hello']) + assert 'Hello' in result.output + # invoke with command object + result = runner.invoke(hello_command) + assert 'Hello' in result.output + + +def test_cli_custom_obj(app): + class NS(object): + called = False + + def create_app(): + NS.called = True + return app + + @app.cli.command('hello') + def hello_command(): + click.echo('Hello, World!') + + script_info = ScriptInfo(create_app=create_app) + runner = app.test_cli_runner() + runner.invoke(hello_command, obj=script_info) + assert NS.called From 8cec2010c0564bbd6e1f9cd8881404f70178247f Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Mon, 19 Feb 2018 21:20:03 +0100 Subject: [PATCH 55/64] Do not enable subdomain matching by default Updated tests for new subdomain matching Added a test to validate matching behavior --- CHANGES.rst | 2 ++ flask/app.py | 16 +++++++++++++++- tests/test_basic.py | 33 +++++++++++++++++++++++++++++---- tests/test_testing.py | 8 ++++++-- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 84fa436f..8b0a945e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -139,6 +139,8 @@ unreleased attribute on the session cookie. (`#2607`_) - Added :meth:`~flask.Flask.test_cli_runner` to create a Click runner that can invoke Flask CLI commands for testing. (`#2636`_) +- Subdomain matching is disabled by default now. It can be turned on by + passing ``subdomain_matching=True`` to the Flask constructor. .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 diff --git a/flask/app.py b/flask/app.py index 7c53a583..70a0c65b 100644 --- a/flask/app.py +++ b/flask/app.py @@ -126,6 +126,11 @@ class Flask(_PackageBoundObject): .. versionadded:: 0.13 The `host_matching` and `static_host` parameters were added. + .. versionadded:: 1.0 + The `subdomain_matching` parameter was added. Subdomain matching + needs to be enabled manually now. Setting `SERVER_NAME` does not + implicitly enable it. + :param import_name: the name of the application package :param static_url_path: can be used to specify a different path for the static files on the web. Defaults to the name @@ -347,6 +352,7 @@ class Flask(_PackageBoundObject): static_folder='static', static_host=None, host_matching=False, + subdomain_matching=False, template_folder='templates', instance_path=None, instance_relative_config=False, @@ -530,6 +536,7 @@ class Flask(_PackageBoundObject): self.url_map = Map() self.url_map.host_matching = host_matching + self.subdomain_matching = subdomain_matching # tracks internally if the application already handled at least one # request. @@ -1988,8 +1995,15 @@ class Flask(_PackageBoundObject): URL adapter is created for the application context. """ if request is not None: - return self.url_map.bind_to_environ(request.environ, + rv = self.url_map.bind_to_environ(request.environ, server_name=self.config['SERVER_NAME']) + # If subdomain matching is not enabled (which is the default + # we put back the default subdomain in all cases. This really + # should be the default in Werkzeug but it currently does not + # have that feature. + if not self.subdomain_matching: + rv.subdomain = self.url_map.default_subdomain + return rv # We need at the very least the server name to be set for this # to work. if self.config['SERVER_NAME'] is not None: diff --git a/tests/test_basic.py b/tests/test_basic.py index a054ae39..ecf3ee71 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1429,10 +1429,12 @@ def test_request_locals(): assert not flask.g -def test_test_app_proper_environ(app, client): +def test_test_app_proper_environ(): + app = flask.Flask(__name__, subdomain_matching=True) app.config.update( SERVER_NAME='localhost.localdomain:5000' ) + client = app.test_client() @app.route('/') def index(): @@ -1783,8 +1785,10 @@ def test_g_iteration_protocol(app_ctx): assert sorted(flask.g) == ['bar', 'foo'] -def test_subdomain_basic_support(app, client): +def test_subdomain_basic_support(): + app = flask.Flask(__name__, subdomain_matching=True) app.config['SERVER_NAME'] = 'localhost.localdomain' + client = app.test_client() @app.route('/') def normal_index(): @@ -1801,7 +1805,9 @@ def test_subdomain_basic_support(app, client): assert rv.data == b'test index' -def test_subdomain_matching(app, client): +def test_subdomain_matching(): + app = flask.Flask(__name__, subdomain_matching=True) + client = app.test_client() app.config['SERVER_NAME'] = 'localhost.localdomain' @app.route('/', subdomain='') @@ -1812,8 +1818,10 @@ def test_subdomain_matching(app, client): assert rv.data == b'index for mitsuhiko' -def test_subdomain_matching_with_ports(app, client): +def test_subdomain_matching_with_ports(): + app = flask.Flask(__name__, subdomain_matching=True) app.config['SERVER_NAME'] = 'localhost.localdomain:3000' + client = app.test_client() @app.route('/', subdomain='') def index(user): @@ -1823,6 +1831,23 @@ def test_subdomain_matching_with_ports(app, client): assert rv.data == b'index for mitsuhiko' +def test_subdomain_matching_behavior(): + for matching in False, True: + app = flask.Flask(__name__, subdomain_matching=matching) + app.config['SERVER_NAME'] = 'localhost.localdomain:3000' + client = app.test_client() + + @app.route('/') + def index(): + return 'matched without subdomain' + + rv = client.get('/', 'http://127.0.0.1:3000/') + if matching: + assert rv.status_code == 404 + else: + assert rv.data == b'matched without subdomain' + + def test_multi_route_rules(app, client): @app.route('/') @app.route('//') diff --git a/tests/test_testing.py b/tests/test_testing.py index b0619d2c..14c66324 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -114,9 +114,11 @@ def test_path_is_url(app): assert eb.path == '/' -def test_blueprint_with_subdomain(app, client): +def test_blueprint_with_subdomain(): + app = flask.Flask(__name__, subdomain_matching=True) app.config['SERVER_NAME'] = 'example.com:1234' app.config['APPLICATION_ROOT'] = '/foo' + client = app.test_client() bp = flask.Blueprint('company', __name__, subdomain='xxx') @@ -304,8 +306,10 @@ def test_json_request_and_response(app, client): assert rv.get_json() == json_data -def test_subdomain(app, client): +def test_subdomain(): + app = flask.Flask(__name__, subdomain_matching=True) app.config['SERVER_NAME'] = 'example.com' + client = app.test_client() @app.route('/', subdomain='') def view(company_id): From 82f0d120deb9ea52237d95a14a4a619b01d06f80 Mon Sep 17 00:00:00 2001 From: David Lord Date: Fri, 23 Feb 2018 07:51:34 -0800 Subject: [PATCH 56/64] use subdomain arg in url_map.bind_to_environ rename new subdomain test, parametrize test allowing subdomains as well as ips add subdomain_matching param to docs add some references to docs add version changed to create_url_adapter --- CHANGES.rst | 7 +++++-- docs/config.rst | 15 +++++++------- flask/app.py | 50 +++++++++++++++++++++++++-------------------- tests/test_basic.py | 28 +++++++++++++------------ 4 files changed, 56 insertions(+), 44 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 8b0a945e..6a363149 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -139,8 +139,10 @@ unreleased attribute on the session cookie. (`#2607`_) - Added :meth:`~flask.Flask.test_cli_runner` to create a Click runner that can invoke Flask CLI commands for testing. (`#2636`_) -- Subdomain matching is disabled by default now. It can be turned on by - passing ``subdomain_matching=True`` to the Flask constructor. +- Subdomain matching is disabled by default and setting + :data:`SERVER_NAME` does not implicily enable it. It can be enabled by + passing ``subdomain_matching=True`` to the ``Flask`` constructor. + (`#2635`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -183,6 +185,7 @@ unreleased .. _#2606: https://github.com/pallets/flask/pull/2606 .. _#2607: https://github.com/pallets/flask/pull/2607 .. _#2636: https://github.com/pallets/flask/pull/2636 +.. _#2635: https://github.com/pallets/flask/pull/2635 Version 0.12.2 diff --git a/docs/config.rst b/docs/config.rst index 2e2833f9..c496ac00 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -181,8 +181,8 @@ The following configuration values are used internally by Flask: .. py:data:: SESSION_COOKIE_DOMAIN The domain match rule that the session cookie will be valid for. If not - set, the cookie will be valid for all subdomains of ``SERVER_NAME``. If - ``False``, the cookie's domain will not be set. + set, the cookie will be valid for all subdomains of :data:`SERVER_NAME`. + If ``False``, the cookie's domain will not be set. Default: ``None`` @@ -257,13 +257,14 @@ The following configuration values are used internally by Flask: .. py:data:: SERVER_NAME - Inform the application what host and port it is bound to. Required for - subdomain route matching support. + Inform the application what host and port it is bound to. Required + for subdomain route matching support. If set, will be used for the session cookie domain if - ``SESSION_COOKIE_DOMAIN`` is not set. Modern web browsers will not allow - setting cookies for domains without a dot. To use a domain locally, - add any names that should route to the app to your ``hosts`` file. :: + :data:`SESSION_COOKIE_DOMAIN` is not set. Modern web browsers will + not allow setting cookies for domains without a dot. To use a domain + locally, add any names that should route to the app to your + ``hosts`` file. :: 127.0.0.1 localhost.dev diff --git a/flask/app.py b/flask/app.py index 70a0c65b..89be4dc5 100644 --- a/flask/app.py +++ b/flask/app.py @@ -123,13 +123,13 @@ class Flask(_PackageBoundObject): .. versionadded:: 0.11 The `root_path` parameter was added. - .. versionadded:: 0.13 - The `host_matching` and `static_host` parameters were added. + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. .. versionadded:: 1.0 - The `subdomain_matching` parameter was added. Subdomain matching - needs to be enabled manually now. Setting `SERVER_NAME` does not - implicitly enable it. + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. :param import_name: the name of the application package :param static_url_path: can be used to specify a different path for the @@ -138,11 +138,13 @@ class Flask(_PackageBoundObject): :param static_folder: the folder with static files that should be served at `static_url_path`. Defaults to the ``'static'`` folder in the root path of the application. - :param host_matching: sets the app's ``url_map.host_matching`` to the given - value. Defaults to False. - :param static_host: the host to use when adding the static route. Defaults - to None. Required when using ``host_matching=True`` - with a ``static_folder`` configured. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. :param template_folder: the folder that contains the templates that should be used by the application. Defaults to ``'templates'`` folder in the root path of the @@ -1984,26 +1986,30 @@ class Flask(_PackageBoundObject): return rv def create_url_adapter(self, request): - """Creates a URL adapter for the given request. The URL adapter - is created at a point where the request context is not yet set up - so the request is passed explicitly. + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. .. versionadded:: 0.6 .. versionchanged:: 0.9 This can now also be called without a request object when the URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. """ if request is not None: - rv = self.url_map.bind_to_environ(request.environ, - server_name=self.config['SERVER_NAME']) - # If subdomain matching is not enabled (which is the default - # we put back the default subdomain in all cases. This really - # should be the default in Werkzeug but it currently does not - # have that feature. - if not self.subdomain_matching: - rv.subdomain = self.url_map.default_subdomain - return rv + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + subdomain = ((self.url_map.default_subdomain or None) + if not self.subdomain_matching else None) + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config['SERVER_NAME'], + subdomain=subdomain) # We need at the very least the server name to be set for this # to work. if self.config['SERVER_NAME'] is not None: diff --git a/tests/test_basic.py b/tests/test_basic.py index ecf3ee71..66e0d907 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1831,21 +1831,23 @@ def test_subdomain_matching_with_ports(): assert rv.data == b'index for mitsuhiko' -def test_subdomain_matching_behavior(): - for matching in False, True: - app = flask.Flask(__name__, subdomain_matching=matching) - app.config['SERVER_NAME'] = 'localhost.localdomain:3000' - client = app.test_client() +@pytest.mark.parametrize('matching', (False, True)) +def test_subdomain_matching_other_name(matching): + app = flask.Flask(__name__, subdomain_matching=matching) + app.config['SERVER_NAME'] = 'localhost.localdomain:3000' + client = app.test_client() - @app.route('/') - def index(): - return 'matched without subdomain' + @app.route('/') + def index(): + return '', 204 - rv = client.get('/', 'http://127.0.0.1:3000/') - if matching: - assert rv.status_code == 404 - else: - assert rv.data == b'matched without subdomain' + # ip address can't match name + rv = client.get('/', 'http://127.0.0.1:3000/') + assert rv.status_code == 404 if matching else 204 + + # allow all subdomains if matching is disabled + rv = client.get('/', 'http://www.localhost.localdomain:3000/') + assert rv.status_code == 404 if matching else 204 def test_multi_route_rules(app, client): From 0887245bfde8e5d65cc3d807dc574a0a07511eb4 Mon Sep 17 00:00:00 2001 From: zcchen Date: Mon, 12 Feb 2018 18:38:54 +0800 Subject: [PATCH 57/64] Add re.sub for blueprint add_url_rule handler, prevent '/a//b/'(blueprint.url_prefix='/a/' and the route is '/b/') happened. --- flask/blueprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flask/blueprints.py b/flask/blueprints.py index 6291c3c0..5d8bfaae 100644 --- a/flask/blueprints.py +++ b/flask/blueprints.py @@ -10,6 +10,7 @@ :license: BSD, see LICENSE for more details. """ +import re from functools import update_wrapper from .helpers import _PackageBoundObject, _endpoint_from_view_func @@ -67,6 +68,7 @@ class BlueprintSetupState(object): """ if self.url_prefix: rule = self.url_prefix + rule + rule = re.sub('/+', '/', rule) options.setdefault('subdomain', self.subdomain) if endpoint is None: endpoint = _endpoint_from_view_func(view_func) From 401423df063e82bdac25c5b94ed4edc33e05de5e Mon Sep 17 00:00:00 2001 From: David Lord Date: Fri, 23 Feb 2018 15:45:37 -0800 Subject: [PATCH 58/64] only strip one slash when registering blueprint add test and changelog --- CHANGES.rst | 3 +++ flask/blueprints.py | 6 +++--- tests/test_blueprints.py | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 6a363149..d33bac95 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -143,6 +143,8 @@ unreleased :data:`SERVER_NAME` does not implicily enable it. It can be enabled by passing ``subdomain_matching=True`` to the ``Flask`` constructor. (`#2635`_) +- A single trailing slash is stripped from the blueprint ``url_prefix`` + when it is registered with the app. (`#2629`_) .. _pallets/meta#24: https://github.com/pallets/meta/issues/24 .. _#1421: https://github.com/pallets/flask/issues/1421 @@ -186,6 +188,7 @@ unreleased .. _#2607: https://github.com/pallets/flask/pull/2607 .. _#2636: https://github.com/pallets/flask/pull/2636 .. _#2635: https://github.com/pallets/flask/pull/2635 +.. _#2629: https://github.com/pallets/flask/pull/2629 Version 0.12.2 diff --git a/flask/blueprints.py b/flask/blueprints.py index 5d8bfaae..d633685f 100644 --- a/flask/blueprints.py +++ b/flask/blueprints.py @@ -9,8 +9,6 @@ :copyright: © 2010 by the Pallets team. :license: BSD, see LICENSE for more details. """ - -import re from functools import update_wrapper from .helpers import _PackageBoundObject, _endpoint_from_view_func @@ -54,6 +52,9 @@ class BlueprintSetupState(object): #: The prefix that should be used for all URLs defined on the #: blueprint. + if url_prefix and url_prefix[-1] == '/': + url_prefix = url_prefix[:-1] + self.url_prefix = url_prefix #: A dictionary with URL defaults that is added to each and every @@ -68,7 +69,6 @@ class BlueprintSetupState(object): """ if self.url_prefix: rule = self.url_prefix + rule - rule = re.sub('/+', '/', rule) options.setdefault('subdomain', self.subdomain) if endpoint is None: endpoint = _endpoint_from_view_func(view_func) diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index ba69073c..7984a815 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -114,7 +114,20 @@ def test_blueprint_app_error_handling(app, client): assert client.get('/nope').data == b'you shall not pass' -def test_blueprint_url_definitions(app, client): +def test_blueprint_prefix_slash(app, client): + bp = flask.Blueprint('test', __name__, url_prefix='/bar/') + + @bp.route('/foo') + def foo(): + return '', 204 + + app.register_blueprint(bp) + app.register_blueprint(bp, url_prefix='/spam/') + assert client.get('/bar/foo').status_code == 204 + assert client.get('/spam/foo').status_code == 204 + + +def test_blueprint_url_defaults(app, client): bp = flask.Blueprint('test', __name__) @bp.route('/foo', defaults={'baz': 42}) From 303a3d24a6491f61599f2412388267dc4c677cc9 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sat, 24 Feb 2018 08:03:30 -0800 Subject: [PATCH 59/64] rewrite quickstart Unique URLs section --- docs/quickstart.rst | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 334d7dc4..50db1dff 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -228,7 +228,7 @@ Converter types: Unique URLs / Redirection Behavior `````````````````````````````````` -Take these two rules:: +The following two rules differ in their use of a trailing slash. :: @app.route('/projects/') def projects(): @@ -238,20 +238,17 @@ Take these two rules:: def about(): return 'The about page' -Though they look similar, they differ in their use of the trailing slash in -the URL. In the first case, the canonical URL for the ``projects`` endpoint -uses a trailing slash. It's similar to a folder in a file system; if you -access the URL without a trailing slash, Flask redirects you to the -canonical URL with the trailing slash. +The canonical URL for the ``projects`` endpoint has a trailing slash. +It's similar to a folder in a file system. If you access the URL without +a trailing slash, Flask redirects you to the canonical URL with the +trailing slash. -In the second case, however, the URL definition lacks a trailing slash, -like the pathname of a file on UNIX-like systems. Accessing the URL with a -trailing slash produces a 404 “Not Found” error. +The canonical URL for the ``about`` endpoint does not have a trailing +slash. It's similar to the pathname of a file. Accessing the URL with a +trailing slash produces a 404 "Not Found" error. This helps keep URLs +unique for these resources, which helps search engines avoid indexing +the same page twice. -This behavior allows relative URLs to continue working even if the trailing -slash is omitted, consistent with how Apache and other servers work. Also, -the URLs will stay unique, which helps search engines avoid indexing the -same page twice. .. _url-building: @@ -271,7 +268,9 @@ Why would you want to build URLs using the URL reversing function manually change hard-coded URLs. 3. URL building handles escaping of special characters and Unicode data transparently. -4. If your application is placed outside the URL root, for example, in +4. The generated paths are always absolute, avoiding unexpected behavior + of relative paths in browsers. +5. If your application is placed outside the URL root, for example, in ``/myapplication`` instead of ``/``, :func:`~flask.url_for` properly handles that for you. From 624895620aa253c076bc021b520e91d20b51d7c9 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sat, 24 Feb 2018 08:23:12 -0800 Subject: [PATCH 60/64] ignore pytest cache --- .gitignore | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 231c0873..04b039bf 100644 --- a/.gitignore +++ b/.gitignore @@ -3,19 +3,20 @@ .flaskenv *.pyc *.pyo -env +env/ env* -dist -build +dist/ +build/ *.egg -*.egg-info +*.egg-info/ _mailinglist -.tox +.tox/ .cache/ +.pytest_cache/ .idea/ # Coverage reports -htmlcov +htmlcov/ .coverage .coverage.* *,cover From 5f42989ce31e90b8de9d733109c7e285de8237c7 Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 28 Feb 2018 06:50:49 -0800 Subject: [PATCH 61/64] don't use Flask(__name__) in conftest --- tests/conftest.py | 2 +- tests/test_appctx.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7b01d864..2c19c763 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -60,7 +60,7 @@ class Flask(_Flask): @pytest.fixture def app(): - app = Flask(__name__) + app = Flask('flask_test', root_path=os.path.dirname(__file__)) return app diff --git a/tests/test_appctx.py b/tests/test_appctx.py index 5121c4a2..678bf510 100644 --- a/tests/test_appctx.py +++ b/tests/test_appctx.py @@ -215,5 +215,5 @@ def test_clean_pop(app): except ZeroDivisionError: pass - assert called == ['conftest', 'TEARDOWN'] + assert called == ['flask_test', 'TEARDOWN'] assert not flask.current_app From 4462cc57c8fab7967fd26a94f9f3f1417dffa2b4 Mon Sep 17 00:00:00 2001 From: David Lord Date: Wed, 28 Feb 2018 07:52:03 -0800 Subject: [PATCH 62/64] rewrite extension docs remove old extension patterns remove flask.ext from api docs --- docs/api.rst | 16 --------- docs/extensiondev.rst | 82 +++++-------------------------------------- docs/extensions.rst | 71 +++++++++++++++++-------------------- 3 files changed, 41 insertions(+), 128 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index de33ff95..0db2f6b6 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -370,22 +370,6 @@ Configuration .. autoclass:: Config :members: -Extensions ----------- - -.. data:: flask.ext - - This module acts as redirect import module to Flask extensions. It was - added in 0.8 as the canonical way to import Flask extensions and makes - it possible for us to have more flexibility in how we distribute - extensions. - - If you want to use an extension named “Flask-Foo” you would import it - from :data:`~flask.ext` as follows:: - - from flask.ext import foo - - .. versionadded:: 0.8 Stream Helpers -------------- diff --git a/docs/extensiondev.rst b/docs/extensiondev.rst index 29c33f3c..677cc19a 100644 --- a/docs/extensiondev.rst +++ b/docs/extensiondev.rst @@ -159,19 +159,10 @@ The Extension Code Here's the contents of the `flask_sqlite3.py` for copy/paste:: import sqlite3 - from flask import current_app - - # Find the stack on which we want to store the database connection. - # Starting with Flask 0.9, the _app_ctx_stack is the correct one, - # before that we need to use the _request_ctx_stack. - try: - from flask import _app_ctx_stack as stack - except ImportError: - from flask import _request_ctx_stack as stack + from flask import current_app, _app_ctx_stack class SQLite3(object): - def __init__(self, app=None): self.app = app if app is not None: @@ -179,24 +170,19 @@ Here's the contents of the `flask_sqlite3.py` for copy/paste:: def init_app(self, app): app.config.setdefault('SQLITE3_DATABASE', ':memory:') - # Use the newstyle teardown_appcontext if it's available, - # otherwise fall back to the request context - if hasattr(app, 'teardown_appcontext'): - app.teardown_appcontext(self.teardown) - else: - app.teardown_request(self.teardown) + app.teardown_appcontext(self.teardown) def connect(self): return sqlite3.connect(current_app.config['SQLITE3_DATABASE']) def teardown(self, exception): - ctx = stack.top + ctx = _app_ctx_stack.top if hasattr(ctx, 'sqlite3_db'): ctx.sqlite3_db.close() @property def connection(self): - ctx = stack.top + ctx = _app_ctx_stack.top if ctx is not None: if not hasattr(ctx, 'sqlite3_db'): ctx.sqlite3_db = self.connect() @@ -212,9 +198,7 @@ So here's what these lines of code do: factory pattern for creating applications. The ``init_app`` will set the configuration for the database, defaulting to an in memory database if no configuration is supplied. In addition, the ``init_app`` method attaches - the ``teardown`` handler. It will try to use the newstyle app context - handler and if it does not exist, falls back to the request context - one. + the ``teardown`` handler. 3. Next, we define a ``connect`` method that opens a database connection. 4. Finally, we add a ``connection`` property that on first access opens the database connection and stores it on the context. This is also @@ -224,9 +208,7 @@ So here's what these lines of code do: Note here that we're attaching our database connection to the top application context via ``_app_ctx_stack.top``. Extensions should use the top context for storing their own information with a sufficiently - complex name. Note that we're falling back to the - ``_request_ctx_stack.top`` if the application is using an older - version of Flask that does not support it. + complex name. So why did we decide on a class-based approach here? Because using our extension looks something like this:: @@ -245,9 +227,8 @@ You can then use the database from views like this:: cur = db.connection.cursor() cur.execute(...) -Likewise if you are outside of a request but you are using Flask 0.9 or -later with the app context support, you can use the database in the same -way:: +Likewise if you are outside of a request you can use the database by +pushing an app context:: with app.app_context(): cur = db.connection.cursor() @@ -291,34 +272,6 @@ teardown of a request, the ``sqlite3_db`` connection is closed. By using this pattern, the *same* connection to the sqlite3 database is accessible to anything that needs it for the duration of the request. -If the :data:`~flask._app_ctx_stack` does not exist because the user uses -an old version of Flask, it is recommended to fall back to -:data:`~flask._request_ctx_stack` which is bound to a request. - -Teardown Behavior ------------------ - -*This is only relevant if you want to support Flask 0.6 and older* - -Due to the change in Flask 0.7 regarding functions that are run at the end -of the request your extension will have to be extra careful there if it -wants to continue to support older versions of Flask. The following -pattern is a good way to support both:: - - def close_connection(response): - ctx = _request_ctx_stack.top - ctx.sqlite3_db.close() - return response - - if hasattr(app, 'teardown_request'): - app.teardown_request(close_connection) - else: - app.after_request(close_connection) - -Strictly speaking the above code is wrong, because teardown functions are -passed the exception and typically don't return anything. However because -the return value is discarded this will just work assuming that the code -in between does not touch the passed parameter. Learn from Others ----------------- @@ -386,25 +339,6 @@ extension to be approved you have to follow these guidelines: 10. An extension currently has to support Python 3.4 and newer and 2.7. - -Extension Import Transition ---------------------------- - -In early versions of Flask we recommended using namespace packages for Flask -extensions, of the form ``flaskext.foo``. This turned out to be problematic in -practice because it meant that multiple ``flaskext`` packages coexist. -Consequently we have recommended to name extensions ``flask_foo`` over -``flaskext.foo`` for a long time. - -Flask 0.8 introduced a redirect import system as a compatibility aid for app -developers: Importing ``flask.ext.foo`` would try ``flask_foo`` and -``flaskext.foo`` in that order. - -As of Flask 0.11, most Flask extensions have transitioned to the new naming -schema. The ``flask.ext.foo`` compatibility alias is still in Flask 0.11 but is -now deprecated -- you should use ``flask_foo``. - - .. _OAuth extension: https://pythonhosted.org/Flask-OAuth/ .. _mailinglist: http://flask.pocoo.org/mailinglist/ .. _IRC channel: http://flask.pocoo.org/community/irc/ diff --git a/docs/extensions.rst b/docs/extensions.rst index 6deb9652..54e2c3eb 100644 --- a/docs/extensions.rst +++ b/docs/extensions.rst @@ -1,58 +1,53 @@ .. _extensions: -Flask Extensions -================ +Extensions +========== + +Extensions are extra packages that add functionality to a Flask +application. For example, an extension might add support for sending +email or connecting to a database. Some extensions add entire new +frameworks to help build certain types of applications, like a ReST API. -Flask extensions extend the functionality of Flask in various different -ways. For instance they add support for databases and other common tasks. Finding Extensions ------------------ -Flask extensions are listed on the `Flask Extension Registry`_ and can be -downloaded with :command:`easy_install` or :command:`pip`. If you add a Flask extension -as dependency to your :file:`requirements.txt` or :file:`setup.py` file they are -usually installed with a simple command or when your application installs. +Flask extensions are usually named "Flask-Foo" or "Foo-Flask". Many +extensions are listed in the `Extension Registry`_, which can be updated +by extension developers. You can also search PyPI for packages tagged +with `Framework :: Flask `_. + Using Extensions ---------------- -Extensions typically have documentation that goes along that shows how to -use it. There are no general rules in how extensions are supposed to -behave but they are imported from common locations. If you have an -extension called ``Flask-Foo`` or ``Foo-Flask`` it should be always -importable from ``flask_foo``:: +Consult each extension's documentation for installation, configuration, +and usage instructions. Generally, extensions pull their own +configuration from :attr:`app.config ` and are +passed an application instance during initialization. For example, +an extension caled "Flask-Foo" might be used like this:: - import flask_foo + from flask_foo import Foo -Building Extensions -------------------- + foo = Foo() -While `Flask Extension Registry`_ contains many Flask extensions, you may not find -an extension that fits your need. If this is the case, you can always create your own. -Consider reading :ref:`extension-dev` to develop your own Flask extension. + app = Flask(__name__) + app.config.update( + FOO_BAR='baz', + FOO_SPAM='eggs', + ) -Flask Before 0.8 ----------------- + foo.init_app(app) -If you are using Flask 0.7 or earlier the :data:`flask.ext` package will not -exist, instead you have to import from ``flaskext.foo`` or ``flask_foo`` -depending on how the extension is distributed. If you want to develop an -application that supports Flask 0.7 or earlier you should still import -from the :data:`flask.ext` package. We provide you with a compatibility -module that provides this package for older versions of Flask. You can -download it from GitHub: `flaskext_compat.py`_ -And here is how you can use it:: - - import flaskext_compat - flaskext_compat.activate() - - from flask.ext import foo +Building Extensions +------------------- -Once the ``flaskext_compat`` module is activated the :data:`flask.ext` will -exist and you can start importing from there. +While the `Extension Registry`_ contains many Flask extensions, you may +not find an extension that fits your need. If this is the case, you can +create your own. Read :ref:`extension-dev` to develop your own Flask +extension. -.. _Flask Extension Registry: http://flask.pocoo.org/extensions/ -.. _flaskext_compat.py: https://raw.githubusercontent.com/pallets/flask/master/scripts/flaskext_compat.py +.. _Extension Registry: http://flask.pocoo.org/extensions/ +.. _pypi: https://pypi.python.org/pypi?:action=browse&c=585 From f739149456ba3348af2513aea1fdc6c46c258abe Mon Sep 17 00:00:00 2001 From: Grey Li Date: Tue, 6 Mar 2018 07:50:46 +0800 Subject: [PATCH 63/64] Add documentation link in README --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index ef01ca5b..9c4aa416 100644 --- a/README.rst +++ b/README.rst @@ -48,6 +48,7 @@ Links * Website: https://www.palletsprojects.com/p/flask/ * Releases: https://pypi.org/project/Flask/ * Code: https://github.com/pallets/flask +* Documentation: http://flask.pocoo.org/docs/ * Issue tracker: https://github.com/pallets/flask/issues * Test status: From a2ea18693c763c3d61ddf74cdb20fd015d193bd1 Mon Sep 17 00:00:00 2001 From: David Lord Date: Tue, 6 Mar 2018 07:36:58 -0800 Subject: [PATCH 64/64] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 9c4aa416..6f6dc581 100644 --- a/README.rst +++ b/README.rst @@ -46,9 +46,9 @@ Links ----- * Website: https://www.palletsprojects.com/p/flask/ +* Documentation: http://flask.pocoo.org/docs/ * Releases: https://pypi.org/project/Flask/ * Code: https://github.com/pallets/flask -* Documentation: http://flask.pocoo.org/docs/ * Issue tracker: https://github.com/pallets/flask/issues * Test status: