1.对比Django
比较项 | Django | Flask | 复杂度比较 | 说明 |
---|---|---|---|---|
项目创建 | Django需要用命令创建项目 | Flask直接编写文件就可以运行 | Django复杂 | Django需要用命令创建项目是因为需要创建整个项目框架 |
路由 | Django使用专门的urls.py | Flask直接使用@app.route() | Django笨重 | Django类似Struct2的配置,Flask类似Spring的配置,Flask感觉更好 |
GET和POST | request.GET['name']和request.POST['name'] | request.args.get("name","")和request.form["q"] | 差不多 | Flask上格式不统一 |
Restful | 使用django-restful框架 | 使用flask-restful框架 | 差不多 | Flask使用方法flask-restfu使用类格式不统一;flask-restful需要注册参数 |
数据库操作 | django集成了对数据库的操作 | Flask没集成对数据库的操作要另行 | 差不多 | django复杂很大程度来源于对于数据库的集成 |
Django继承了MVT和ORM,以及后台管理。
Flask两个主要核心应用是EWerkzeug和模板引擎jinja2。
扩展包
Flask | Django | ||
---|---|---|---|
Flask-SQLalchemy | 操作数据库 | django-admin | |
Flask-migrate | 管理迁移数据库 | manage.py | |
Flask-Mail | 邮件 | orm模型 | |
Flask-WTF | 表单 | admin | |
Flask-script | 插入脚本 | 文件存储系统 | |
Flask-OpenID | 认证 | 用户认证系统 | |
Flask-Login | 认证用户状态 | ||
Flask-RESTful | 开发REST API的工具 | ||
Flask-Bootstrap | 集成前端Twiiter Bootstrap框架 | ||
Flask-Moment | 本地化日期和时间 |
Django内容 Flsak都没有需要扩展包提供 框架核心 : Werkzerug + jinja2(轻)
2.安装
pip3 install flask
第一个项目
# --UTF-8--
-lv wq --
导入Flask类
from flask import Flask
Flask类接收一个参数name
app = Flask(name)
装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
return "hello,world"
Flask 应用程序实例的run方法启动web服务器
if name == 'main':
app.run()
Flask对象的初始化参数
应用程序配置参数
app.run()运行参数
应用程序配置参数
Django将所有配置信息都放到了settings.py文件中,而Flask则不同。
Flask将配置信息保存到了app.config 属性中,该属性可以按照字典类型进行操作。
读取
from flask import Flask
app = Flask(name)
app.config.get(name)
app.config[name]
设置
1.从配置对象中加载
app.config.from_object(配置对象)
class DefaultConfig(object):
"""
默认配置
"""
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
app = Flask(name)
app.config.from_object(DefaultConfig)
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return 'HELLO World'
应用场景,可以继承---------------------------------------
class DevelopmentConfig(DefaultConfig):
DEBUG=True
例子:
# --UTF-8--
-lv wq --
导入Flask类
from flask import Flask
class DefaultConfig(object):
"""默认配置"""
SECRET_KEY = 'CHDWDIJQIDQWDQW123DKWENFF33'
Flask类接收一个参数name
app = Flask(name)
app.config.from_object(DefaultConfig) #
装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
print(app.config['SECRET_KEY'])
return "hello,world"
Flask 应用程序实例的run方法启动web服务器
if name == 'main':
app.run()
2.从配置文件中加载
app.config.from_pyfile(配置文件)
新建一个配置文件setting.py
SECRET_KEY = 'TPmi4aLWRbyVq8zu9v82dWYW1'
在Flask程序文件中
app = Flask(name)
app.config.from_pyfile('setting.py')
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
例子:
# --UTF-8--
-lv wq --
导入Flask类
from flask import Flask
app = Flask(name)
app.config.from_pyfile('settings.py')
装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
print(app.config['SECRET_KEY'])
return "hello,world"
Flask 应用程序实例的run方法启动web服务器
if name == 'main':
app.run()
3.从环境变量中加载
Flask使用环境变量加载配置的本质是通过环境变量值找到配置文件,再读取配置文件的信息,其使用方式为
app.config.from_envvar('环境变量名') # 环境变量值为配置文件的绝对路径
先在终端中执行如下命令
export PROJECT_SETTING = '~/setting.py'
再运行代码
app = Flask(name)
app.config.from_envvar('PROJECT_SETTING',silent=True)
@app.route("/")
def index():
print(app.config['SECRET_KEY'])
return "hello world"
if name == 'main':
app.run(host="0.0.0.0",port=5000,debug=True) # 指定运行的主机IP端口和是否开启DEBUG
表示系统环境变量中没有设置相应值时是否抛出异常 False 表示不安静的处理,没有值时报错通知,默认为False,True 表示安静的处理,即时没有值也让Flask正常的运行下去
3.开发服务器启动方式
从1.0版本开始 不再需要在 代码中写 app.run()
使用命令 flask run
4.路由
@app.route("/login")
def view_func():
return "hello world"
1.查询路由信息
--命令行方式
flask routes
Endpoint Methods Rule
index GET /
static GET /static/
--在程序中获得
print(app.url_map)
也可以遍历路由信息
for rule in app.url_map-iter_rules():
print('name = {} path = {}'.format(rule.endpoint,rule.rule))
2.获取请求参数
from flask import request
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
coockies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | String |
files | 记录请求上传的文件 | * |
5.请求钩子
请求钩子是通过装饰器的形式实现,Flask支持四种请求钩子:
before_first_request : 在处理第一个请求前运行。
before_request : 在每次请求前运行
after_request : 如果没有未处理的异常抛出,在每次请求后运行。
teatrdown_request : 在每次请求后运行,即使有未处理的异常抛出
6.JinJa2模板
http://docs.jinkan.org/docs/jinja2/
Flask使用Jinja2这个模板引擎来渲染模板。Jinja2能识别所有类型的变量,包括{}。 Jinja2模板引擎,Flask提供的render_template函数封装了该模板引擎,render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值
7.Web表单
web表单是web应用程序的基本功能
pip3 install Flask-WTF
WTForms支持的HTML标准字段
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文本上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
8.数据库
flask-sqlalchemy是一个简化了SQLAlchemy操作的flflask扩展。
1.安装服务端
sudo apt-get install mysql-server
2.安装客户端
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
3.数据库的基本命令
登录数据库
mysql -u root -p
创建数据库,设定编码
create database <数据库名> charset=utf8;
显示所有数据库
show databases;
在Flask中使用mysql数据库,需要安装一个flask-sqlalchemy的扩展
pip install flask-sqlachemy
4.对比Django和Flask数据库设置
Django :
DATABASES = { 'default': { 'ENGINE': None, # 把默认的数据库连接至为None } }
Flask:
app.confifig['SQLALCHEMY_DATABASE_URI'] ="************"
5.数据库迁移
创建迁移仓库
python database.py db init
创建迁移脚本
#创建自动迁移脚本
python database.py db migrate -m 'initial migration'
更新数据库
python database.py db upgrade
回退数据库
python database.py db downgrade 版本号
9.蓝图
蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。
1.创建蓝图对象
#Blueprint必须指定两个参数,admin表示蓝图的名称,name表示蓝图 所在模块
admin = Blueprint('admin',name)
2.注册蓝图路由
@admin.route('/')
def admin_index():
return 'admin_index'
3.在程序实例注册路由
app.register_blueprint(admin,url_prefix='/admin')
实例:
from flask_restful import Api
api = Api()
def init_api(app): # 传进来的app要继承过数据库配置DbConfig
api.init_app(app)
api.add_resource(class, "")
10.单元测试
常用断言方法
assertEqual 如果两个值相等,则pass
assertNotEqual 如果两个值不相等,则pass
assertTrue 判断bool值为True,则pass
assertFalse 判断bool值为False,则pass
assertIsNone 不存在,则pass assertIsNotNone 存在,则pass