接上文
一,步骤4:创建数据库
方法一,命令行来创建,把schema.sql作为sqlite3命令的输入来创建这个模式
sqlite3 /tmp/flaskr.db < schema.sql
方法二,可以创建一个名为init_db的函数来初始化数据库
然后在命令行进入python环境,导入flaskr包
>>>from flaskr import init_db
>>>init_db()
如果出现KeyError:'DATABASE'错误
参考https://stackoverflow.com/questions/34443640/flask-tutorial-keyerror-database这里解决
二,步骤5:视图函数
一共需要写4个:
显示条目,添加条目,登录和登出
显示条目:show_entries.html,用来显示数据库中存储的所有条目。绑定在根url,并从数据库查询出文章的标题和正文。
在flasky.py里面加入:
@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)
添加条目:允许已登入的用户添加新条目,并只响应POST请求,实际的表单显示在show_entries页。
在flasky.py中加入
@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'))
登入和登出:登入通过与配置文件中的数据比较检查用户名和密码, 并设定会话中的logged_in键值。如果用户成功登入,那么这个键值会被设为True,并跳转回show_entries页。此外,会有消息闪现来提示用户登入成功。
@app.route('/login',methods=['GET','POST'])
def login():
error = None
if request.method=='POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('You are 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 are logged out')
return redirect(url_for('show_entries'))
三,步骤 6: 模板
代码参考http://docs.jinkan.org/docs/flask/tutorial/templates.html#tutorial-templates
首先建立一个公共模板layout.html
这个模板包含 HTML 主体结构、标题和一个登入链接(用户已登入则提供登出)。
{%block body%}块可以被子模板中相同名字的块(body)替换。
session字典在模板中也是可用的。你可以用它来检查用户是否已登入。
再建立一个show_entries.html继承layout.html
最后是login.html模板,简单地显示一个允许用户登入的表单
四,步骤 7: 添加样式
body{
font-family: sans-serif;
background: #eee;
}
a,h1,h2{
color: #377BA8;
}
h1,h2{
font-family: 'Georgia',serif;
margin: 0;
}
h1{
border-bottom: 2px solid #eee;
}
h2{
font-size: 1.2em;
}
.page{
margin: 2em auto;
width: 35em;
border: 5px solid #ccc;
padding: 0.8em;
background: white;
}
.entries{
list-style: none;
margin: 0;
padding: 0;
}
.entries li {
margin: 0.8em 1.2em;
}
.entries li h2{
margin-left: -1em;
}
.add-entry{
font-size: 0.9em;
border-bottom: 1px solid #ccc;
}
.add-entry dl{
font-weight: bold;
}
.metanav{
text-align: right;
font-size: 0.8em;
padding: 0.3em;
margin-bottom: 1em;
background: #fafafa;
}
.flash{
background: #CEE5F5;
padding: 0.5em;
border: 1px solid #AACBE2;
}
.error{
background: #F0D6D6;
padding: 0.5em;
}
运行,如果出现'_AppCtxGlobals' object has no attribute 'db'问题
则在show_entries()和add_entry()方法中加入
g.db = connect_db()
获取一下db。
运行下看看,是不是简易博客做好了?