Flask错误处理与会话技术详解

flask入门day03

错误处理

1.abort函数:放弃请求并返回错误代码

详细状态码

from flask import Flask,abort,render_template
​
app = Flask(__name__)
​
@app.route('/')
def index():return '我是首页'
​
@app.route('/error')
def error():abort(404)return '没有找到页面'
​
if __name__ == '__main__':app.run(debug=True,port=8088)

但是以上的方法,页面会直接显示成这样的,用户可能不是很聪明,会以为是网站的问题,为了解决以上的内容,请看下面的讲解

自定义错误处理视图

  • 使用 errorhandler 装饰器,接受一个http状态码为参数。

  • 自定义的错误视图不单单作用于abort函数抛出的错误,也作用于整个Flask应用对应错误码。

  • 自定义错误处理视图接收一个参数,是Flask应用的默认报错信息

from flask import Flask,render_template
​
app = Flask(__name__)
​
@app.route('/')
def index():return '我是首页'
​
@app.errorhandler(404)
def error(e):# 函数里面必须要传入一个参数# 自定义错误处理视图函数# 使用 errorhandler 装饰器,接受一个http状态码为参数。# 自定义的错误视图不单单作用于abort函数抛出的错误,也作用于整个Flask应用对应错误码。# 自定义错误处理视图接收一个参数,是Flask应用的默认报错信息# 可以有多个errorhandler处理不同的错误return render_template('error.html')
​
if __name__ == '__main__':app.run(debug=True,port=8088)

