昨日内容回顾
1. 简述flask上下文管理-threading.local-偏函数-栈2. 原生SQL和ORM有什么优缺点?
开发效率: ORM>原生SQL
执行效率: 原生SQL>ORM
如:SQLAlchemy依赖pymysql3. SQLAlchemy多线程连接的情况
View Code
一、flask标准目录结构
标准flask目录结构
Project name/ #项目名
├── Project name #应用名,保持和项目名同名
│ ├── __init__.py #初始化程序,用来注册蓝图
│ ├── static #静态目录
│ ├── templates #模板目录
│ └── views #蓝图
└── manage.py #启动程序
注意:应用名和项目名要保持一致
蓝图
修改manage.py
from lastday importcreate_app
app=create_app()if __name__ == '__main__':
app.run()
进入views目录,新建文件account.py
from flask importBlueprint
account= Blueprint('account',__name__)
@account.route('/login')deflogin():return '登陆'@account.route('/logout')deflogout():return '注销'
View Code
修改 __init__.py,注册蓝图
from flask importFlaskfrom lastday.views.account importacdefcreate_app():"""创建app应用
:return:"""app= Flask(__name__)
app.register_blueprint(ac)return app
View Code
执行manage.py,访问首页: http://127.0.0.1:5000/login
效果如下:
进入views目录,新建文件user.py
from flask importBlueprint,render_template
us= Blueprint('user',__name__) #蓝图名
@us.route('/user_list/')def user_list(): #注意:不要和蓝图名重复
return "用户列表"
修改 __init__.py,注册蓝图
from flask importFlaskfrom lastday.views.account importacfrom lastday.views.user importusdefcreate_app():"""创建app应用
:return:"""app= Flask(__name__)#注册蓝图
app.register_blueprint(ac)
app.register_blueprint(us)return app
View Code
进入templates目录,创建文件user_list.html
用户列表
View Code
修改views-->user.py,渲染模板
from flask importBlueprint,render_template
us= Blueprint('user',__name__) #蓝图名
@us.route('/user_list/')def user_list(): #注意:不要和蓝图名重复
return render_template('user_list.html')
View Code
重启manage.py,访问用户列表
在static目录创建images文件夹,放一个图片meinv.jpg
修改 templates\user_list.html
用户列表
View Code
刷新页面,效果如下:
如果使用蓝图,上面就是官方推荐的写法!
配置文件
在项目根目录,创建settings.py
classBase(object):
SECRET_KEY= "fasdfasdf" #session加密字符串
classProduct(Base):"""线上环境"""
pass
classTesting(Base):"""测试环境"""DEBUG=FalseclassDevelopment(Base):"""开发环境"""DEBUG= True #开启调试
View Code
这里的Base表示3个环境相同的配置
为什么配置文件要用类呢?待会再说
引入配置(推荐写法)
from flask importFlaskfrom lastday.views.account importacfrom lastday.views.user importusdefcreate_app():"""创建app应用
:return:"""app= Flask(__name__)#引入配置文件并应用
app.config.from_object("settings.Development")#注册蓝图
app.register_blueprint(ac)
app.register_blueprint(us)return app
View Code
配置文件使用类之后,如果要切换环境,这里改一下,就可以了!
那么类的静态属性,就是配置!
路由都写在蓝图里面了,如果要对所有请求,做一下操作,怎么办?
加before_request,要在哪里加?
在__init__.py里面加
from flask importFlaskfrom lastday.views.account importacfrom lastday.views.user importusdefcreate_app():"""创建app应用
:return:"""app= Flask(__name__)#引入配置文件并应用
app.config.from_object("settings.Development")#注册蓝图
app.register_blueprint(ac)
app.register_blueprint(us)
@app.before_requestdefb1():print('b1')return app
View Code
重启manage.py,刷新页面,查看Pycharm控制台输出:b1
那么问题来了,如果b1的视图函数,代码有很多行呢?
在create_app里面有一个b1函数。b1函数就是一个闭包!
先来理解一下装饰器的本质,比如b1函数,加了装饰器之后,可以理解为:
b1 = app.before_request(b1)
由于赋值操作没有用到,代码缩减为
app.before_request(b1)
那么完整代码,就可以写成
from flask importFlaskfrom lastday.views.account importacfrom lastday.views.user importusdefcreate_app():"""创建app应用
:return:"""app= Flask(__name__)#引入配置文件并应用
app.config.from_object("settings.Development")#注册蓝图
app.register_blueprint(ac)
app.register_blueprint(us)
app.before_request(b1)#请求到来之前执行
returnappdefb1():print('app_b1')
View Code
其实蓝图,也可以加before_request
修改 views-->account.py
from flask importBlueprint
ac= Blueprint('account',__name__)
@ac.before_requestdefbb():print('account.bb')
@ac.route('/login')deflogin():return '登陆'@ac.route('/logout')deflogout():return '注销'
View Code
重启 manage.py,访问登录页面,注意:后面不要带"/",否则提示Not Found
查看Pycharm控制台输出:
app_b1
account.bb
可以发现,2个before_request都执行了。注意:在__init__.py中的before_request是所有路由都生效的
而account.py中的before_request,只要访问这个蓝图的路由,就会触发!
因此,访问 http://127.0.0.1:5000/logout,也是可以触发account.py中的before_request
完整目录结构如下:
lastday/├── lastday
│ ├──__init__.py
│ ├── static
│ │ └── images
│ │ └── meinv.jpg
│ ├── templates
│ │ └── user_list.html
│ └── views
│ ├── account.py
│ └── user.py
├── manage.py
└── settings.py
总结:
如果对所有的路由要操作,那么在app实例里面,写before_request
如果对单个的蓝图,则在蓝图里面使用before_request
二、flask使用SQLAlchemy
必须先安装模块sqlalchemy
pip3 install sqlalchemy
准备一台MySQL服务器,创建数据库db1
CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
默认的用户名为root,密码为空
非主流操作
基于上面的项目lastday,进入lastday应用目录,创建文件mode