session会话
是一种服务器端的会话技术、依赖于cookie
特点:
- 服务端的会话技术
- 所有数据存储在服务器中
- 默认存储在内存中
- 存储结构也是key-value形式的键值对
- session是离不开cookie的Flask中的session是全局对象常用操作:
- 设置seesion:- seesion['key'] = value
- 获取seesion:- seesion.get(key, default=None) #根据键获取会话的值
- 删除seesion:- session.pop(key) 删除某一个值- session.clear() 清除所有的sessioncookie与session的区别:
- cookie- 在浏览器存储- 安全性较低- 可以减轻服务器压力
- seesion:- 在服务器段存储- 安全性高- 对服务器要求较高- 依赖cookie
__init__.py
#__init__.py: 初始化文件、用来创建flask应用
import datetimefrom flask import Flask
from .views import blue #蓝图def create_app():app = Flask(__name__) #创建flask应用#注册蓝图app.register_blueprint(blueprint=blue)# session配置print(app.config)'''<Config {'DEBUG': False, 'TESTING': False, 'PROPAGATE_EXCEPTIONS': None, 'SECRET_KEY': None, 'PERMANENT_SESSION_LIFETIME': datetime.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': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'TRAP_HTTP_EXCEPTIONS': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PREFERRED_URL_SCHEME': 'http', 'TEMPLATES_AUTO_RELOAD': None, 'MAX_COOKIE_SIZE': 4093}>'''# session配置# SECRET_KEY: session加密的密钥 将aa123456作为密钥app.config['SECRET_KEY'] = 'aa123456'app.config['PERMANENT_SESSION_LIFETIME'] = datetime.timedelta(days=8) #session过期时间return app
views.py
# 路由 + 视图函数
import datetimefrom flask import request, redirect, sessionfrom flask import Blueprint, render_template
# from models import *#蓝图
# 创建蓝图对象
# 第一个参数:蓝图的名字
# 第二个参数:蓝图的包名
blue = Blueprint('user', __name__,)#首页
@blue.route('/') # 路由
@blue.route('/home/')
def home():# 获取sessionusername = session.get('user')return render_template('home.html', username=username)#登录页面
@blue.route('/login/', methods=['GET', 'POST'])
def login():# 判断请求方式、如果是get请求,则返回登录页面if request.method == 'GET':return render_template('login.html')# 如果是post请求,则进行登录操作elif request.method == 'POST':pass#1. 获取前端提交的数据username = request.form.get('username') #post提交使用form、这里的username要和html中的name属性一致password = request.form.get('password') #这里的password要和html中的name属性一致#2. 实现登录功能, 验证账号密码是否正确if username == 'xiaoxin' and password == '123456':#登录成功、跳转到首页response = redirect('/home/')# 设置sessionsession['user'] = usernamesession.permanent = True # 设置session的过期时间, 默认是31天、如果__init__.py中设置过,则这里可以不用设置return responseelse:return '登录失败,用户名或密码错误'# 注销
@blue.route('/logout/')
def logout():#先跳转到首页(刷新)response = redirect('/home/')# 删除sessionsession.pop('user')# session.clear() #清除所有的sessionreturn response
home.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr>{% if username %}<p>你已经登录了,欢迎你:{{ username }}</p><a href="/logout/">注销</a>{% else %}{#跳转到登录页面,注意这里要从后端路由去跳转#}<a href="/login/">登录</a>{% endif %}</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body><h2>登录</h2><hr>{#登录表单#}
{# <form action="" method="post">#}
{# <form action="{{ url_for('user.login') }}" method="post">#}<form action="/login/" method="post"><p>用户名:<input type="text" name="username"></p><p>密码:<input type="password" name="password"></p><p><input type="submit" value="登录"></p></form></body>
</html>
app.py
from App import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)