mirror of https://github.com/mitsuhiko/flask.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.9 KiB
178 lines
5.9 KiB
7 years ago
|
.. currentmodule:: flask
|
||
|
|
||
|
Application Setup
|
||
|
=================
|
||
|
|
||
|
A Flask application is an instance of the :class:`Flask` class.
|
||
|
Everything about the application, such as configuration and URLs, will
|
||
|
be registered with this class.
|
||
|
|
||
|
The most straightforward way to create a Flask application is to create
|
||
|
a global :class:`Flask` instance directly at the top of your code, like
|
||
|
how the "Hello, World!" example did on the previous page. While this is
|
||
|
simple and useful in some cases, it can cause some tricky issues as the
|
||
|
project grows.
|
||
|
|
||
|
Instead of creating a :class:`Flask` instance globally, you will create
|
||
|
it inside a function. This function is known as the *application
|
||
|
factory*. Any configuration, registration, and other setup the
|
||
|
application needs will happen inside the function, then the application
|
||
|
will be returned.
|
||
|
|
||
|
|
||
|
The Application Factory
|
||
|
-----------------------
|
||
|
|
||
|
It's time to start coding! Create the ``flaskr`` directory and add the
|
||
|
``__init__.py`` file. The ``__init__.py`` serves double duty: it will
|
||
|
contain the application factory, and it tells Python that the ``flaskr``
|
||
|
directory should be treated as a package.
|
||
|
|
||
|
.. code-block:: none
|
||
|
|
||
|
mkdir flaskr
|
||
|
|
||
|
.. code-block:: python
|
||
|
:caption: ``flaskr/__init__.py``
|
||
|
|
||
|
import os
|
||
|
|
||
|
from flask import Flask
|
||
|
|
||
|
|
||
|
def create_app(test_config=None):
|
||
|
# create and configure the app
|
||
|
app = Flask(__name__, instance_relative_config=True)
|
||
|
app.config.from_mapping(
|
||
|
SECRET_KEY='dev',
|
||
|
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
|
||
|
)
|
||
|
|
||
|
if test_config is None:
|
||
|
# load the instance config, if it exists, when not testing
|
||
|
app.config.from_pyfile('config.py', silent=True)
|
||
|
else:
|
||
|
# load the test config if passed in
|
||
|
app.config.from_mapping(test_config)
|
||
|
|
||
|
# ensure the instance folder exists
|
||
|
try:
|
||
|
os.makedirs(app.instance_path)
|
||
|
except OSError:
|
||
|
pass
|
||
|
|
||
|
# a simple page that says hello
|
||
|
@app.route('/hello')
|
||
|
def hello():
|
||
|
return 'Hello, World!'
|
||
|
|
||
|
return app
|
||
|
|
||
|
``create_app`` is the application factory function. You'll add to it
|
||
|
later in the tutorial, but it already does a lot.
|
||
|
|
||
|
#. ``app = Flask(__name__, instance_relative_config=True)`` creates the
|
||
|
:class:`Flask` instance.
|
||
|
|
||
|
* ``__name__`` is the name of the current Python module. The app
|
||
|
needs to know where it's located to set up some paths, and
|
||
|
``__name__`` is a convenient way to tell it that.
|
||
|
|
||
|
* ``instance_relative_config=True`` tells the app that
|
||
|
configuration files are relative to the
|
||
|
:ref:`instance folder <instance-folders>`. The instance folder
|
||
|
is located outside the ``flaskr`` package and can hold local
|
||
|
data that shouldn't be committed to version control, such as
|
||
|
configuration secrets and the database file.
|
||
|
|
||
|
#. :meth:`app.config.from_mapping() <Config.from_mapping>` sets
|
||
|
some default configuration that the app will use:
|
||
|
|
||
|
* :data:`SECRET_KEY` is used by Flask and extensions to keep data
|
||
|
safe. It's set to ``'dev'`` to provide a convenient value
|
||
|
during development, but it should be overridden with a random
|
||
|
value when deploying.
|
||
|
|
||
|
* ``DATABASE`` is the path where the SQLite database file will be
|
||
|
saved. It's under
|
||
|
:attr:`app.instance_path <Flask.instance_path>`, which is the
|
||
|
path that Flask has chosen for the instance folder. You'll learn
|
||
|
more about the database in the next section.
|
||
|
|
||
|
#. :meth:`app.config.from_pyfile() <Config.from_pyfile>` overrides
|
||
|
the default configuration with values taken from the ``config.py``
|
||
|
file in the instance folder if it exists. For example, when
|
||
|
deploying, this can be used to set a real ``SECRET_KEY``.
|
||
|
|
||
|
* ``test_config`` can also be passed to the factory, and will be
|
||
|
used instead of the instance configuration. This is so the tests
|
||
|
you'll write later in the tutorial can be configured
|
||
|
independently of any development values you have configured.
|
||
|
|
||
|
#. :func:`os.makedirs` ensures that
|
||
|
:attr:`app.instance_path <Flask.instance_path>` exists. Flask
|
||
|
doesn't create the instance folder automatically, but it needs to be
|
||
|
created because your project will create the SQLite database file
|
||
|
there.
|
||
|
|
||
|
#. :meth:`@app.route() <Flask.route>` creates a simple route so you can
|
||
|
see the application working before getting into the rest of the
|
||
|
tutorial. It creates a connection between the URL ``/hello`` and a
|
||
|
function that returns a response, the string ``'Hello, World!'`` in
|
||
|
this case.
|
||
|
|
||
|
|
||
|
Run The Application
|
||
|
-------------------
|
||
|
|
||
|
Now you can run your application using the ``flask`` command. From the
|
||
|
terminal, tell Flask where to find your application, then run it in
|
||
|
development mode.
|
||
|
|
||
|
Development mode shows an interactive debugger whenever a page raises an
|
||
|
exception, and restarts the server whenever you make changes to the
|
||
|
code. You can leave it running and just reload the browser page as you
|
||
|
follow the tutorial.
|
||
|
|
||
|
For Linux and Mac:
|
||
|
|
||
|
.. code-block:: none
|
||
|
|
||
|
export FLASK_APP=flaskr
|
||
|
export FLASK_ENV=development
|
||
|
flask run
|
||
|
|
||
|
For Windows cmd, use ``set`` instead of ``export``:
|
||
|
|
||
|
.. code-block:: none
|
||
|
|
||
|
set FLASK_APP=flaskr
|
||
|
set FLASK_ENV=development
|
||
|
flask run
|
||
|
|
||
|
For Windows PowerShell, use ``$env:`` instead of ``export``:
|
||
|
|
||
|
.. code-block:: none
|
||
|
|
||
|
$env:FLASK_APP = "flaskr"
|
||
|
$env:FLASK_ENV = "development"
|
||
|
flask run
|
||
|
|
||
|
You'll see output similar to this:
|
||
|
|
||
|
.. code-block:: none
|
||
|
|
||
|
* Serving Flask app "flaskr"
|
||
|
* Environment: development
|
||
|
* Debug mode: on
|
||
|
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
|
||
|
* Restarting with stat
|
||
|
* Debugger is active!
|
||
|
* Debugger PIN: 855-212-761
|
||
|
|
||
|
Visit http://127.0.0.1:5000/hello in a browser and you should see the
|
||
|
"Hello, World!" message. Congratulations, you're now running your Flask
|
||
|
web application!
|
||
|
|
||
|
Continue to :doc:`database`.
|