#flask学习笔记-08:留言板(一)
Step 1: 目录结构
/flaskr
/static
/templates
Step 2: 创建配置文件
创建flaskr/config.py
文件,配置相关的参数。
# configuration
DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = '123456'
配置依次是:
1.数据库文件位置
2.是否开启debug模式
3.session安全连接
4.用户名
5.密码
调用config.py
配置文件,创建flaskr.py
,添入以下代码。
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
app = Flask(__name__)
app.config.from_object('config')
Step 3: 创建数据库文件
在flaskr/
目录下编辑 schema.sql
drop table if exists entries;
create table entries (
id integer primary key autoincrement,
title string not null,
text string not null
);
创建一个叫 entries
的单表,在这个表中每行包含一个 id
,一个 title
和一个 text
。 id
是一个自增的整数而且是主键,其余两个为非空的字符串。
这里创建数据库有两种方法,一种是直接通过sqlite3
命令来创建。
sqlite3 /tmp/flaskr.db < schema.sql
如果没有sqlite3
这个命令,可以直接添加一个函数来初始化数据库。
from contextlib import closing
def connect_db():
return sqlite3.connect(app.config['DATABASE'])
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()
进入python shell
$python
Python 2.7.9 (default, Feb 11 2015, 15:08:29)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from flaskr import init_db
>>> init_db()
>>>
验证数据库是否创建成功
$ll /tmp/flaskr.db
-rw-r--r--. 1 root root 3072 Apr 26 02:02 /tmp/flaskr.db
Step 4: 请求数据库连接
在init_db()
函数下加入以下代码
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
before_request
在请求收到之前绑定一个函数做一些事情。
after_request
每一个请求之后绑定一个函数,如果请求没有异常。
teardown_request
每一个请求之后绑定一个函数,即使遇到了异常。
before_request
的时候创建一个 db
连接,然后 teardown_request
的时候断开这个连接。
我们把数据库连接保存在 Flask
提供的特殊的 g
对象中。这个对象与 每一个请求是一一对应的,并且只在函数内部有效。不要在其它对象中储存类似信息, 因为在多线程环境下无效。这个特殊的 g
对象会在后台神奇的工作,保证系统正常运行。
以上完整的代码:
#!/root/.pyenv/versions/app/bin/python
import sqlite3
from contextlib import closing
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
app = Flask(__name__)
app.config.from_object('config')
def connect_db():
return sqlite3.connect(app.config['DATABASE'])
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
现在还不能运行噢~!