Django、Flask、Tornado是Python主流的三大Web框架,三者各有优劣。本文就来聊一聊Flask。
Flask是一个基于Python开发并且依赖jinja2模板和WSGI服务的一个微型框架,“微型”到什么程度呢?微型到不到十行代码就能开发一个Web接口服务。代码如下:
# 引入flask模块
from flask import Flask
app = Flask(__name__)
# 路由
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
需要注意的是,“微框架”并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。
默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
对于Flask框架的教程,大家可以观看其官方教程,里面有很详细的示例。而我们后面要结合多个第三方扩展模块实现我们的Presto数据查询项目。
比如我们接下来会用到的:
- 登录认证模块:flask_login
- 数据库管理模块:flask_sqlalchemy和flask_migrate
- Flask表单模块:flask_wtf
- Flask命令模块:flask_script
- bootstrap前端模块:flask_bootstrap
Flask 数据库管理模块
- 开发配置类
class Config:
SECRET_KEY='asdnjasd'
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root123@localhost:3306/test'
DEBUG=True
SQLALCHEMY_COMMIT_ON_TEARDOWN=True
SQLALCHEMY_TRACK_MODIFICATIONS=False
- 实例化sqlalchemy模块
from flask_sqlalchemy import SQLALchemy
from flask_migrate import Migrate
db=SQLALchemy()
migrate=Migrate(db=db)
def extension_init(app):
db.init_app(app)
migrate.init_app(app)
- 开发数据model
class User(db.Model,UserMixin):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(10),unique=True)
password=db.Column(db.String(128))
sex=db.Column(db.Boolean,default=1)
email=db.Column(db.String(100),unique=True)
- 添加数据库迁移命令
from flask_migrate import MigrateCommand
manage.add_command('db',MigrateCommand)
- 开发过程中进行数据迁移
# 初始化
python manage.py db init
# 生成数据库更新相关的脚本
python manage.py db migrate
# 执行数据库迁移
python manage.py db upgrade
Flask Login模块
- 使用之前我们需要对login模块进行初始化操作,需要传入的参数就是我们前面代码中的Flask实例 app。
from flask_login import LoginManager
login_manage=LoginManager()
# 初始化
login_manage.init_app(app)
- 然后需要在User Model中编写认证方法
from flask_login import UserMixin
from App.extensions import login_manage
#如果不继承UserMixin是无法满足使用flask_login的条件的
class User(db.Model,UserMixin):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(10),unique=True)
password=db.Column(db.String(128))
sex=db.Column(db.Boolean,default=1)
email=db.Column(db.String(100),unique=True)
#这个回调是用来接收一个用户id的时候返回一个用户对象
@login_manage.user_loader
def load_user(uid):
return User.query.get(int(uid))
- 使用起来非常的简单,只需要在相关的view中添加login_require装饰器即可
# 路由
@app.route('/')
@login_required
def hello_world():
return 'Hello World!'
Flask 表单生成模块
- 我们通过继承FlaskForm来完成表单的创建,会在界面上生产对应的字段信息
#创建表单类
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,Length
class Login(FlaskForm):
#参数1 为label中的内容显示
username = StringField('用户名',validators=[DataRequired(message='用户名不能为空'),Length(min=6,max=12,message='用户名在6-12位之间...')])
userpass = PasswordField('密码',validators=[DataRequired(message='密码不能为空'),Length(min=6,max=10,message='密码长度为6-10位')])
submit = SubmitField('登录')
- 开发view相关的方法,实现表单验证
@app.route('/login/',methods=['GET','POST'])
def login():
form = Login() #实例化登录的表单类
# if request.method=='POST':
if form.validate_on_submit(): #当前表单的csrf验证通过 和数据正确 则为真
print(form.username.data) #使用表单对象获取数据
print(form.userpass.data)
return {'msg':'ok'}
return render_template('login.html',form=form)
Flask Bootstrap模块
base页面模板
{% extends 'bootstrap/base.html' %}
{% block title %}
主题
{% endblock %}
{% block navbar %}
这里粘贴bootstrap代码
{% endblock%}
登录页面模板
{% import'bootstrap/wtf.html' as wtf%}
{% block page_content %}
<div class="row">
<div class="col-md-8">.col-md-8</div>
<div class="col-md-4">{{ wtf.quick_form(form) }}</div>
</div>
{% endblock %}
好了,我们对于Flask框架及其第三方扩展模块的介绍就到这了。 后面我们会一步一步的通过代码实现我们基于Presto的数据查询项目。