最近学习了一个很简单的示例,这里总结一下.
整体文件目录如下

/flaskr/static/templatesflaskr.pyschema.sql

测试平台: win10 and deepin15.4
测试环境: Python3.6.x
源码地址: 链接:http://pan.baidu.com/s/1qYwQs7y 密码:gz6t

一.数据库

对于这个应用仅一张表就足够了,而且我们只想支持 SQLite ,所以很简单。 只要把下面的内容放入一个名为schema.sql的文件,文件置于刚才创建的 flaskr 文件夹中:

drop table if exists entries;
create table entries (id integer primary key autoincrement,title string not null,text string not null
);

创建数据库(三种方式)

1.sqlite3命令

sqlite3 /tmp/flaskr.db < schema.sql

如果没有安装sqlite3,那就采用下面方法

2.用函数初始化

from __future__ import with_statement
from contextlib import closing#接着我们可以创建一个称为 init_db 函数,该函数用来初始化数据库。为此我们可以使用之前定义的 connect_db 函数。 只要在 connect_db 函数下添加这样的函数:def init_db():with closing(connect_db()) as db:with app.open_resource('schema.sql') as f:db.cursor().executescript(f.read())db.commit()

closing()函数允许我们在with块中保持数据库连接可用。应用对象的open_resource()方法在其方框外也支持这个功能,因此可以在with块中直接使用。这个函数从当前位置(你的flaskr 文件夹)中打开一个文件,并且允许你读取它。我们在这里用它在数据库连接上执行一个脚本。

当我们连接到数据库时会得到一个数据库连接对象(这里命名它为 db),这个对象提供给我们一个数据库指针。指针上有一个可以执行完整脚本的方法。最后我们不显式地提交更改, SQLite 3 或者其它事务数据库不会这么做。

现在可以在 Python shell 里创建数据库,导入并调用刚才的函数:

>>> from flaskr import init_db
>>> init_db()

我在测试时这里出现一点问题,所以在win10下采用了第三种方式

3.可视化工具直接建表

工具:sqlitebrowser
下载地址:http://sqlitebrowser.org/
关于sqlite3我自己的简单总结:
http://blog.csdn.net/co_zy/article/details/77045039

请求数据库连接

现在我们知道了怎样建立数据库连接以及在脚本中使用这些连接,但是我们如何能优雅地在请求中这么做?

所有我们的函数中需要数据库连接,因此在请求之前初始化它们,在请求结束后自动关闭他们就很有意义。

Flask 允许我们使用before_request(),after_request()和 teardown_request()装饰器来实现这个功能:

@app.before_request
def before_request():g.db = connect_db()@app.teardown_request
def teardown_request(exception):g.db.close()

二.视图函数

显示条目

这个视图显示所有存储在数据库中的条目。它监听着应用的根地址以及将会从数据库中查询标题和内容。id值最大的条目(最新的条目)将在最前面。从游标返回的行是按select语句中声明的列组织的元组。对于像我们这样的小应用是足够的,但是你可能要把它们转换成字典,如果你对如何转换成字典感兴趣的话,请查阅简化查询例子。

视图函数将会把条目作为字典传入show_entries.html模版并返回渲染结果:

@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页面。如果工作正常的话,我们用flash()向下一个请求闪现一条信息并且跳转回show_entries页:

@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键值。如果用户成功登录,logged_in键值被设置成True,并跳转回show_entries页。此外,会有消息闪现来提示用户登入成功。

如果发生错误,模板会通知,并提示重新登录:

@app.route('/login', methods=['GET', 'POST'])
def login():error = Noneif 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'] = Trueflash('You were logged in')return redirect(url_for('show_entries'))return render_template('login.html', error=error)

另一方面,注销函数从会话中移除了logged_in键值。这里我们使用一个大绝招:如果你使用字典的pop()方法并传入第二个参数(默认), 这个方法会从字典中删除这个键,如果这个键不存在则什么都不做。这很有用,因为我们不需要检查用户是否已经登入。

@app.route('/logout')
def logout():session.pop('logged_in', None)flash('You were logged out')return redirect(url_for('show_entries'))

三.模版

layout.html

这个模板包含 HTML 主体结构,标题和一个登录链接(或者当用户已登入则提供注销)。如果有闪现信息的话它也将显示闪现信息。{% block body %} 块能够被子模版中的同样名字(body)的块替代。

session字典在模版中同样可用的,你能用它检查用户是否登录。注意在 Jinja 中你可以访问不存在的对象/字典属性或成员, 如同下面的代码, 即便 ‘logged_in’ 键不存在,仍然可以正常工作:

<!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>

show_entries.html

这个模版继承了上面的layout.html模版用来显示信息。注意for遍历了所有我们用render_template()函数传入的信息。我们同样告诉表单提交到add_entry函数通过使用 HTTP 的POST方法:

{% 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 %}

login.html

最后是登录模板,基本上只显示一个允许用户登录的表单:

{% 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 %}

添加样式

现在其他一切都正常工作,是时候给应用添加些样式。只要在我们之前创建的static文件夹中新建一个称为style.css的样式表:

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; }

效果图

发布时记得将flaskr.py最后一行app.run(debut =True)改为app.run()

Flask实战1-轻博客相关推荐

  1. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  2. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...

  3. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

  4. 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来 ...

  5. 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...

  6. 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 ...

  7. 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...

  8. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

  9. 用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Admin BaseView 基础管理页面 Mo ...

  10. 用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Flask-Assets 将 Flask-Assets 应用 ...

最新文章

  1. C4D和Redshift:2D矢量到三维渲染 Cinema 4D and Redshift: 2D vector to 3D render
  2. 苹果公司开发Overton机器学习平台,它到底是什么?
  3. QMetaObject::connectSlotsByName: No matching signal for问题的解决方法
  4. 关于在unity中动态获取字符串后在InputField上进行判断的BUG
  5. Java中的状态设计模式
  6. 免费干货课程!发放官方证书!参与更有礼品相送!戳进绝不后悔~
  7. 医学专业考计算机三级,2020年9月中国医科大学计算机等级考试报名通知
  8. js 加密url java_js 对 URL 参数进行 加密 解密
  9. 代码阅读是写好程序的基本能力
  10. 使用 Anthem.NET 的常见回调(Callback)处理方式小结
  11. Ping++中的AlipaySDK和AlicloudUTDID冲突解决方案
  12. Hive实现oracle的Minus函数
  13. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.5. UNION、CASE和相关结构...
  14. DBS:CUPhone
  15. Vue经典开源项目汇总
  16. 基于Matlab/Simulink的1/4车辆系统动力学模型的两种建模方法(动力学建模入门知识)
  17. win系统装机及磁盘分区、清理
  18. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
  19. “万丈高楼平地起,编程学习要趁早”
  20. node.js的安装配置教程

热门文章

  1. F - 数据结构实验之查找六:顺序查找
  2. 第一天2017/03/28
  3. 【深度学习】查准率、召回率、AP、mAP
  4. JDK源码分析——Java的SPI机制分析与实战
  5. Spring IOC 容器源码分析 - 循环依赖的解决办法
  6. 面向组合子程序设计方法 之 新约
  7. java学习笔记11--集合总结
  8. 「Githug」Git 游戏通关流程
  9. K Nearest Neighbor 算法
  10. 常用sql-----DDL语句