Flask(二) 配置文件和session、闪现

配置文件

# 配置方式一, 直接赋值:
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']) # 根据分类取
posted @ 2018-08-15 21:38  ret  阅读(82)  评论(0)    收藏  举报