一、蓝图(熟练)
- 在project中以一个清晰的目录结构划分app中各个视图、模板和静态信息,并且用init.py文件进行管理。
- 主要功能:url_perfix 给蓝图下的所有函数加域名;before_request 局部添加视图执行前的操作。
1. 管理文件
from project_name import __init__
if __name__ == '__main__':
app.run()
2. **初始文件
from flask import Flask
app = Flask(__name__)
from .views import task_processing
app.register_blueprint(task_processing.tp)
3. *视图
from flask import Blueprint
#每个蓝图的名字要不同
#url_perfix:以下的函数都要加上'/task_processing'为前缀
tp = Blueprint('login', __name__, url_perfix='/tp')
@tp.before_request('')
def before():
return '其他视图执行前执行'
@tp.route('/vague')
def vague():
return ''
@tp.route('/structed')
def structed():
return ''
ps:标准蓝图框架
框架 数据库 模板 函数
MTV Model Template View
MVC Model View Controller
二、知识补充
1.项目依赖
#自动写一个requirement.txt文件记录项目所依赖的包和模块版本
pipregs ./ # ./ 当前目录
#自动下载requirement.txt文件记录的项目依赖
pip3 install -r requirement.txt # -r 全部
2.方法和函数的区别
class report(object):
def check(self):
return 1+1
#类里面的def可以是函数也可以是方法,区别在于谁去调用他
report(123) #函数
rpt = report()
rpt.check() #方法
三、组件的使用和原理(Session相关)
1.Redis
- 传统的Flask程序会将session放在用户的cookie里面,而Redis则会将session放在内存里面
2.Redis/ Memcashed/ File/ MongoDB/ SQLAlchemy
- 推荐使用Redis因为数据类型更丰富,Memcashed里面只有字符串类型
3.配置!!
在__init__文件中
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis(hose='127.0.0.0',port='5000')
4.修改
from flask_session import Session
Session(app)
5.注意
- 传统的Flask 程序 session.permanent 默认为False,只要session第一层的值没有发生改变就不会更新。造成超时的时间按照用户第一次登陆的时间来定,而不是最后一次操作时间。
- 用户超时时间根据session里面的PERMANENT_SESSION_LIFETIME = timedelta(minutes=20)而定
- 用传统的Flask程序时,有两种修改方式,让session在用户每次操作都更新:
①modified = True
②SESSION_REFRESH_EACH_REQUEST = True and session.permanent = True (Redis中是默认的)
四、数据库链接池
1.原理
使用传统的pymysql方法,每一个请求就会新建一个链接,但是使用完并不会马上关闭链接,是需要一些时间的(可以看源码)。而且链接本身是有复用性的,为了应对高频、重复地对数据库进行查询从而频繁地创建链接和关闭链接影响数据库性能,可以使用链接池进行优化。
在程序启动时,根据mincashed参数创建制定数据量的线程数,有请求过来就是占用一个。当使用完,conn.close()也不会马上关闭链接,而是将链接放回链接池等待下一个请求使用。
2.创建连接池
from DBUtils.PooledDB import PooledDB,SharedConnection
import pymysql
POOL = PooledDB(
creater = pymysql,
maxconnections=6, #最大链接数
mincashed=2,maxcashed=5 #最大/小闲置连接数
blocking=True #拥挤排队,False会直接报错
maxusage=None #链接多大复用次数,默认None
host, port, user, password, database, charset #数据库信息
)
3.使用
conn = POOL.connection()
cursor = conn.soncur()
#查询、执行语句与pymysql一致
cursor.exacute()
result = cursor.fetchall() #cursor.commit()
cursor.close()
conn.close()
五、面向对象
1. Trick
__mro__:按顺序找到类的继承关系
__dict__:找到函数或者对象里面的所有值
metaclass:类是默认由type()创建的
十、ORM
1.ORM是关系对象映射
类 --> 表
对象 --> 记录(一行数据)
当有了关系之后,则不需要在编写sql,取而代之的是操作、类、对象
ORM:Model.Users.objects.filters(id=1,type='1')
--等价于以上python语句
select * from user u
join dept d on u.dept_id=d.id
2.其他
问:ORM和原生SQL哪个好
答:ORM执行速度慢,但开发方便
概念:
db first: 根据数据库的表生成类
code first: 根据类创建数据库