diff options
| author | Guillaume Horel <guillaume.horel@gmail.com> | 2013-09-17 00:31:32 -0400 |
|---|---|---|
| committer | Guillaume Horel <guillaume.horel@gmail.com> | 2013-09-17 00:31:32 -0400 |
| commit | d237f6a3d075f5731b56d15b12fc028fc035960d (patch) | |
| tree | 5f6e5edb42d9defef502b1e715a7e480ce9ecc85 /famille.py | |
| parent | 04b9fd07718b6739712f77b862c132aad4546760 (diff) | |
| download | famille-flask-d237f6a3d075f5731b56d15b12fc028fc035960d.tar.gz | |
New pattern to load the db
before it was reloaded every time due to the @app.before_request
now it's loaded on demand.
Diffstat (limited to 'famille.py')
| -rw-r--r-- | famille.py | 83 |
1 files changed, 47 insertions, 36 deletions
@@ -1,12 +1,10 @@ # -*- coding: utf-8 -*- import sqlite3 #all the imports -from flask import Flask, request, session, g, redirect, url_for, \ - abort, render_template, flash, _app_ctx_stack +from flask import Flask, request, session, g, redirect, url_for, render_template from functools import wraps import hashlib from pytz import timezone -import pytz from docutils import core from docutils.writers.html4css1 import Writer from datetime import datetime @@ -70,24 +68,28 @@ def pluralize(word, count, plural=None): else: return "{0} {1}s".format(count, word) -def query_db(query, args=(), one=False): - cur = g.db.execute(query, args) +def query_db(db, query, args=(), one=False): + cur = db.execute(query, args) rv = cur.fetchone() if one else cur.fetchall() cur.close() return rv -@app.before_request -def before_request(): +def connect_db(): conn = sqlite3.connect(app.config['DATABASE'], detect_types=sqlite3.PARSE_DECLTYPES) conn.row_factory = sqlite3.Row - g.db = conn - g.timezone = pytz.common_timezones + return conn + +def get_db(): + if not hasattr(g, 'sqlite_db'): + g.sqlite_db = connect_db() + return g.sqlite_db @app.teardown_appcontext -def close_db_connection(exception): +def close_db(error): """Closes the database again at the end of the request.""" - g.db.close() + if hasattr(g, 'sqlite_db'): + g.sqlite_db.close() def login_required(f): @wraps(f) @@ -101,13 +103,14 @@ def login_required(f): @app.route('/news/') @login_required def list_news(): - news = query_db("SELECT news.*, users.user_name, count(comments.id) as ncomments FROM news " + db = get_db() + news = query_db(db, "SELECT news.*, users.user_name, count(comments.id) as ncomments FROM news " "LEFT JOIN users ON news.user_id = users.id " "LEFT JOIN comments ON news.id=comments.news_id GROUP BY news.id " "ORDER BY news.date DESC") - comments = query_db("SELECT * from comments LEFT JOIN users " + comments = query_db(db, "SELECT * from comments LEFT JOIN users " "ON comments.user_id = users.id ORDER BY date DESC LIMIT 5") - users = query_db("SELECT * from users ORDER BY last_seen DESC") + users = query_db(db, "SELECT * from users ORDER BY last_seen DESC") return render_template("news/list.html", news=news, comments=comments, users=users) @@ -118,16 +121,16 @@ def add_news(): content = request.form['content'] content_cache = rstify(content) if 'Add' in request.form: - cur = g.db.execute("INSERT INTO news " + cur = db.execute("INSERT INTO news " "('title', 'content', 'user_id', 'content_cache') " "VALUES (?, ?, ?, ?)", (request.form['title'], content, session['user_id'], content_cache)) news_id = cur.lastrowid - g.db.commit() + db.commit() # send email - emails = query_db("SELECT email from users where notify=1") + emails = query_db(db, "SELECT email from users where notify=1") emails = [email["email"] for email in emails] if emails: message = Message(request.form['title'], @@ -151,11 +154,12 @@ def add_news(): @app.route('/news/<int:news_id>/', methods=['GET', 'POST']) @login_required def show_news(news_id): - news = query_db("SELECT * FROM news LEFT JOIN users " + db = get_db() + news = query_db(db, "SELECT * FROM news LEFT JOIN users " "ON news.user_id = users.id " "WHERE news.id = ?", (news_id,), True) if request.method == 'GET': - comments = query_db("SELECT * FROM comments LEFT JOIN users " + comments = query_db(db, "SELECT * FROM comments LEFT JOIN users " "ON comments.user_id = users.id " "WHERE comments.news_id = ? " "ORDER BY date", (news_id,)) @@ -164,42 +168,46 @@ def show_news(news_id): user_id = session['user_id'] content = request.form['content'] content_cache = rstify(content) - g.db.execute("INSERT INTO comments " - "('user_id', 'content', 'news_id', 'content_cache') " - "VALUES (?, ?, ?, ?)", - (user_id, content, news_id, content_cache)) - g.db.commit() + db.execute("INSERT INTO comments " + "('user_id', 'content', 'news_id', 'content_cache') " + "VALUES (?, ?, ?, ?)", + (user_id, content, news_id, content_cache)) + db.commit() return redirect(url_for('show_news', news_id=news_id)) @app.route('/news/<int:news_id>/edit', methods=['GET', 'POST']) @login_required def edit_news(news_id): + db = get_db() if request.method == 'GET': - news = query_db("SELECT * from news WHERE news.id = ?", (news_id,), True) + news = query_db(db, "SELECT * from news WHERE news.id = ?", + (news_id,), True) if news["user_id"] == session['user_id']: return render_template('news/add.html', news=news) elif request.method == 'POST': title = request.form['title'] content = request.form['content'] content_cache = rstify(content) - g.db.execute("UPDATE news SET 'title'=?, 'content'=?, 'content_cache'=? " + db.execute("UPDATE news SET 'title'=?, 'content'=?, 'content_cache'=? " "WHERE news.id =?", (title, content, content_cache, news_id)) - g.db.commit() + db.commit() return redirect(url_for('show_news', news_id=news_id)) @app.route('/user/<int:user_id>/') @login_required def view_user(user_id): - user = query_db('SELECT * FROM users WHERE id= ?', (user_id,), True) + db = get_db() + user = query_db(db, 'SELECT * FROM users WHERE id= ?', (user_id,), True) return render_template("user/show.html", user=user) @app.route('/user/edit/', methods=['GET', 'POST']) @login_required def edit_user(): + db = get_db() if request.method == 'GET': - user = query_db('SELECT * FROM users WHERE id= ?', (session['user_id'],), - True) + user = query_db(db, 'SELECT * FROM users WHERE id= ?', + (session['user_id'],), True) user = {k: user[k] for k in user.keys() if user[k]} return render_template("user/edit.html", user=user) elif request.method == 'POST': @@ -220,8 +228,8 @@ def edit_user(): sqlstr = "UPDATE users SET email= ?, phone=?, birthday=?, nameday=?," \ "address_line1=?, address_line2=?, address_city_line=?, timezone=?, notify=? " \ "where id=?" - g.db.execute(sqlstr, args) - g.db.commit() + db.execute(sqlstr, args) + db.commit() session["timezone"] = request.form["timezone"] return redirect(url_for('view_user', user_id=session['user_id'])) @@ -232,17 +240,19 @@ def login(): error = None if request.method == 'POST': + db = get_db() username = request.form['username'] password = hashlib.md5(request.form['password']).hexdigest(); - user = query_db('select * from users where user_name = ?', (username,), True) + user = query_db(db, 'select * from users where user_name = ?', + (username,), True) if user: if user['password'] == password: session['user_name'] = user['user_name'] session['user_id'] = user['id'] session['timezone'] = user['timezone'] or "UTC" - g.db.execute("UPDATE users SET last_seen=? WHERE id=?", + db.execute("UPDATE users SET last_seen=? WHERE id=?", (datetime.utcnow(),session['user_id'])) - g.db.commit() + db.commit() return redirect(url_for('list_news')) else: error = u'Mot de passe incorrect' @@ -259,7 +269,8 @@ def logout(): @app.route('/rss.xml') def rss(): - news = query_db("SELECT * FROM news LEFT JOIN users ON " + db = get_db() + news = query_db(db, "SELECT * FROM news LEFT JOIN users ON " "news.user_id=users.id ORDER BY news.date desc") return render_template('rss.xml', news=news) |
