一、Flask的数据库SQLAlchemy
1.1 SQLAlchemy简介:
SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。
flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。
1.2 SQLAlchemy的使用:
1.2.1安装导入: 安装flask_sqlalchemy
from flask import Flask
from flask_sqlalchemy importSQLAlchemy
1.2.2创建flask的app:
app = Flask(__name__)
1.2.3配置SQLAlchemy参数:
class Config(object):
"""配置参数"""
# sqlalchemy的配置参数
SQLALCHEMY_DATABASE_URI= "mysql://root:mysql@127.0.0.1:3306/db_python04"
数据库类型://用户名:密码@数据库地址:端口号/数据库名
# 设置sqlalchemy自动更跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS= True
1.2.4添加配置到app:
app.config.from_object(Config)
1.2.5创建数据库sqlalchemy工具对象:
db = SQLAlchemy(app)
1.2.6定义数据库表:
class Role(db.Model):
"""用户角色/身份表"""
__tablename__ = "tbl_roles" #表名
id = db.Column(db.Integer, primary_key=True) #表的主键
name = db.Column(db.String(32), unique=True)
users = db.relationship("User", backref="role")
def __repr__(self):
"""定义之后,可以让显示对象的时候更直观"""
return "Role object: name=%s" % self.name
1.2.7启动函数执行的命令:
if __name__ == '__main__':
# 清除数据库里的所有数据
db.drop_all()
# 创建所有的表
db.create_all()
# 创建对象
role1 = Role(name="admin")
# session记录对象任务
db.session.add(role1)
# 提交任务到数据库中
db.session.commit()
二、数据库迁移
2.1首先要在虚拟环境中安装Flask-Migrate:
pip install flask-migrate
2.2导入相关文件:
from flask_migrate importMigrate,MigrateCommand
from flask_script import Shell,Manager
2.3使用Manager管理我们创建的app:
app = Flask(__name__)
manager = Manager(app)
2.4配置数据库参数,同上1.2.3
2.5使用migrate将配置的数据库与app关联起来:
#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db)
2.6在flask-Script中的manager中添加一个db命令:
manager.add_command('db',MigrateCommand)
2.7定义模型类,同上1.2.6
2.8运行管理器:
if __name__ == '__main__':
manager.run()
2.9创建迁移仓库,在命令行输入:
#这个命令会创建migrations文件夹,所有迁移文件都放在里面。
python code.py db init
2.10创建迁移脚本,同Django类似,有两个命令:
#创建自动迁移脚本
python code.py db migrate-m 'initial migration' #后面为脚本的备注
#更新数据库
python code.py db upgrade
三、发送邮件
3.1Flask框架使用Flask-Mail扩展包实现发送邮件功能
3.2使用QQ邮箱的smtp服务器:
3.3在代码中导入Flask-Mail扩展包:
from flask_mail import Mail, Message
3.4配置发送邮件需要的参数:
#配置邮件:服务器/端口/传输层安全协议/邮箱名/密码
app.config.update(
DEBUG = True,
MAIL_SERVER='smtp.qq.com',
MAIL_PROT=465,
MAIL_USE_TLS = True,
MAIL_USERNAME = '371673381@qq.com',
MAIL_PASSWORD = 'goyubxohbtzfbidd',
)
3.5关联app:
mail = Mail(app)
3.6在视图函数中的处理:
# sender 发送方,recipients 接收方列表
msg = Message("This is a test ",sender='371673381@qq.com', recipients= ['371673381@qq.com'])
#邮件内容
msg.body = "Flask test mail"
#发送邮件
mail.send(msg)
四、Flask中的蓝图
4.1蓝图简介:蓝图是用于实现单个应用的视图、模板、静态文件的集合
4.2蓝图的初始化:
#Blueprint必须指定两个参数,admin表示蓝图的名称,__name__表示蓝图所在模块
admin = Blueprint('admin',__name__)
4.3注册蓝图路由:
@admin.route('/')
def admin_index():
return 'admin_index'
4.4在程序实例中注册该蓝图:
app.register_blueprint(admin,url_prefix='/admin')
五、单元测试
5.1单元测试的意义:
Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的。
5.2测试的分类:单元测试、集成测试、系统测试等,其中单元测试是由开发人员进行的
5.3单元测试的方法:开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。
5.4单元测试中断言(assert)的使用:
5.4.1常用的断言方法:
assertEqual 如果两个值相等,则pass
assertNotEqual 如果两个值不相等,则pass
assertTrue 判断bool值为True,则pass
assertFalse 判断bool值为False,则pass
assertIsNone 不存在,则pass
assertIsNotNone 存在,则pass
5.5单元测试的基本写法:
5.5.1定义一个类,继承自unittest.TestCase:
import unittest
class TestClass(unitest.TestCase):
#该方法会首先执行,方法名为固定写法
def setUp(self):
pass
#测试代码,函数命名格式一定以test_开头
def test_app_exists(self):
pass
#该方法会在测试代码执行完后执行,方法名为固定写法
def tearDown(self):
pass
六、Flask的部署
6.1Flask部署示意图:
6.2由上图可以看出,Flask部署主要方式是Nginx+gunicorn+flask
其中Gunicorn(绿色独角兽)是一个Python WSGI的HTTP服务器,
优点是Gunicorn直接用命令启动,不需要编写配置文件,相对uWSGI要容易很多。
6.3Gunicorn的安装:pip install gunicorn
6.4运行Gunicorn
#指定进程和端口号: -w: 表示进程(worker)-b:表示绑定ip地址和端口号(bind)。
$gunicorn -w 4 -b 127.0.0.1:5001 运行文件名称:Flask程序实例名
6.5安装Nginx:$sudo apt-get install nginx
6.6nginx的相关指令:先进入/usr/local/nginx/目录
#启动
sudo sbin/nginx
#查看
ps aux | grep nginx
#停止
sudo sbin/nginx -s stop
6.7修改nginx配置:打开/usr/local/nginx/conf/nginx.conf文件
server {
# 监听80端口
listen 80;
# 本机
server_name localhost;
# 默认请求的url
location /{
#请求转发到gunicorn服务器
proxy_pass http://127.0.0.1:5001;
#设置请求头,并将头信息传递给服务器端
proxy_set_header Host $host;
}
} |