网站域名查询ip地址,宁波h5网站建设,长沙网站设计的公司,梁山网站建设哪家好文章目录 Flask准备创建flask项目flask加载项目配置的二种方式 路由的基本定义接收任意路由参数接收限定类型参数自定义路由参数转换器 终端运行Flask项目http的请求与响应flask的生命周期请求获取请求中各项数据获取请求URL参数获取请求体获取请求头相关信息 响应响应html文本… 文章目录 Flask准备创建flask项目flask加载项目配置的二种方式 路由的基本定义接收任意路由参数接收限定类型参数自定义路由参数转换器 终端运行Flask项目http的请求与响应flask的生命周期请求获取请求中各项数据获取请求URL参数获取请求体获取请求头相关信息 响应响应html文本返回JSON数据重定向重定向到自己写的视图函数重定向到带有路径参数的视图函数 自定义状态码和响应头 http的会话控制Cookie设置cookie获取cookie删除cookie Session设置session获取session删除session Flask
Flask诞生于2010年是Armin ronacher阿明·罗纳彻用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。
Flask 本身相当于一个内核其他几乎所有的功能都要用到扩展邮件扩展Flask-Mail用户认证Flask-Login数据库Flask-SQLAlchemy都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具文件上传、身份验证等。Flask 没有默认使用的数据库你可以选择 MySQL也可以用 NoSQL。
flask的 WSGI 工具箱采用 Werkzeug路由模块模板引擎则使用 Jinja2。Itsdangroustoken加密模块Click(终端命令管理工具)flask内核本身这5个核心模块组成 Flask 框架。
官网: https://flask.palletsprojects.com/en/2.0.x/
官方文档: https://dormousehole.readthedocs.io/en/latest/index.html
Flask常用第三方扩展包
Flask-SQLAlchemy操作数据库,ORMFlask-script终端脚本工具脚手架 ( 淘汰官方内置脚手架Click)Flask-migrate管理迁移数据库Flask-SessionSession存储方式指定Flask-Mail邮件Flask-Login认证用户状态django内置Auth模块用于实现用户登录退出Flask-OpenID认证, OAuth三方授权Flask-RESTful开发REST API的工具Flask JSON-RPC: 开发json-rpc远程服务[过程]调用Flask-Bable提供国际化和本地化支持翻译Flask-Moment本地化日期和时间Flask-Admin简单而可扩展的管理接口的框架Flask-Bootstrap集成前端Twitter Bootstrap框架前后端分离除了admin站点基本不用这玩意Flask-WTF表单生成模块前后端分离除了admin站点基本不用这玩意Flask-Marshmallow序列化类似djangorestframework的序列化器
可以通过 https://pypi.org/search/?cFramework%3A%3AFlask 查看更多flask官方推荐的扩展
准备
# anaconda创建虚拟环境
conda create -n flask python3.9
# 进入/切换到指定名称的虚拟环境如果不带任何参数则默认回到全局环境base中。
# conda activate 虚拟环境名称
conda activate flask
# 退出当前虚拟环境
conda deactivate安装flask则以下命令
pip install flask -i https://pypi.douban.com/simple创建flask项目
与django不同,flask不会提供任何的自动操作所以需要手动创建项目目录,需要手动创建启动项目的管理文件
例如,创建项目目录 flaskdemo,在目录中创建manage.py.在pycharm中打开项目并指定上面创建的虚拟环境 创建一个flask框架的启动入口文件。名字可以是app.py/run.py/main.py/index.py/manage.py/start.py
manage.py代码
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)# 4. 可以通过实例对象app提供的route路由装饰器绑定视图与uri地址的关系
app.route(/)
def index():# 5. 默认flask支持函数式视图视图的函数名不能重复否则报错# 视图的返回值将被flask包装成响应对象的HTML文档内容返回给客户端。return h1hello flask/h1if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000, debugTrue)代码分析:
# 导入Flask类
from flask import Flask
Flask类的实例化参数
import_name Flask程序所在的包(模块)传 __name__ 就可以其可以决定 Flask 在访问静态文件时查找的路径
static_path 静态文件存储访问路径(不推荐使用使用 static_url_path 代替)
static_url_path 静态文件的url访问路径可以不传默认为/ static_folder
static_folder 静态文件存储的文件夹可以不传默认为 static
template_folder 模板文件存储的文件夹可以不传默认为 templatesapp Flask(__name__)# 编写路由视图
# flask的路由是通过给视图添加装饰器的方式进行编写的。当然也可以分离到另一个文件中。
# flask的视图函数flask中默认允许通过return返回html格式数据给客户端。
app.route(/)
def index():# 返回值如果是字符串被自动作为参数传递给response对象进行实例化返回客户端return h1hello flask/h1# 指定服务器IP和端口
if __name__ __main__:# 运行flaskapp.run(host0.0.0.0, port5000, debugTrue)flask加载项目配置的二种方式
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)第一种flask项目加载站点配置的方式
# app.config[配置项] 配置项值
# app.config[DEBUG] False第二种flask项目加载站点配置的方式
# app.config是整个flask项目默认的配置属性里面包含了所有的可用配置项配置项的属性名都是大写字母或大小字母下划线组成
config {DEBUG: True
}
app.config.update(config)# 4. 可以通过实例对象app提供的route路由装饰器绑定视图与url地址的关系
app.route(/)
def index():# 5. 默认flask支持函数式视图视图的函数名不能重复否则报错# 视图的返回值将被flask包装成响应对象的HTML文档内容返回给客户端。return h1hello flask/h1if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000)路由的基本定义
路由和视图的名称必须全局唯一不能出现重复否则报错。
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)# 开启debug模式
app.config[DEBUG] True# 参数1rule设置当前视图的路由地址
# 参数2methods设置当前视图的HTTP请求方法允许一个或多个方法不区分大小写
app.route(rule/, methods[get, post])
def index():return h1hello flask1/h1if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000)什么是路由
路由就是一种映射关系。是绑定应用程序视图和url地址的一种一对一的映射关系我们在开发过程中编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类这个类一般就是路由类简称路由。
flask中url可以传递路由参数有2种方式
路由参数就是url路径的一部分。
接收任意路由参数
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)# 开启debug模式
app.config[DEBUG] Trueapp.route(rule/, methods[get, post])
def index():return h1hello flask1/h1
路由参数的传递
小括号圈住里面写上参数变量名
在视图中即可通过参数列表按命名来接收
接收参数时如果没有在设置路由中设置参数的类型则默认参数类型为字符串类型app.route(/goods/cid/gid)
def goods(gid, cid):print(gid, type(gid))print(cid, type(cid))return f显示cid{cid},gid{gid}的商品信息if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000)接收限定类型参数
限定路由参数的类型flask系统自带转换器编写在werkzeug/routing/converters.py文件中。底部可以看到以下字典
# converters用于对路由中的参数进行格式转换与类型限定的
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] {default: UnicodeConverter, # 默认类型也就是stringstring: UnicodeConverter, # 字符串不包含 /any: AnyConverter, # 任意类型path: PathConverter, # 也是字符串但是包含了 /int: IntegerConverter,float: FloatConverter,uuid: UUIDConverter,
}系统自带的转换器具体使用方式在每种转换器的注释代码中有写请留意每种转换器初始化的参数。
转换器名称描述string默认类型接受不带斜杠的任何文本int接受正整数float接受正浮点值path接收string但也接受斜线uuid接受UUID通用唯一识别码字符串 xxxx-xxxx-xxxxx-xxxxx
代码
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)# 开启debug模式
app.config[DEBUG] Trueapp.route(rule/, methods[get, post])
def index():return h1hello flask1/h1
通过路由转换器来对路由参数显示格式转换和限制类型app.route(/goods/float:cid/uuid:gid)
def goods(gid, cid):print(gid, type(gid))print(cid, type(cid))return f显示cid{cid},gid{gid}的商品信息if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000)
自定义路由参数转换器
也叫正则匹配路由参数.
在 web 开发中可能会出现限制用户访问规则的场景那么这个时候就需要用到正则匹配根据自己的规则去限定请求参数再进行访问
具体实现步骤为
导入转换器基类BaseConverter在 Flask 中所有的路由的匹配规则都是使用转换器对象进行记录自定义转换器自定义类继承于转换器基类BaseConverter添加转换器到默认的转换器字典DEFAULT_CONVERTERS中使用自定义转换器实现自定义匹配规则
代码实现
导入转换器基类
from werkzeug.routing.converters import BaseConverter自定义转换器
class RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex args[0]
添加转换器到默认的转换器字典中并指定转换器使用时名字为: re
app.url_map.converters[re] RegexConverter使用转换器去实现自定义匹配规则当前此处定义的规则是手机号码 自定义路由转换[在实际项目开发中我们会单独准备一个python文件来保存转换器的定义代码]from werkzeug.routing.converters import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex args[0]app.url_map.converters[re] RegexConverterapp.route(/sms/re(1[3-9]\d{9}):mobile)
def sms(mobile):return f发送短信给手机号{mobile}的用户app.route(/goods/re(\d):id)
def goods(id):return f显示商品id{id}的信息运行测试http://127.0.0.1:5000/sms/13012345671 如果访问的url不符合规则会提示找不到页面
manage.py课堂代码
# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app Flask(__name__)# 开启debug模式
app.config[DEBUG] True
自定义路由转换[在实际项目开发中我们会单独准备一个python文件来保存转换器的定义代码]from werkzeug.routing.converters import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex args[0]app.url_map.converters[re] RegexConverterapp.route(/sms/re(1[3-9]\d{9}):mobile)
def sms(mobile):return f发送短信给手机号{mobile}的用户app.route(/goods/re(\d):id)
def goods(id):return f显示商品id{id}的信息if __name__ __main__:# 3. 运行flask提供的测试web服务器程序app.run(host0.0.0.0, port5000)终端运行Flask项目
# 如果要基于开发环境在终端启动项目设置环境变量如下
export FLASK_DEBUGTrue
# 如果要基于生产环境在终端启动项目设置环境变量如下
# export FLASK_DEBUGFlase# windows
$env:FLASK_DEBUGTrue# 找到创建flask应用的模块路径例如manage.py
# 则ubuntu等Linux下的终端
export FLASK_APPmanage.py # 这是临时设置如果有永久设置可以通过/etc/profile保存
# 2. 在当前虚拟环境中如果安装了flask模块则可以使用全局命令flask run即可运行flask项目
flask run # 采用默认的127.0.0.1 和 5000端口运行项目
flask run --host0.0.0.0 --port8088 # 可以改绑定域名IP和端口http的请求与响应
flask的生命周期
客户端—wsgi应用程序-全局钩子– 路由 -- 视图 -- 路由— 全局钩子 — wsgi应用程序— 客户端 请求
文档: https://flask.palletsprojects.com/en/2.0.x/api/#flask.Request
requestflask中代表当前请求的 request 对象作用在视图函数中取出本次客户端的请求数据导入from flask import request代码位置 代理类 from flask.app import Request — from flask.globals.Request 源码类from flask.wrappers.Request 基类from werkzeug.wrappers import Request as RequestBase
request常用的属性如下
属性说明类型data记录请求体的数据并转换为字符串只要是通过其他属性无法识别转换的请求体数据最终都是保留到data属性中例如有些公司开发微信小程序原生IOS或者安卓这一类客户端有时候发送过来的数据就不一样是普通的表单查询字符串或ajaxbytes类型form记录请求中的html表单数据ImmutableMultiDictargs记录请求中的查询字符串,也可以是query_stringImmutableMultiDictcookies记录请求中的cookie信息Dictheaders记录请求中的请求头ImmutableMultiDictmethod记录请求使用的HTTP方法GET/POSTurl记录请求的URL地址stringfiles记录请求上传的文件列表ImmutableMultiDictjson记录ajax请求的json数据Dict
获取请求中各项数据
获取请求URL参数
from flask import Flask, request
from flask.app import requestapp Flask(__name__)# http://127.0.0.1:5000/qs?a1a2namedpt
app.route(rule/qs)
def hello_world():print(request.query_string) # ba1a2namedpt ---- bit类型print(request.args) # ImmutableMultiDict([(a, 1), (a, 2), (name, dpt)]) ---- ImmutableMultiDict类型print(request.args[name]) # dptprint(request.args[a]) # 1print(request.args.get(a)) # 1print(request.args.getlist(a)) # [1, 2]print(dir(request))[__annotations__, __class__, __delattr__, __dict__, __dir__, __doc__, __enter__, __eq__, __exit__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __init_subclass__, __le__, __lt__, __module__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __sizeof__, __str__, __subclasshook__, __weakref__, _cached_json, _get_file_stream, _get_stream_for_parsing, _load_form_data, _parse_content_type, accept_charsets, accept_encodings, accept_languages, accept_mimetypes, access_control_request_headers, access_control_request_method, access_route, application, args, authorization, base_url, blueprint, blueprints, cache_control, close, content_encoding, content_length, content_md5, content_type, cookies, data, date, dict_storage_class, endpoint, environ, files, form, form_data_parser_class, from_values, full_path, get_data, get_json, headers, host, host_url, if_match, if_modified_since, if_none_match, if_range, if_unmodified_since, input_stream, is_json, is_multiprocess, is_multithread, is_run_once, is_secure, json, json_module, list_storage_class, make_form_data_parser, max_content_length, max_form_memory_size, max_form_parts, max_forwards, method, mimetype, mimetype_params, on_json_loading_failed, origin, parameter_storage_class, path, pragma, query_string, range, referrer, remote_addr, remote_user, root_path, root_url, routing_exception, scheme, script_root, server, shallow, stream, trusted_hosts, url, url_root, url_rule, user_agent, user_agent_class, values, view_args, want_form_data_parsed]return Hello World!if __name__ __main__:app.run()
获取请求体
from flask import Flask, request# 项目实例应用对象
app Flask(__name__)# 在http的常用请求方法中delete和get是没有请求体的
app.route(rule/test, methods[post, put, patch])
def test():获取请求体# 获取原生的请求体数据[当request对象的其他属性没法接受请求体数据时会把数据保留在data中如果有request对象的属性处理了请求体数据则data就不再保留]# print(request.data) # 如果客户端上传的是xml文档html格式二进制流格式base64格式就要使用data来接收接收表单上传的数据# print(request.form) # ImmutableMultiDict([(name, dpt), (age, 20), (hoppy, 篮球), (hoppy, 游泳)])接收ajax上传的json数据# print(request.json) # {username: xiaoming, age: 16}# print(request.is_json) # True 往往用于判断是否是ajax请求接收file数据# 上传文件列表 HTML必须以form methodpost enctypemultipart/form-data # 表单属性才能上传文件# ImmutableMultiDict([(images, FileStorage: 80b856734cb03f1c9876073705805e3b_1.jpg (image/jpeg))])# print(request.files)# avatar request.files.get(avatar)# print(type(avatar)) # class werkzeug.datastructures.file_storage.FileStorage# avatar.save(dst./avatar.jpg) # 直接通过FileStorage来保存文件return 获取请求体if __name__ __main__:app.run()
获取请求头相关信息
from flask import Flask, request# 项目实例应用对象
app Flask(__name__)# 在http的常用请求方法中delete和get是没有请求体的
app.route(rule/test, methods[post, put, patch])
def test():获取请求头信息print(request.headers) # 获取全部的而请求头信息print(request.headers.get(User-Agent))print(request.user_agent) # 用户访问服务器时使用的网络代理一般就是浏览器标记信息PostmanRuntime/7.26.10print(request.headers.get(Host)) # 127.0.0.1:5000客户端请求地址也相当于服务器地址print(request.remote_addr) # 客户端远程地址print(request.server) # 服务端的端点格式(IP, 端口)# 获取请求方法print(request.method) # POST# 本次请求的url地址print(request.url) # http://127.0.0.1:5000/dataprint(request.root_url)print(request.path)# 获取客户端发送过来的自定义请求头print(request.headers.get(company)) # beijing不存在的键的结果None存在则得到就是值print(request.headers.get(token)) # jwt...xxx# 环境变量print(request.environ)return 获取请求头参数if __name__ __main__:app.run()响应
flask默认支持2种响应方式:
数据响应: 默认响应html文本,也可以返回 JSON格式,或其他格式
页面响应: 重定向
url_for 视图之间的跳转
响应的时候,flask也支持自定义http响应状态码
响应html文本
from flask import Flask,make_response, Responseapp Flask(__name__)app.config.update({DEBUG: True
})app.route(/)
def index():# 默认返回的就是HTML代码在flask内部调用视图时得到的返回值会被flask判断类型# 如果类型不是response对象则视图的返回值会被作为response对象的实例参数返回客户端# return h1hello/h1, 400, {company: python}# return make_response(h1hello/h1, 400, {company: python})return Response(f默认首页, 201, {company: python})if __name__ __main__:app.run()返回JSON数据
在 Flask 中可以直接使用 jsonify 生成一个 JSON 的响应
from flask import Flask, jsonify
from decimal import Decimal
app Flask(__name__)app.config.update({DEBUG: True,JSONIFY_PRETTYPRINT_REGULAR: False,
})app.route(/)
def index():# 返回json格式数据返回json字典# data {name:xiaoming,age:16}# return data# 返回json格式数据返回各种json数据包括列表data [{id: 1, username: liulaoshi, age: 18},{id: 2, username: liulaoshi, age: 17},{id: 3, username: liulaoshi, age: 16},{id: 4, username: 小明, age: Decimal(15)},]return jsonify(data)if __name__ __main__:app.run()flask中返回json 数据,都是flask的jsonify方法返回就可以了直接return只能返回字典格式的json数据。
重定向
重定向到站点地址
from flask import Flask, redirect# 应用实例对象
app Flask(__name__)app.route(/)
def index():页面跳转301: 永久重定向页面已经没有了站点没有了永久转移了。302临时重定向一般验证失败、访问需要权限的页面进行登录跳转时都是属于临时跳转。# redirect函数就是response对象的页面跳转的封装# response redirect(http://www.qq.com, 302)# redirect的原理最终还是借助Resonse对象来实现response , 302, {Location: http://www.163.com}return responseif __name__ __main__:# 启动项目的web应用程序app.run(host0.0.0.0, port5000, debugTrue)重定向到自己写的视图函数
可以直接填写自己 url 路径
也可以使用 url_for 生成指定视图函数所对应的 url
from flask import url_for
app.route(/info)
def info():return infoapp.route(/user)
def user():url url_for(info)print(url)return redirect(url)重定向到带有路径参数的视图函数
在 url_for 函数中传入参数
from flask import Flask, redirect, url_for# 应用实例对象
app Flask(__name__)app.route(/demo/int:mob)
def mobile(mob):print(mob)return fmobile{mob}app.route(/sms)
def sms():携带路径参数进行站内跳转# url_for(视图方法名, 路由路径参数)url url_for(mobile, mob13312345678)print(url)return redirect(url)if __name__ __main__:# 启动项目的web应用程序app.run(host0.0.0.0, port5000, debugTrue)自定义状态码和响应头
在 Flask 中可以很方便的返回自定义状态码以实现不符合 http 协议的状态码例如status code: 666
from flask import Flask, redirect, url_for, make_response, Response# 应用实例对象
app Flask(__name__)app.route(/rep)
def rep():常用以下写法return ok, 201, {Company:python-35}# 原理# response make_response(ok, 201, {Company: python-35})# return response## 原理# response Response(ok)# response.headers[Company] oldboy # 自定义响应头# response.status_code 201 # 自定义响应状态码# return responseif __name__ __main__:# 启动项目的web应用程序app.run(host0.0.0.0, port5000, debugTrue)
http的会话控制
所谓的会话session就是客户端浏览器和服务端网站之间一次完整的交互过程.
会话的开始是在用户通过浏览器第一次访问服务端网站开始.
会话的结束时在用户通过关闭浏览器以后与服务端断开.
所谓的会话控制就是在客户端浏览器和服务端网站之间进行多次http请求响应之间记录、跟踪和识别用户的信息而已。
为什么要有会话控制因为 http 是一种无状态协议浏览器请求服务器是无状态的。
无状态指一次用户请求时浏览器、服务器无法知道之前这个用户做过什么对于服务端而言客户端的每次请求都是一次新的请求。
无状态原因浏览器与服务器是使用 socket 套接字进行通信的服务器将请求结果返回给浏览器之后会关闭当前的 socket 连接而且客户端也会在处理页面完毕之后销毁页面对象。
有时需要保持下来用户浏览的状态比如用户是否登录过浏览过哪些商品等
实现状态保持主要有两种方式
在客户端存储信息使用Cookie(废弃)token[jwt,oauth]在服务器端存储信息使用Session数据库
Cookie
Cookie是由服务器端生成发送给客户端浏览器浏览器会将Cookie的key/value保存下次请求同一网站时就随着请求头自动发送该Cookie给服务器前提是浏览器设置为启用cookie。Cookie的key/value可以由服务器端自己定义。
使用场景: 登录状态, 浏览历史, 网站足迹,购物车 [不登录也可以使用购物车]
Cookie是存储在浏览器中的一段纯文本信息建议不要存储敏感信息如密码因为电脑上的浏览器可能被其它人使用
Cookie基于域名安全不同域名的Cookie是不能互相访问的
如访问fuguang.com时向浏览器中写了Cookie信息使用同一浏览器访问baidu.com时无法访问到fuguang.com写的Cookie信息只能获取到baidu.com的Cookie信息。
浏览器的同源策略针对cookie也有限制作用.
当浏览器请求某网站时浏览器会自动将本网站下所有Cookie信息随着http请求头提交给服务器所以在request中可以读取Cookie信息 设置cookie
设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。
app.route(/set_cookie)
def set_cookie():设置cookie通过response传递到客户端进行保存response make_response(默认首页)response.set_cookie(username, xiaoming) # session会话期有效关闭浏览器后当前cookie就会被删除response.set_cookie(user, xiaoming, max_age30 ) # 指定有效时间过期以后浏览器删除cookiemax_age150秒return response获取cookie
app.route(/get_cookie)
def get_cookie():获取来自客户端的cookieprint(request.cookies) # ImmutableMultiDict([])username request.cookies.get(username) # 没有值则返回Noneuser request.cookies.get(user) # 没有值则返回Noneprint(fusername{username},user{user}) # usernamexiaoming,userxiaomingreturn get cookie删除cookie
app.route(/del_cookie)
def del_cookie():删除cookie重新设置cookie的时间让浏览器自己根据有效期来删除response make_response(del cookie)# cookie是保存在客户端的所以不能在服务端删除cookie# 删除操作肯定是在浏览器完成的所以我们重置下cookie名称的对饮有效时间为0此时cookie的值已经不重要了。response.set_cookie(user, , max_age0)response.set_cookie(username, , max_age0)return responseSession
对于敏感、重要的信息建议要存储在服务器端不能存储在浏览器中如手机号、验证码等信息
在服务器端进行状态保持的方案就是Session
Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。名字一般叫sessionid
flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错.
如果将来希望session的生命周期延长可以通过修改cookie中的sessionID的有效期来完成配置。注意一般框架都是把session数据保存到服务端但是flask里面的session是基于token方式存储在客户端的并没有安装传统的方式保存在服务端的文件中。 session的ID存在有效期的默认是会话期会话结束了session_id就废弃了。
设置session
app.route(/set_session)
def set_session():设置sessionsession[username] xiaomingsession[info] {name: xiaohong,age: 16,}return set_session可以通过客户端浏览器中的sessionid观察其实默认情况下flask中的session数据会被加密保存到cookie中的。当然将来我们可以采用flask-session第三方模块把数据转存到其他的存储设备例如redis或者mysql中。
获取session
app.route(/get_session)
def get_session():获取sessionprint(session.get(username))print(session.get(info))return get session删除session
app.route(/del_session)
def del_session():删除session键如果不存在则会抛出异常所以删除之前需要判断键是否存在。if username in session:session.pop(username)if info in session:session.pop(info)return del_session使用过程中session是依赖于Cookie的所以当cookie在客户端被删除时对应的session就无法被使用了。 若有错误与不足请指出关注DPT一起进步吧