From 1246f4088a4fdc00a79f8029ff5d77bfe4fc9b14 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 15 Apr 2010 02:21:46 +0200 Subject: [PATCH] First part of the tutorial. Many explanations missing but it's a start. --- docs/_static/flaskr.png | Bin 0 -> 53571 bytes docs/_themes/flasky/static/flasky.css_t | 12 + docs/index.rst | 9 +- docs/quickstart.rst | 13 + docs/tutorial.rst | 354 ++++++++++++++++++++++++ examples/flaskr/flaskr.py | 7 +- examples/flaskr/static/style.css | 9 +- examples/flaskr/templates/layout.html | 2 +- examples/flaskr/templates/login.html | 2 +- 9 files changed, 394 insertions(+), 14 deletions(-) create mode 100644 docs/_static/flaskr.png create mode 100644 docs/tutorial.rst diff --git a/docs/_static/flaskr.png b/docs/_static/flaskr.png new file mode 100644 index 0000000000000000000000000000000000000000..07d027dd973f6ecf02986d98bc8bf541e174c057 GIT binary patch literal 53571 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ÐNKC!{nB=)@lkWiHYwoId6sR_vl!q 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 from flaskr import init_db +>>> init_db() + +The :meth:`~flask.Flask.open_resource` function opens a file from the +resource location (your flaskr folder) and allows you to read from it. We +are using this here to execute a script on the database connection. + +When we connect to a database we get a connection object (here called +`db`) that can give us a cursor. On that cursor there is a method to +execute a complete script. Finally we only have to commit the changes and +close the transaction. + +Step 4: Request Database Connections +------------------------------------ + +Now we know how we can open database connections and use them for scripts, +but how can we elegantly do that for requests? We will need the database +connection in all our functions so it makes sense to initialize them +before each request and shut them down afterwards. + +Flask allows us to do that with the :meth:`~flask.Flask.request_init` and +:meth:`~flask.Flask.request_shutdown` decorators:: + + @app.request_init + def before_request(): + g.db = connect_db() + + @app.request_shutdown + def after_request(response): + g.db.close() + return response + +Functions marked with :meth:`~flask.Flask.request_init` are called before +a request and passed no arguments, functions marked with +:meth:`~flask.Flask.request_shutdown` are called after a request and +passed the response that will be sent to the client. They have to return +that response object or a different one. In this case we just return it +unchanged. + +We store our current database connection on the special :data:`~flask.g` +object that flask provides for us. This object stores information for one +request only and is available from within each function. Never store such +things on other objects because this would not work with threaded +environments. That special :data:`~flask.g` object does some magic behind +the scenes to ensure it does the right thing. + +Step 5: The View Functions +-------------------------- + +Now that the database connections are working we can start writing the +view functions. We will need for of them: + +Show Entries +```````````` + +This view shows all the entries stored in the database:: + + @app.route('/') + def show_entries(): + cur = g.db.execute('select title, text from entries order by id desc') + entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()] + return render_template('show_entries.html', entries=entries) + +Add New Entry +````````````` + +This view lets the user add new entries if he's logged in. This only +responds to `POST` requests, the actual form is shown on the +`show_entries` page:: + + @app.route('/add', methods=['POST']) + def add_entry(): + if not session.get('logged_in'): + abort(401) + g.db.execute('insert into entries (title, text) values (?, ?)', + [request.form['title'], request.form['text']]) + g.db.commit() + flash('New entry was successfully posted') + return redirect(url_for('show_entries')) + +Login and Logout +```````````````` + +These functions are used to sign the user in and out:: + + @app.route('/login', methods=['GET', 'POST']) + def login(): + error = None + if request.method == 'POST': + if request.form['username'] != USERNAME: + error = 'Invalid username' + elif request.form['password'] != PASSWORD: + error = 'Invalid password' + else: + session['logged_in'] = True + flash('You were logged in') + return redirect(url_for('show_entries')) + return render_template('login.html', error=error) + + @app.route('/logout') + def logout(): + session.pop('logged_in', None) + flash('You were logged out') + return redirect(url_for('show_entries')) + +Step 6: The Templates +--------------------- + +Now we should start working on the templates. If we request the URLs now +we would only get an exception that Flask cannot find the templates. + +Put the following templates into the `templates` folder: + +layout.html +``````````` + +.. sourcecode:: html+jinja + + + Flaskr + +
+

Flaskr

+
+ {% if not session.logged_in %} + log in + {% else %} + log out + {% endif %} +
+ {% for message in get_flashed_messages() %} +
{{ message }}
+ {% endfor %} + {% block body %}{% endblock %} +
+ +show_entries.html +````````````````` + +.. sourcecode:: html+jinja + + {% extends "layout.html" %} + {% block body %} + {% if g.logged_in %} +
+
+
Title: +
+
Text: +
+
+
+
+ {% endif %} +
    + {% for entry in entries %} +
  • {{ entry.title }}

    {{ entry.text|safe }} + {% else %} +
  • Unbelievable. No entries here so far + {% endfor %} +
