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

这篇博客探讨了Flask应用中如何处理路由和模板。内容涉及使用session检查用户的登录状态,以及如何在登录成功后显示评论框。通过`layout.html`模板继承实现页面布局,并展示了login和logout状态的影响。登录过程包括错误处理和成功后的flash消息。提交表单的数据被添加到数据库,并使用redirect重定向到显示所有条目的页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@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.由于网页主页中会对数据库信息检索,输出到网页上显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值