Flask框架web开发之零基础入门


Posted in Python onDecember 10, 2018

Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁, 但又非常灵活,而且容易学习和应用。因此Flask框架是Python新手快速开始web开发最好的选择,此外, 使用Flask框架的另一个好处在于你可以非常轻松地将基于Python的机器学习算法或数据分析算法集成到 web应用中。

Flask框架web开发之零基础入门 

1、可以用Flask框架做什么

从博客应用到克隆一个facebook或者twitter,理论上你可以用Flask做任何事情。有很多库 可以直接使用,例如flask-sockets,flask-google-maps等,而且Flask框架支持MySQL、Postgresql、 MongoDB等诸多数据库。

我能想到的一些可以用Flask框架实现的web应用类型:博客应用、聊天应用、仪表盘应用、REST API、管理页面、邮件服务等。

如果希望深入学习Flask Web开发,推荐这个教程:深入浅出Flask 安装Flask

使用pip安装Flask:

$ pip install flask

2、Hello,World

创建一个文件app.py,然后只需要几个简单的步骤,就可以写出Flask版本的Hello World

引入Flask类

from flask import Flask

创建Flask对象,我们将使用该对象进行应用的配置和运行:

app = Flask(__name__)

name 是Python中的特殊变量,如果文件作为主程序执行,那么 __name__ 变量的值就是 __main__ ,如果是被其他模块引入,那么 __name__ 的值就是模块名称。

编写主程序

在主程序中,执行 run() 来启动应用:

if __name__ =="__main__":
  app.run(debug=True, port=8080)

改名启动一个本地服务器,默认情况下其地址是 localhost:5000 ,在上面的代码中,我们使用关键字 参数 port 将监听端口修改为8080。

路由

使用app变量的 route() 装饰器来告诉Flask框架URL如何触发我们的视图函数:

@app.route('/')
def hello_world():
  return 'Hello, World!'

上面的标识,对路径'/‘的请求,将转为对 hello_world() 函数的调用。很直白,对吧?

运行

现在,让我们完整地看一下app.py的整个代码:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
  return 'Hello, World!'

if __name__ =="__main__":
  app.run(debug=True,port=8080)

然后运行起来:

$ python app.py

你应该会看到如下输入:

现在就可以打开浏览器访问 http://127.0.0.1:8080/ 了:

* Serving Flask app "app" (lazy loading)
* Environment: production
* Debug mode: on
* Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 770-937-705

Flask框架web开发之零基础入门

3、使用HTML模板

首先我们看看如何原始的HTML代码插入Flask应用:

from flask import Flask
app = Flask(__name__)


@app.route('/greet')
def greet():
  user = {'username': 'John', 'age': "20"}
  return '''
<html>
  <head>
    <title>Templating</title>
  </head>
  <body>
    <h1>Hello, ''' + user['username'] + '''!, you're ''' + user['age'] + ''' years old.</h1>
  </body>
</html>'''


if __name__ == '__main__':
app.run(debug = True,port=8080)

在上面的代码中,我们使用拼接的HTML字符串来展示user字典的数据。现在访问 http://127.0.0.1:8080/greet

Flask框架web开发之零基础入门

拼接HTML字符串非常容易出错,因此Flask使用Jinja 2模板引擎来分离数据逻辑和展示层。

我们将模板文件按如下路径放置:

Apps folder
/app.py
templates
  |-/index.html

使用模板时,视图函数应当返回 render_template() 的调用结果。例如下面的代码片段 渲染模板 index.html ,并将渲染结果作为视图函数的返回值:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello')
def hello():
  return render_template('index.html', name="Alex")

if __name__ == '__main__':
  app.run(debug = True)

在上面的代码中,模板文件 index.html 依赖于变量 name ,其内容如下:

<html>
<body>
 {% if name %}
  <h2>Hello {{ name }}.</h2>
 {% else %}
  <h2>Hello.</h2>
 {% endif %}
 </body>
</html>

模板文件的语法扩充了HTML,因此可以使用变量和逻辑。

在浏览器中访问 http://127.0.0.1:8080/hello/alex

Flask框架web开发之零基础入门

4、使用表单

每个web应用都需要使用表单来采集用户数据。现在让我们使用Flask框架创建一个 简单的表单来收集用户的基本信息,例如名称、年龄、邮件、兴趣爱好等,我们将 这个模板文件命名为 bio_form.html

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <h1>Bio Data Form</h1>
  <form action="showbio">
    <label>Username</label>
    <input type="name" name="username"><br>
    <label>Email</label>
    <input type="email" name="email"><br>
    <label>Hobbies</label>
    <input type="name" name="hobbies"><br>
    <input type="submit" name="">
  </form>
</body>
</html>

视图函数 bio_data_form 同时支持POST和GET请求。GET请求将渲染 bio_form.html 模板,而POST请求将重定向到 showbio