可以制作一个错误显示页面,当用户找不到页面的时候,让他可以跳转回首页

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>页面未找到 - 404错误</title><style>* {margin: 0;padding: 0;box-sizing: border-box;font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;}body {min-height: 100vh;display: flex;justify-content: center;align-items: center;background: #f8f9fa;padding: 20px;color: #333;line-height: 1.6;}.container {text-align: center;max-width: 500px;width: 100%;padding: 40px;background: white;border-radius: 12px;box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);}.error-code {font-size: 7rem;font-weight: 800;color: #6e8efb;margin-bottom: 15px;line-height: 1;}h1 {font-size: 2rem;margin-bottom: 20px;color: #444;}p {font-size: 1.1rem;margin-bottom: 30px;color: #666;}.home-btn {display: inline-block;padding: 14px 40px;background: #6e8efb;color: white;text-decoration: none;border-radius: 6px;font-weight: 600;font-size: 1.1rem;transition: all 0.2s ease;border: 2px solid #6e8efb;margin-top: 20px;}.home-btn:hover {background: white;color: #6e8efb;}.error-icon {font-size: 6rem;color: #6e8efb;margin-bottom: 20px;opacity: 0.8;}.links {display: flex;justify-content: center;gap: 25px;margin-top: 40px;flex-wrap: wrap;}.links a {color: #6e8efb;text-decoration: none;font-weight: 500;}.links a:hover {text-decoration: underline;}@media (max-width: 768px) {.container {padding: 30px 25px;}.error-code {font-size: 5.5rem;}h1 {font-size: 1.7rem;}p {font-size: 1rem;}}@media (max-width: 480px) {.error-code {font-size: 4.5rem;}h1 {font-size: 1.5rem;}.home-btn {padding: 12px 30px;font-size: 1rem;}.links {gap: 15px;}}</style>
</head>
<body><div class="container"><div class="error-icon">❌</div><div class="error-code">404</div><h1>页面未找到</h1><p>您访问的页面可能已被移除或暂时不可用。请检查URL是否正确,或返回首页继续浏览。</p><a href="/" class="home-btn">返回首页</a><div class="links"><a href="#">联系我们</a><a href="#">帮助中心</a><a href="#">网站地图</a></div></div>
</body>
</html>

响应数据

认识响应

视图函数的 return 值会自动转换为一个响应对象。如果返回值是一个字符串, 它被转换为该字符串为主体的、状态码为 200 的 ,MIME 类型是 text/html 的响应对象。

Flask 把返回值转换为响应对象的逻辑:

  • 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。

  • 如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是 (response,status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表元素是元祖或字典,作为额外的消息标头值。

  • 如果返回的是一个合法的响应对象,它会从视图直接返回。

我们之前都是直接返回字符串,Flask会帮我们自动创建response对象。

响应内容可以是列表套元组来构建

from flask import Flask
​
app = Flask(__name__)
​
@app.route('/')
def index():return '我是首页',200,[('subject','python'),( 'chapter', 2)]
​
if __name__ == '__main__':app.run(debug=True,port=8088)

响应也可以是字典的形式构建

from flask import Flask
​
app = Flask(__name__)
​
@app.route('/')
def index():# [('subject','python'),( 'chapter', 2)]return '我是首页',200,{'subject':'python','chapter':'2'}
​
if __name__ == '__main__':app.run(debug=True,port=8088)

查看返回的响应的内容

响应对象

make_response 创建响应对象

@app.route('/')
def index():response = make_response('hello world')# 方式1# response.status_code = 200# 方式2response.status = 200response.headers['subject'] = 'python'return response

返回json数据

在前面内容中我们都是返回字符串,但是很多web开发中都是要求前后端分离的,前端一般会要求后端返回json数据。

在django的学习中我们知道返回json数据有一个JsonResponse对象,接收一个python字典作为参数。Flask中也有一个类似的对象可以返回json数据。

make_response方式返回json对象

from flask import Flask,make_response,json
​
app = Flask(__name__)
​
@app.route('/')
def index():my_dict = {"status":'200',"object":'python'}response = make_response(json.dumps(my_dict),200)response.headers['Content-Type'] = 'application/json'return response
​
if __name__ == '__main__':app.run(debug=True,port=8088)

jsonify: 返回json格式的数据,更加简便

from flask import Flask,jsonify
​
app = Flask(__name__)
​
@app.route('/')
def index():my_dict = {"status":'200',"object":'python'}return jsonify(my_dict)
​
if __name__ == '__main__':app.run(debug=True,port=8088)

Cookie

设置cookie

cookie 是以键值对的形式保存在浏览器中。

设置cookie我们比较关心的三个参数:

key cookie的键

value cookie的值

max_age=None 超时时间,单位是秒

expires=None 超时时间,datatime对象

from flask import Flask,make_response
​
app = Flask(__name__)
​
@app.route('/')
def index():response = make_response('设置Cookie')response.status_code = 200# 设置Cookie,键为name,值为python,存活时间为10秒response.set_cookie('name','python',max_age=10)return response
if __name__ == '__main__':app.run(debug=True,port=8088)

在浏览器控制台的缓存中,查看cookie值

获取cookie

@app.route('/getcookie')
def get_cookie():cookie = request.cookies.get('name','Not Font')return cookie

删除cookie

@app.route('/delcookie')
def del_cookie():response = make_response('删除cookie')response.delete_cookie('name')return response

Session

在Flask中,我们并没有数据库配置,实际上Flask的session是基于cookie加secret_key 进行加密后保存在cookie中的。

设置session

from flask import Flask,session
import os
app = Flask(__name__)
# 设置session要生成密钥SECRET_KEY
app.config['SECRET_KEY'] = os.urandom(24)
@app.route('/setcookie')
def set_cookie():session['myname'] = 'python'session['password'] = '123456'return 'session'
​
if __name__ == '__main__':app.run(debug=True,port=8088)

获取session

@app.route('/getsession')
def get_session():# 获取session采用[key]方式取值,如果key不存在会报错。myname = session['myname']# 获取session 采用get方式取值,如果key不存在返回Nonepassword = session.get('password',"none")return f'myname:{myname},password:{password}'

删除session

可以直接使用session.pop('key',None):

session.pop('name',None)

如果要删除session中所有数据使用:clear():

session.clear()

@app.route('/delsession')
def del_session():# 删除key为mynamesession.pop('myname',None)# 删除所有的session.clear()return '删除session'

设置session过期时间

Flask的默认session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后编码(base64),放到cookie里了。

过期时间是通过cookie的过期时间实现的。

为了防止cookie内容被篡改,session会自动打上一个叫session的hash串,这个串是经过session内容、SECRET_KEY计算出来的,看得出,这种设计虽然不能保证session里的内容不泄露,但至少防止了不被篡改。

过期时间是这样来设置:

from datetime import timedelta
app = Flask(__name__)
session.permanent = True
# session过期时间设置为5分钟
app.permanent_session_lifetime = timedelta(minutes=5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93213.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java程序打包成exe,再打成安装包,没有jdk环境下可运行

一、前提条件准备&#xff1a;1、要被打包的程序文件&#xff1a;rest_assistant-1.0-SNAPSHOT.jarapplication.yml2、图标文件tubiao123.ico3、jre4、打包成exe的软件 config.exe4j5、打成安装包的软件 Inno Setup Compiler二、config.exe4j 的 exe打包配置步骤 按照以下图进行…

区块链技术原理(11)-以太坊交易

文章目录什么是交易&#xff1f;交易类型交易生命周期关键概念&#xff1a;Gas 与交易费用交易状态与失败原因总结什么是交易&#xff1f; “交易&#xff08;Transaction&#xff09;” 是从一个账户向另一个账户发送的经过数字签名的指令 。例如&#xff0c;如果 Bob 发送 A…

小兔鲜儿-小程序uni-app(二)

小兔鲜儿-小程序uni-app7.小兔鲜儿 - 用户模块会员中心页(我的)静态结构参考代码会员设置页分包预下载静态结构退出登录会员信息页静态结构获取会员信息渲染会员信息更新会员头像更新表单信息8.小兔鲜儿 - 地址模块准备工作静态结构地址管理页地址表单页动态设置标题新建地址页…

BLE 广播信道与数据信道:冲突避免、信道映射与自适应跳频实现

低功耗蓝牙(BLE)技术凭借低功耗、短距离、低成本的特性,已广泛应用于智能家居、可穿戴设备、工业物联网等领域。在 BLE 协议中,信道管理是保障通信可靠性的核心机制,其中广播信道与数据信道的设计、冲突避免策略、跳频技术更是面试中的高频考点。本文将从基础原理到实战真…

nodejs03-常用模块

nodejs 常用的核心模块 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c; 它允许 JavaScript 运行在服务器端。Node.js 拥有丰富的标准库&#xff0c;也就是核心模块&#xff0c; 这些模块提供了各种功能&#xff0c; 使得开发服务器端应用程序变得简单高…

多路混音声音播放芯片型号推荐

以下是唯创知音旗下主流的多路声音播放芯片深度解析&#xff0c;结合精准参数、丰富场景及技术特性&#xff0c;满足智能设备多样化音频需求&#xff1a;一、WTV380/890 系列&#xff1a;高集成多模态交互芯片核心参数通道能力&#xff1a;支持8 路独立语音输出&#xff0c;可同…

【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey&#xff1a;倒位序 逐级蝶形&#xff0c;入口 fft(int N, complex f[])”拆成三件事它在讲什么 “基 2 Cooley–Tukey” 指的是最常见的 FFT 算法&#xff1a;长度 N 必须是 2 的整数次幂&#xff0c;把离散傅里叶变换分解成一层一层的“2 点蝶形”运…

小白挑战一周上架元服务——ArkUI04

文章目录前言一、ArkUI是何方神圣&#xff1f;二、声明式UI三、组件1.基础组件2.布局容器组件3.导航组件4.自定义组件5.组件生命周期四、状态管理1.State装饰器: 状态变量2.Prop装饰器&#xff1a;父子单向同步3.Link装饰器&#xff1a;父子双向同步4.Provide/Consume装饰器&am…

剧本杀小程序系统开发:构建剧本杀社交新生态

在社交需求日益多样化的今天&#xff0c;剧本杀凭借其独特的社交属性&#xff0c;成为了人们热衷的社交娱乐方式之一。而剧本杀小程序系统开发&#xff0c;则进一步拓展了剧本杀的社交边界&#xff0c;构建起一个全新的剧本杀社交新生态&#xff0c;让玩家在推理与角色扮演中&a…

AI提高投放效率的核心策略

内容概要人工智能技术正深刻改变着广告投放领域&#xff0c;其核心价值在于显著提升投放效率。通过融合智能算法优化、实时数据分析与自动化投放流程&#xff0c;AI系统能够以前所未有的速度和精度处理海量信息&#xff0c;驱动更精准的营销决策。这不仅大幅缩短了传统人工操作…

OpenBMC 中命令模式的深度解析:从原理到实现

引言 在 OpenBMC 的设计中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;被广泛应用于各种场景&#xff0c;特别是 IPMI 命令处理、异步操作封装和用户请求管理等。本文将深入分析 OpenBMC 中命令模式的实现原理、架构设计以及完整的执行流程&#xff0c;并通过…

从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.15

第十七天 第五十七&#xff0c;五十八&#xff0c;五十九和六十集 第五十六集 删除链表结点 没什么好说的关键部分代码如图 链表的插入操作 依旧没有啥可以说的代码部分大家看视频就能看懂&#xff0c;大家应该是没有什么问题的吧&#xff1f; 第五十七集 共用体形式结构与结构…

云服务器网站无法访问的系统化故障排查指南及多维度解决方案

当云服务器上的网站突然无法访问时&#xff0c;这种突发状况往往让人措手不及。别担心&#xff0c;我们可以通过系统化的排查流程快速定位问题根源。以下是经过实战验证的故障排除指南&#xff0c;帮您分步解决网站访问异常问题。一、基础状态确认 服务器的生命体征就像人体的脉…

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有权利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …

C语言:指针(5)

1. sizeof与strlen的对比1.1 sizeofsizeof属于是操作符&#xff0c;用于计算变量所占的空间大小&#xff0c;单位为字节。如果操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。sizeof只计算数据在内存中所占的空间大小&#xff0c;而不在乎内存中存…

rent8 安装部署教程之 Windows

1. Apache 安装与配置 1.1. 获取并解压 Apache 在 Apache Lounge 网址下载编译版的 Apache。下载完成后&#xff0c;将压缩包解压到 d:\web\Apache24 作为 Apache 的安装目录。 1.2. 配置 Apache 打开配置文件 conf\httpd.conf&#xff0c;找到第 37 行配置。 ​ Define SRVROO…

边缘智能实战手册:攻克IoT应用三大挑战的AI战术

前言&#xff1a;在当前的AIoT&#xff08;人工智能物联网&#xff09;赛道上&#xff0c;将AI能力下沉至边缘设备已不再是“要不要做”的选择题&#xff0c;而是“如何做好”的必答题。然而&#xff0c;在实际项目中&#xff0c;工程师们常常会遇到性能、功耗和隐私这“三座大…

【React】use-immer vs 原生 Hook:谁更胜一筹?

1.概述 use-immer 不属于官方 Hook&#xff0c;是社区维护的第三方库&#xff01;use-immer 通过封装 Immer 的不可变更新机制&#xff0c;为 React 开发者提供了一种更直观、高效的状态管理方式。它尤其适合处理复杂嵌套状态或需要频繁更新的场景&#xff0c;同时保持了与 Re…

【案例】Vue3 实现高性能级横向循环滚动生产线效果:基于 requestAnimationFrame 的流畅动画方案

动画效果在工业监控系统、生产看板等场景中&#xff0c;经常需要模拟生产线的动态运行效果。本文将基于 Vue3 和 requestAnimationFrame 实现一个高性能的横向循环滚动效果&#xff0c;完美模拟生产线传输带的视觉体验。我们将从代码实现到原理分析&#xff0c;全面讲解如何打造…

万字长文解码如何玩转Prompt(附实践应用)

在AI技术迅猛发展的今天&#xff0c;如何与大型语言模型高效“对话”已成为释放其潜力的关键。本文深入探讨了提示词工程&#xff08;Prompt Engineering&#xff09;这一新兴领域&#xff0c;系统解析了从基础概念到高级技巧的完整知识体系&#xff0c;并结合“淘宝XX业务数科…