配置文件
# 配置方式一, 直接赋值:
app.config['DEBUG'] = True
# 源码片段
class Config(dict):
...
class Flask(_PackageBoundObject):
def __init__(self, ...)
config_class = Config
...
self.config = self.make_config(instance_relative_config)
...
def make_config(self, instance_relative=False):
...
return self.config_class(root_path, defaults)
# app.config本质上是字典
# 配置方式二
* settings.py
class Config(object):
DEBUG = False
TESTING = False
class ProductionConfig(Config):
pass
class DevelopmentConfig(Config):
DEBUG = True
class TestingConfig(Config):
TESTING = True
* manage.py
app.config.from_object('settings.Config')
# 源码片段
class Config(dict):
def from_envvar(self, variable_name, silent=False):
...
def from_pyfile(self, filename, silent=False):
...
def from_object(self, obj):
...
def from_json(self, filename, silent=False):
...
def from_mapping(self, *mapping, **kwargs):
...
def get_namespace(self, namespace, lowercase=True, trim_namespace=True):
...
default_config = ImmutableDict({
'ENV': None,
'DEBUG': None,
'TESTING': False,
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'SERVER_NAME': None,
'APPLICATION_ROOT': '/',
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_COOKIE_SAMESITE': None,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': None,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': False,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
'MAX_COOKIE_SIZE': 4093,
})
session
# 默认存在浏览器cookie
###### 操作 ######
# 设置值
session['username'] = request.form.get('username')
# 取值
session.get('username')
# 删除
session.pop('username', None)
del session['username']
###### session登录示例 ######
app.secret_key = 'ret' # 加盐
@app.route('/index/')
def index():
if 'username' in session:
return 'index'
else:
return redirect(url_for('login'))
@app.route('/login/', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
session['username'] = request.form.get('username')
return redirect(url_for('index'))
else:
return '''
<form action='' method='post'>
<input type='text' name='username'/>
<input type='submit' value='Login'/>
</form>
'''
@app.route('/logout/')
def logout():
session.pop('username', None)
return redirect(url_for('login'))
###### session原理 ######
每次请求到来时: flask读取cookie中key为session对应的值,解密反序列化成字典放入内存,以便视图函数使用
每次请求结束时: flask会读取内存中字典的值, 进行序列化加密,写入到用户的cookie中
可在配置文件修改session参数
SESSION_COOKIE_NAME
SESSION_COOKIE_DOMAIN
SESSION_COOKIE_PATH
environ wsgi做了初步封装
1.获取environ并对其进行再次封装
2.从environ中获取名称为session的cookie, 解密,反序列化
3.执行视图函数
4.获取session加密,序列化、写cookie
ctx = self.request_context(environ)
闪现(flask)
# 基于session实现
# 原理:session中存储一个数据,读取时通过pop将数据移除
# 设置值
from flask import flash
flash('0101')
flash('temp date', 'error') # 分类
# 取值
from flask import get_flashed_messages
get_flashed_messages()
get_flashed_messages(category_filter=['error']) # 根据分类取