Flask框架简介
Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用Werkzeug(路由模块),模板引擎则使用Jinja2。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
总结1:Flask也是一款MVC框架
Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用Werkzeug(路由模块),模板引擎则使用Jinja2。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
总结1:Flask也是一款MVC框架
总结2:核心为Werkzeug,这是由python语言编写的遵守WSGI协议的一个包
- Flask是一款MVC框架,主要是从模型、视图、模板三个方面对Flask框架有一个全面的认识,通过完成作者-读书功能,先来熟悉Flask框架的完整使用步骤。
- 操作步骤为:
- 1.创建项目
- 2.配置数据库
- 3.定义模型类
- 4.定义视图并配置URL
- 5.定义模板
环境安装
- 使用虚拟环境安装Flask,可以避免包的混乱和版本的冲突,虚拟环境是Python解释器的副本,在虚拟环境中你可以安装扩展包,为每个程序单独创建的虚拟环境,可以保证程序只能访问虚拟环境中的包。而不会影响系统中安装的全局Python解释器,从而保证全局解释器的整洁。
- 注意:Werkzeug对python3的支持并不好,所以如果使用Flask框架推荐使用python2
-
虚拟环境使用virtualenv创建,可以查看系统是否安装了virtualenv:
virtualenv --version
-
运行如下命令安装虚拟环境的应用
sudo pip install virtualenv
sudo pip install virtualenvwrapper
- 如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh# 3、运行
source ~/.bashrc
- 创建虚拟环境(ubuntu里须在联网状态下)
mkvirtualenv Flask_py
- 进入虚拟环境
workon Flask_py
- 退出虚拟环境
deactivate Flask_py
- 在虚拟环境中使用pip命令安装Flask包
$ pip install flask==0.10.1
1、创建项目
- 在pycharm点击菜单File->New Project..
- .
- 在弹出的New Project窗口中,选择项目类型为Flask,在Location中填写项目路径,在Interpreter中选择上一节创建的虚拟环境,然后点击create按钮
- 在弹出的Open Project窗口中选择打开的方式,可以在新窗口,也可以在当前窗口,选择后点击ok按钮
- 项目创建完成,在pycharm的project面板显示目录结构如下图
- 文件名称与项目名称一致,当前为test1.py
- 目录static用于存放静态文件
- 目录templates用于存放模板文件
- 点击pycharm右上角的绿色三角可以启动项目,如下图
- 运行效果如下图
- 修改启动代码如下,设置debug=True,再改动代码时服务器会自动重启
if __name__ == '__main__':app.run(debug=True)
- 关闭服务器后再重新启动就会生效
设计模型
- 此例中设计作者、图书两个模型类,作者-图书为一对多关系
- 在mysql中创建数据库test1
create database test1 charset=utf8;
2、配置mysql数据库
- 安装包flask-mysqldb,用于Flask与mysql交互
pip install MySQL-python==1.2.5
- 安装包Flask-SQLAlchemy,用于ORM转换
pip install flask-sqlalchemy==2.3.2
- 打开test1.py文件
- 引入类SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
- 在app下面编写数据库配置
#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test1'
#创建数据库对象
db = SQLAlchemy(app)
3、定义模型类
- 定义类如下
class Author(db.Model):__tablename__ = 'author'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(32), unique=True)def __init__(self, name):self.name = nameclass Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(32), unique=True)author = db.Column(db.Integer, db.ForeignKey('author.id'))def __init__(self, title, author):self.title = titleself.author = author
数据操作
- 在启动程序中创建表
if __name__ == '__main__':db.create_all()app.run()
- 继续编写代码,添加示例数据
db.create_all()author1 = Author('金庸')author2 = Author('琼瑶')db.session.add_all([author1, author2])db.session.commit()book11 = Book('射雕英雄传', author1.id)book12 = Book('天龙八部', author1.id)book13 = Book('雪山飞狐', author1.id)book21 = Book('还珠格格', author2.id)book22 = Book('情深深雨濛濛', author2.id)book23 = Book('梅花三弄', author2.id)db.session.add_all([book11, book12, book13, book21, book22, book23])db.session.commit()app.run()
- 点击运行启动服务器,此时可以到mysql中查询表和数据,表已经被创建,并且数据也加入成功
编写视图
- 视图的本质就是函数
- 打开test1.py
- 定义函数authorlist,查询所有作者信息
def authorlist():alist = Author.query.all()return '作者列表'
- 定义函数booklist,接收作者编号,查询指定作者的所有图书
def booklist(aid):blist = Book.query.filter(Book.author == aid)return '指定作者的图书列表'
4、URL配置
- flask的运行过程与django的过程是一样的,如下图
- 定义完成视图函数后,需要为函数配置url,才可以通过浏览器请求到这个函数
- 为authorlist配置url
@app.route('/alist/')
def authorlist():alist = Author.query.all()return '作者列表'
- 运行服务器,在浏览器中可以查看访问效果,访问作者列表的地址如下
http://127.0.0.1:5000/alist/
- 为booklist配置url,注意从地址中获取参数
@app.route('/blist/<aid>/')
def booklist(aid):blist = Book.query.filter(Book.author == aid)return '指定作者的图书列表'
- 访问图书列表的地址如下,其中1表示作者的编号
http://127.0.0.1:5000/blist/1/
5、定义模板
- 与django一样,html可以当作模板使用,可以编写html、css、js代码,也可以编写模板语言的代码
- 不同的是flask使用的模板语言名称为jiaja2,这种语言与django模板语言十分相似
- 在test1.py文件上部引入模板函数
from flask import render_template
- 修改hello_world函数如下,调用模板
@app.route('/')
def hello_world():return render_template('hello.html')
- 在templates目录下创建hello.html文件,内容如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>hello flask</h1>
</body>
</html>
- 在浏览器中请求效果如下图
- 可以通过函数向模板中传递数据,修改代码如下
@app.route('/')
def hello_world():return render_template('hello.html',title='flask',list1=range(5))
- 修改模板代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>hello {{ title }}</h1>
<ul>{% for i in list1 %}<li>{{ i }}</li>{% endfor %}
</ul>
</body>
</html>
- 刷新浏览器,运行效果如下图
作者列表
- 修改authorlist函数,调用模板
@app.route('/alist/')
def authorlist():alist = Author.query.all()return render_template('alist.html',alist=alist)
- 编写模板alist.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<ul>{% for author in alist %}<li><a href="/blist/{{ author.id }}/">{{ author.name }}</a></li>{% endfor %}
</ul>
</body>
</html>
图书列表
- 修改authorlist函数,调用模板
@app.route('/blist/<aid>/')
def booklist(aid):blist = Book.query.filter(Book.author == aid)return render_template('blist.html',blist=blist)
- 编写模板blist.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<ul>{% for book in blist %}<li>{{ book.title }}--{{ book.author }}</li>{% endfor %}
</ul>
</body>
</html>
- 本示例完成后效果如下图,在首页中显示所有的作者信息
- 通过作者链接,可以显示所有的图书信息