Flask简介与简单项目操作流程

来源:互联网 发布:电子软件开发是什么 编辑:程序博客网 时间:2024/06/01 18:40
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框架

总结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 virtualenvsudo pip install virtualenvwrapper
  • 如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境mkdir $HOME/.virtualenvs# 2、打开~/.bashrc文件,并添加如下:export WORKON_HOME=$HOME/.virtualenvssource /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下面编写数据库配置
#设置连接数据库的URLapp.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 = title        self.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>

  • 本示例完成后效果如下图,在首页中显示所有的作者信息

作者

  • 通过作者链接,可以显示所有的图书信息

图书