@app.route('/form', methods=['POST', 'GET'])
def bio_data_form():  
  if request.method == "POST":
    username = request.form['username']    
    age = request.form['age']    
    email = request.form['email']    
    hobbies = request.form['hobbies']    
    return redirect(url_for('showbio',               
                username=username,
                age=age,
                email=email,  
                hobbies=hobbies))  
  return render_template("bio_form.html")

下面是showbio的实现:

@app.route('/showbio', methods=['GET'])
def showbio():  
  username = request.args.get('username')  
  age = request.args.get('age')  
  email = request.args.get('email')  
  hobbies = request.args.get('hobbies')  
  return render_template("show_bio.html",
              username=username,             
              age=age,             
              email=email,             
              hobbies=hobbies)

以及show_bio.html的内容:

<!DOCTYPE html>
<html>
<head>
  <title>Bio-Data Details</title>
</head>
<body>
  <h1>Bio-Data Details</h1>
  <hr>
  <h1>Username: {{ username }}</h1>
  <h1>Email: {{ email }}</h1>
  <h1>Hobbies: {{ hobbies }}</h1>
</body>
</html>

5、数据库集成:使用SQLAlchemy

Flask不能直接连接数据库,需要借助于ORM(Object Relational Mapper)。 在这一部分,我们将借助于SQLAlchemy使用Postgres数据库。

安装Flask-SQLAlchemy和Postgres

首先安装flask-sqlalchemy:

$ pip install flask-sqlalchemy

然后从官方下载并安装postgres:https://postgresapp.com/

创建数据库

在终端中使用下面的命令创建一个appdb数据库:

$ createdb appdb

更新应用配置

修改app.config,添加数据库相关的配置信息:

app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI']='postgresql://localhost/appdb'
SQLALCHEMY_TRACK_MODIFICATIONS = True
db = SQLAlchemy(app)

然后在代码中就可以使用这些配置数据了:

from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy

# Settings
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb'
db = SQLAlchemy(app)

@app.route('/')
def hello_world():
  return 'Hello, World!'

if __name__ == '__main__':
  app.run()

现在,让我们创建第一个模型(Model)。所有模型的基类是db.Model,使用Column来定义 数据列:

class Post(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  title = db.Column(db.String(80), unique=True)
  post_text = db.Column(db.String(255))
  
  def __init__(self, title, post_text):
    self.title = title
    self.post_text = post_text

在代码中使用模型:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/testdb'

db = SQLAlchemy(app)


class Post(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  title = db.Column(db.String(80), unique=True)
  post_text = db.Column(db.String(255))

  def __init__(self, title, post_text):
    self.title = title
    self.post_text = post_text


@app.route('/')
def index():
  return "Hello World"


app = Flask(__name__)

if __name__ == "__main__":
  app.run()

6、模型-数据同步

使用ORM时,需要执行迁移操作以便在模型和持久化数据之间保持同步。我们使用 Flask-Migrate这个扩展来完成该任务。

首先安装:

$ pip install flask-migrate
$ pip install flask_script

然后在代码中引入:

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

进行必要的配置:

migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)

运行管理器:

if __name__ == '__main__':
  manager.run()

完整的代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb'

db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)


class Post(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  title = db.Column(db.String(80), unique=True)
  post_text = db.Column(db.String(255))

  def __init__(self, title, post_text):
    self.title = title
    self.post_text = post_text


@app.route('/')
def index():
  return "Hello World"


if __name__ == "__main__":
  manager.run()

使用如下的命令初始化Alembic:

$ python app.py db init
Creating directory /Users/Vihar/Desktop/flask-databases/migrations ... done
...
...
...
Generating /Users/Vihar/Desktop/flask-databases/migrations/alembic.ini ... done

执行第一个迁移任务:

$ python app.py db migrate
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'post'

Generating /Users/Vihar/Desktop/flask-databases/migrations/versions/ed3b3a028447_.py ... done

一旦上述命令执行完毕,我们的数据表就会创建成功。现在更新数据库:

$ python app.py db upgrade

Flask框架web开发之零基础入门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查找相似单词的方法
Mar 05 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python简单定义与使用二叉树示例
May 11 Python
基于Python列表解析(列表推导式)
Jun 23 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
利用Python实现自动扫雷小脚本
Dec 17 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 #Python
Python操作Excel插入删除行的方法
Dec 10 #Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 #Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 #Python
python得到一个excel的全部sheet标签值方法
Dec 10 #Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 #Python
python模块导入的细节详解
Dec 10 #Python
You might like
php csv操作类代码
2009/12/14 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
form自动提交实例讲解
2017/07/10 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Track Image Loading效果代码分析
2007/08/13 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
js创建数组的简单方法
2016/07/27 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
react 生命周期实例分析
2020/05/18 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python实现购物车程序
2018/04/16 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
Django nginx配置实现过程详解
2020/09/10 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
校运会入场式解说词
2014/02/10 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书