您的位置:首页 > 数据库

2.Flask 路由以及对应的模板

2016-03-02 16:54 399 查看
@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)


{% extends "layout.html" %}
{% block body %}
{% if session.logged_in %}
<form action="{{ url_for('add_entry') }}" method=post class=add-entry>
<dl>
<dt>Title:
<dd><input type=text size=30 name=title>
<dt>Text:
<dd><textarea name=text rows=5 cols=40></textarea>
<dd><input type=submit value=Share>
</dl>
</form>
{% endif %}
<ul class=entries>
{% for entry in entries %}
<li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
{% else %}
<li><em>Unbelievable.  No entries here so far</em>
{% endfor %}
</ul>
{% endblock %}


模板中首先会检查session中是否log_in value是否为True 是就显示评论框。下方还会显示一个框,显示dict返回的内容

发现原来网页中还会根据login/logout 状态 这是这段文档中没有的



这是在{% extends “layout.html” %}中继承而来

layout.html:

<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
<h1>Flaskr</h1>
<div class=metanav>
{% if not session.logged_in %}
<a href="{{ url_for('login') }}">log in</a>
{% else %}
<a href="{{ url_for('logout') }}">log out</a>
{% endif %}
</div>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
{% block body %}{% endblock %}
</div>


可以看到该模板也会通过session检查登陆状态

点击login链接: login含有对应url:

@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 were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)


逻辑比较简单,但是该html只包含所有的账户密码错误时的错误信息,登陆成功的flash消息包含在layout中

{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=password name=password>
<dd><input type=submit value=Login>
</dl>
</form>
{% endblock %}


登陆后结果,文本框可以输入信息:



输入以后提交显示效果:



可以找到相关提交表单的form代码,指向add_entry函数对应路由:

<form action="{{ url_for('add_entry') }}" method=post class=add-entry>
<dl>
<dt>Title:
<dd><input type=text size=30 name=title>
<dt>Text:
<dd><textarea name=text rows=5 cols=40></textarea>
<dd><input type=submit value=Share>
</dl>
</form>


@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'))


该函数包含两个部分:

- 1.flash消息,提示发送了一片文章

- 2.数据库将文本消息,存储在数据库中,commit()数据完成提交

- 3.redirect函数将网页重定向到show_entries网页,网页重新加载

- 4.由于网页主页中会对数据库信息检索,输出到网页上显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息