2010-05-26 20:49:01 +08:00
.. _tutorial-setup:
2010-04-18 19:15:00 +08:00
Step 2: Application Setup Code
==============================
Now that we have the schema in place we can create the application module.
2013-11-09 21:13:14 +08:00
Let's call it flaskr.py. We will place this file inside the flask folder.
We will begin by adding the imports we need and by adding the config section.
For small applications, it is possible to drop the configuration directly into
the module, and this is what we will be doing here. However a cleaner solution would be to create a separate `.ini` or `.py` file and load that or import the
2013-09-01 03:32:41 +08:00
values from there.
2010-04-18 19:15:00 +08:00
2013-09-01 03:32:41 +08:00
First we add the imports in `flaskr.py` ::
2010-04-18 19:15:00 +08:00
# all the imports
import sqlite3
2013-09-01 03:32:41 +08:00
from flask import Flask, request, session, g, redirect, url_for, abort, \
render_template, flash
2013-07-27 07:20:42 +08:00
2010-04-18 19:15:00 +08:00
Next we can create our actual application and initialize it with the
2012-03-12 11:20:32 +08:00
config from the same file, in `flaskr.py` ::
2010-04-18 19:15:00 +08:00
# create our little application :)
app = Flask(__name__)
2010-05-28 03:17:25 +08:00
app.config.from_object(__name__)
2013-09-01 03:32:41 +08:00
# Load default config and override config from an environment variable
app.config.update(dict(
DATABASE='/tmp/flaskr.db',
DEBUG=True,
SECRET_KEY='development key',
USERNAME='admin',
PASSWORD='default'
))
app.config.from_envvar('FLASKR_SETTINGS', silent=True)
The :class: `~flask.Config` object works similar to a dictionary so we
can update it with new values.
.. admonition :: Windows
If you are on Windows, replace `/tmp/flaskr.db` with a different writeable
path of your choice, in the configuration and for the rest of this
tutorial.
2010-05-28 03:17:25 +08:00
2013-07-22 22:03:57 +08:00
Usually, it is a good idea to load a separate, environment specific
configuration file. Flask allows you to import multiple configurations and it
will use the setting defined in the last import. This enables robust
configuration setups. :meth: `~flask.Config.from_envvar` can help achieve this.
2010-05-28 03:17:25 +08:00
app.config.from_envvar('FLASKR_SETTINGS', silent=True)
2013-07-22 22:03:57 +08:00
Simply define the environment variable :envvar: `FLASKR_SETTINGS` that points to
a config file to be loaded. The silent switch just tells Flask to not complain
2012-03-12 11:20:32 +08:00
if no such environment key is set.
2010-04-18 19:15:00 +08:00
2013-09-01 03:32:41 +08:00
In addition to that you can use the :meth: `~flask.Config.from_object`
method on the config object and provide it with an import name of a
module. Flask will the initialize the variable from that module. Note
that in all cases only variable names that are uppercase are considered.
The `` SECRET_KEY `` is needed to keep the client-side sessions secure.
2010-04-18 19:15:00 +08:00
Choose that key wisely and as hard to guess and complex as possible. The
2012-03-12 11:20:32 +08:00
debug flag enables or disables the interactive debugger. *Never leave
debug mode activated in a production system*, because it will allow users to
2010-06-28 11:10:07 +08:00
execute code on the server!
2010-04-18 19:15:00 +08:00
2013-11-09 21:13:14 +08:00
We will also add a method that allows for easily connecting to the specified database. This can be used to open a connection on request and also from the interactive Python shell or a script. This will come in handy later. We create a
2013-09-01 03:32:41 +08:00
simple database connection through SQLite and then tell it to use the
:class: `sqlite3.Row` object to represent rows. This allows us to treat
the rows as if they were dictionaries instead of tuples.
2010-04-18 19:15:00 +08:00
::
def connect_db():
2013-09-01 03:32:41 +08:00
"""Connects to the specific database."""
rv = sqlite3.connect(app.config['DATABASE'])
rv.row_factory = sqlite3.Row
return rv
2010-04-18 19:15:00 +08:00
Finally we just add a line to the bottom of the file that fires up the
2010-06-28 11:10:07 +08:00
server if we want to run that file as a standalone application::
2010-04-18 19:15:00 +08:00
if __name__ == '__main__':
app.run()
With that out of the way you should be able to start up the application
2011-03-28 19:31:21 +08:00
without problems. Do this with the following command::
python flaskr.py
You will see a message telling you that server has started along with
the address at which you can access it.
When you head over to the server in your browser you will get an 404
2010-04-18 19:15:00 +08:00
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.
2010-04-24 23:46:06 +08:00
.. admonition :: Externally Visible Server
2010-04-18 19:15:00 +08:00
2010-10-06 14:05:35 +08:00
Want your server to be publicly available? Check out the
2010-04-24 23:46:06 +08:00
:ref: `externally visible server <public-server>` section for more
information.
2010-05-26 20:49:01 +08:00
2013-09-01 03:32:41 +08:00
Continue with :ref: `tutorial-dbcon` .