python flask项目结构规范_python 全栈开发,Day142(flask标准目录结构, flask使用SQLAlchemy,flask离线脚本,flask多app应用,flask-scr...

昨日内容回顾

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

Title

用户列表

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

Title

用户列表

桥本环奈

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值