网站首页 > 技术文章 正文
一、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 import SQLAlchemy
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 import Migrate,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;
}
}
猜你喜欢
- 2024-10-03 不改一行代码!快速部署流行框架到腾讯云 Serverless
- 2024-10-03 Flask 基础理解(flask基础入门)
- 2024-10-03 AI界最危险武器GPT-2使用指南:从Finetune到部署
- 2024-10-03 解决Flask-SocketIO部署遇到的问题
- 2024-10-03 Python Web 部署(pythonweb服务器部署)
- 2024-10-03 Python Flask 大型应用的架构(python的flask案例)
- 2024-10-03 python 解析二维码(ZBar) flask开发 Dockerfile 打包部署
- 2024-10-03 使用Docker部署Python Flask Web应用的最佳实践
- 2024-10-03 带你认识 flask 错误处理(flask errorhandler)
- 2024-10-03 使用 Python 和 Flask 架设网站:入门指南
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)