flask 基础
一: 配置文件:
原理:通过字符串导入模块,反射找类,在获取到类中的静态属性,并且静态属性必须是大写, 使用 importlib
(1) 把字符串切割成两份:模块和类
(2)使用importlib 导入类
(3) 通过反射获取类对象
(4)通过dir()获取对象的方法和属性
app.config.from_object("settings.Pro") # 此处字符串为配置文件模块类
二: 路由系统:
1. 路由传参
参数有五种类型:字符串,float,int,其余两种不常用
例如 '/index/<int:nid>' 指定传入参数的类型,如果不写类型,默认为字符串
2. 反向路由解析
endpoint = "n1"
url_for('n1') # 注意:如果不指定 endpoint, url_for可使用指定视图函数解析,将指定视图函数解析成url
3. 路由不常用功能
(1)重定向 : 旧视图url重定向到新视图的url redirect_to
应用场景: 例如公司网站更新,使用新的域名,需要使用旧的域名跳转到新的域名
(2)不同域名的主机名,跳到不同的视图函数
(3)视图CBV,但是不经常用
三:请求和响应
1. 请求: django 以参数传递,flask 以导入模块,请求进来,把请求放到某地,取请求数据,通过request.
get request.args
post request.form
method request.method
2. 响应
return "123"
return redirect("/index")
return render_templates("index.html")
return jsonify({'name:'joe'})
#定制响应头部 make_response
obj = make_response(jsonify({'name':'joe'})) # 1. make_reponse 和响应体数据,生成一个对象
obj.header['xxxxxx'] = '123' # 2. 通过对象创建响应头
return obj # 3. 返回对象
四: 模板渲染
1. 字符串转换成标签
Django mark_safe safe
flask Markup safe
2. 模板中传入函数 函数()
3. 两个全局函数
4. 模板继承 和Django 一样
5. 宏定义
flask模板与Django不同处:
宏定义
两个全局特殊装饰器
执行函数加括号
使用方法更加接近Python
五:session 和 flash (闪现): 设置一次,只能读取一次
1. session
session: 将加密的内容放到浏览器中的cookie中
session执行流程:
当请求进来,flask会取到cookie中session对应的值,并将值进行解密和反序列化生成字典,将字典放入到内存中,提供给视图函数使用
请求结束:flask 去内存中取到字典对应的值,进行加密和序列化,将值给用户cookie
2. flash
原理: 在session中存储一个数据,读取时通过pop将数据移除
六: flask运行流程
1. app.run() 调用 werkzorg 中的 run_simple() # 启动socket,等待用户发请求
2. 用户发请求,服务端运行__call__ 方法,执行 wsgi_app 方法 # 可在执行__call__方法之前和之后,加入内容
七:特殊装饰器
before_request
after_request
templates_global
templates_filter
errorhandler
八:给视图函数添加装饰器注意事项:
注意:如果非要给视图函数加装饰器,一定要放在路由之下,视图函数之上,此时会出现endpoint 重名,
需要在装饰器加入@functools.wraps, 以后写装饰器都要加 @functools.wraps
import functools
def auth(func):
@functools.wraps(func) # 将原函数中的内容都封装inner中
def inner(*args,**kwargs):
ret = func(*args,**kwargs)
return ret
return inner
@app.route('/index/')
@auth
def index():
print('index')
九:蓝图
蓝图:flask 目录结构划分
1. 具体步骤:
(1)在项目下,创建一个和项目同名的目录,在目录中创建__init__.py 文件,创建函数,实例化flask
(2)在项目下,创建manage.py 文件,引入函数,运行socket server
(3)在和项目同名的目录中创建views目录,对视图进行分类
(4)在视图py文件中创建蓝图
(5)把蓝图注册到__init__
(6)在和项目同名的目录中创建templates和static目录
2. 每个蓝图都能指定HTML和静态文件保存的位置
3. 为每个蓝图的url添加一个前缀
app.register_blueprint(uc,url_prefix="/xxx")
4. before_request 放到 __init__.py 中就是全局应用,放到蓝图中就是局部应用

浙公网安备 33010602011771号