From a862ead5f22f9d4592c1c85bda285a4ded59b631 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Fri, 23 Apr 2010 16:30:04 +0200 Subject: [PATCH 1/2] Warn on None responses. --- flask.py | 7 ++++++- tests/flask_tests.py | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/flask.py b/flask.py index 1f0fb7e6..10feaf22 100644 --- a/flask.py +++ b/flask.py @@ -687,7 +687,7 @@ class Flask(object): """Converts the return value from a view function to a real response object that is an instance of :attr:`response_class`. - The following types are allowd for `rv`: + The following types are allowed for `rv`: ======================= =========================================== :attr:`response_class` the object is returned unchanged @@ -703,6 +703,11 @@ class Flask(object): :param rv: the return value from the view function """ + if rv is None: + from warnings import warn + warn(Warning('View function did not return a response'), + stacklevel=2) + return u'' if isinstance(rv, self.response_class): return rv if isinstance(rv, basestring): diff --git a/tests/flask_tests.py b/tests/flask_tests.py index 5f07fbe8..917f4168 100644 --- a/tests/flask_tests.py +++ b/tests/flask_tests.py @@ -15,6 +15,7 @@ import sys import flask import unittest import tempfile +import warnings example_path = os.path.join(os.path.dirname(__file__), '..', 'examples') @@ -224,6 +225,19 @@ class BasicFunctionalityTestCase(unittest.TestCase): assert flask.url_for('static', filename='index.html') \ == '/static/index.html' + def test_none_response(self): + warnings.filterwarnings('error', 'View function did not return') + app = flask.Flask(__name__) + @app.route('/') + def test(): + return None + try: + app.test_client().get('/') + except Warning: + pass + else: + assert "Expected warning" + class JSONTestCase(unittest.TestCase): From ef34638f5d24c07a5582cbb60755fd4dfbec9a79 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 24 Apr 2010 17:46:06 +0200 Subject: [PATCH 2/2] Updated docs for external server information. This fixes #14. --- docs/quickstart.rst | 18 ++++++++++++++++++ docs/tutorial/setup.rst | 13 ++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 526d8f7b..6d641d26 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -54,6 +54,24 @@ So what did that code do? To stop the server, hit control-C. +.. _public-server: + +.. admonition:: Externally Visible Server + + If you run the server you will notice that the server is only available + from your own computer, not from any other in the network. This is the + default because in debugging mode a user of the application can execute + arbitrary Python code on your computer. If you have `debug` disabled + or trust the users on your network, you can make the server publicly + available. + + Just change the call of the :meth:`~flask.Flask.run` method to look + like this:: + + app.run(host='0.0.0.0') + + This tells your operating system to listen on a public IP. + Debug Mode ---------- diff --git a/docs/tutorial/setup.rst b/docs/tutorial/setup.rst index 24b76561..1214c22f 100644 --- a/docs/tutorial/setup.rst +++ b/docs/tutorial/setup.rst @@ -57,13 +57,8 @@ without problems. When you head over to the server you will get an 404 page not found error because we don't have any views yet. But we will focus on that a little later. First we should get the database working. -.. admonition:: Troubleshooting +.. admonition:: Externally Visible Server - If you notice later that the browser cannot connect to the server - during development, you might want to try this line instead:: - - app.run(host='127.0.0.1') - - In a nutshell: Werkzeug starts up as IPv6 on many operating systems by - default and not every browser is happy with that. This forces IPv4 - usage. + Want your server to be publically available? Check out the + :ref:`externally visible server ` section for more + information.