+ {% endblock %} + +login.html +`````````` + +.. sourcecode:: html+jinja + + {% extends "layout.html" %} + {% block body %} +

Login

+ {% if error %}

Error: {{ error }}{% endif %} +

+
+
Username: +
+
Password: +
+
+
+
+ {% endblock %} diff --git a/examples/flaskr/flaskr.py b/examples/flaskr/flaskr.py index 02db8afd..1158e158 100644 --- a/examples/flaskr/flaskr.py +++ b/examples/flaskr/flaskr.py @@ -43,11 +43,8 @@ def init_db(): @app.request_init def before_request(): - """Make sure we are connected to the database each request. Also - set `g.logged_in` to `True` if we are logged in. - """ + """Make sure we are connected to the database each request.""" g.db = connect_db() - g.logged_in = session.get('logged_in', False) @app.request_shutdown @@ -66,7 +63,7 @@ def show_entries(): @app.route('/add', methods=['POST']) def add_entry(): - if not g.logged_in: + if not session.get('logged_in'): abort(401) g.db.execute('insert into entries (title, text) values (?, ?)', [request.form['title'], request.form['text']]) diff --git a/examples/flaskr/static/style.css b/examples/flaskr/static/style.css index b0f38774..39e0a8e7 100644 --- a/examples/flaskr/static/style.css +++ b/examples/flaskr/static/style.css @@ -3,14 +3,15 @@ a, h1, h2 { color: #377BA8; } h1, h2 { font-family: 'Georgia', serif; margin: 0; } h1 { border-bottom: 2px solid #eee; } h2 { font-size: 1.2em; } -div.metanav { text-align: right; font-size: 0.8em; background: #fafafa; - padding: 0.3em; margin-bottom: 1em; } + +div.page { margin: 2em auto; width: 35em; border: 5px solid #ccc; + padding: 0.8em; background: white; } ul.entries { list-style: none; margin: 0; padding: 0; } ul.entries li { margin: 0.8em 1.2em; } ul.entries li h2 { margin-left: -1em; } -div.page { margin: 2em auto; width: 35em; border: 5px solid #ccc; - padding: 0.8em; background: white; } form.add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; } form.add-entry dl { font-weight: bold; } +div.metanav { text-align: right; font-size: 0.8em; background: #fafafa; + padding: 0.3em; margin-bottom: 1em; } div.flash { background: #CEE5F5; padding: 0.5em; border: 1px solid #AACBE2; } p.error { background: #F0D6D6; padding: 0.5em; } diff --git a/examples/flaskr/templates/layout.html b/examples/flaskr/templates/layout.html index eafcefa9..cbdb9650 100644 --- a/examples/flaskr/templates/layout.html +++ b/examples/flaskr/templates/layout.html @@ -4,7 +4,7 @@

Flaskr

- {% if not g.logged_in %} + {% if not session.logged_in %} log in {% else %} log out diff --git a/examples/flaskr/templates/login.html b/examples/flaskr/templates/login.html index 568e9e84..6f70bb76 100644 --- a/examples/flaskr/templates/login.html +++ b/examples/flaskr/templates/login.html @@ -7,7 +7,7 @@
Username:
Password: -
+