基于菜鸟教程的flask学习记录 —— Flask视图函数

文章目录

  • 前言
  • Flask视图函数
    • 1.定义视图函数
    • 2.接收请求数据
      • (1)获取URL参数
      • (2)获取表单数据
      • (3)获取查询参数
    • 3.返回响应
      • (1)返回字符串
      • (2)返回HTML模板
      • (3)返回JSON数据
      • (4)返回自定义响应对象
    • 4.处理请求和响应
    • 5.处理错误
      • (1)在视图函数中处理错误
      • (2)全局错误处理
    • 6.视图函数的装饰器
    • 7.视图函数返回的状态码
      • (1)指定 HTTP 状态码
      • (2)返回带有状态码的响应对象

前言

最近要写一个简单的前后端程序,所以打算学习flask,发现菜鸟教程写得很有条理,比较清晰,但是缺少了具体的网页。因此我让gpt根据flask代码生成了相应的前端界面,方便前后端交互,更加利于我对flask的学习,在此记录。

本博客是在菜鸟教程的基础上加上前端页面,如有侵权,请私信,我会删除此条博客。

用到的工具:
pycharm社区版

Flask视图函数

1.定义视图函数

视图函数是处理请求并返回响应的核心功能

falsk代码:(app.py)

from flask import Flaskapp = Flask(__name__)@app.route('/')
def home():return 'Hello, World!'

在pycharm运行:
在这里插入图片描述
然后打开网页127.0.0.1:5000:
在这里插入图片描述

2.接收请求数据

使用 request 对象获取 URL 参数、表单数据、查询参数等

(1)获取URL参数

flask:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def home():return 'Hello, World!'@app.route('/greet/<name>')
def greet(name):return f'Hello, {name}!'if __name__ == '__main__':app.run(debug = True)

@app.route(‘/greet/’)中,<name> 是一个 URL 参数,传递到视图函数 greet。

访问网页:127.0.0.1:5000/greet/(随便一个名字),结果如下:

在这里插入图片描述

(2)获取表单数据

项目组织结构:
在这里插入图片描述
flask:(app.py)

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def home():return render_template('hello.html') #使用 Jinja2 模板引擎来渲染 HTML 页面@app.route('/submit', methods=['POST'])
def submit():username = request.form.get('username')return f'Form submitted by {username}!'if __name__ == '__main__':app.run(debug = True)

前端:(hello.html,放在templates文件夹下)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Submit Form</title>
</head>
<body><h1>Submit Form</h1><form action="/submit" method="POST"><label for="username">Username:</label><input type="text" id="username" name="username"><button type="submit">Submit</button></form>
</body>
</html>

访问网页:

在这里插入图片描述

输入Username为sxy后,点击Submit:

在这里插入图片描述

(3)获取查询参数

项目组织结构:
在这里插入图片描述
flask:

from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/')
def home():return render_template('hello.html')@app.route('/search')
def search():query = request.args.get('query')return f'Search results for: {query}'if __name__ == '__main__':app.run(debug = True)

前端:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Submit Form</title>
</head>
<body><h1>Search Form</h1><!-- Search Query Form --><form action="/search" method="GET"><label for="query">Search:</label><input type="text" id="query" name="query"><button type="submit">Search</button></form>
</body>
</html>

访问网页:

在这里插入图片描述
输入sxy后点击Search:

在这里插入图片描述

3.返回响应

可以返回字符串、HTML、JSON 或自定义响应对象。

(1)返回字符串

from flask import Flaskapp = Flask(__name__)@app.route('/message')
def message():return 'This is a simple message.'if __name__ == '__main__':app.run(debug = True)

访问网页:

在这里插入图片描述

(2)返回HTML模板

flask:

from flask import Flask,render_templateapp = Flask(__name__)@app.route('/hello/<name>')
def hello(name):return render_template('hello.html', name=name)if __name__ == '__main__':app.run(debug = True)

前端:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Hello {{ name }}</title>
</head>
<body><h1>Hello, {{ name }}!</h1><p>Welcome to the Flask app.</p>
</body>
</html>

访问网页:

在这里插入图片描述

(3)返回JSON数据

flask:

from flask import Flask,jsonifyapp = Flask(__name__)@app.route('/api/data')
def api_data():data = {'key': 'value'}return jsonify(data)if __name__ == '__main__':app.run(debug = True)

访问网页:

在这里插入图片描述

(4)返回自定义响应对象

flask:

from flask import Flask,Responseapp = Flask(__name__)@app.route('/custom')
def custom_response():response = Response('Custom response with headers', status=200)response.headers['X-Custom-Header'] = 'Value'return responseif __name__ == '__main__':app.run(debug = True)

对上述代码的解释:

response = Response(‘Custom response with headers’, status=200)

Response 是 Flask 提供的类,允许手动构造 HTTP 响应。

‘Custom response with headers’ 是响应的主体内容,即返回给客户端的文本数据。

status=200 是 HTTP 状态码,表示成功处理了请求。可以根据需要修改状态码,例如 404(未找到)、500(服务器错误)等。

response.headers[‘X-Custom-Header’] = ‘Value’

response.headers 是一个字典对象,用于存储 HTTP 响应的头部信息。你可以向它添加或修改头部信息。

X-Custom-Header 是一个自定义的 HTTP 头部名,Value 是它的值。HTTP 头部可以传递额外的元数据,如内容类型、缓存控制信息或任何自定义信息。

自定义的头部通常以 X- 开头,但现代规范允许直接使用有意义的名称。

访问网页:

在这里插入图片描述
查看自定义头部信息:

在这里插入图片描述
此时,若是修改flask中的status为404,再用curl查看:

在这里插入图片描述

4.处理请求和响应

使用 request 对象和 make_response 来处理请求和生成自定义响应。

flask:

from flask import Flask,request,make_responseapp = Flask(__name__)@app.route('/info')
def info():user_agent = request.headers.get('User-Agent')return f'Your user agent is {user_agent}'@app.route('/header')
def custom_header():response = make_response('Response with custom header')response.headers['X-Custom-Header'] = 'Value'return responseif __name__ == '__main__':app.run(debug = True)

访问网页:

使用 request 对象:

在这里插入图片描述
使用 make_response:

在这里插入图片描述

5.处理错误

视图函数内处理异常或使用 Flask 的错误处理机制。

(1)在视图函数中处理错误

flask:

from flask import Flaskapp = Flask(__name__)@app.route('/divide/<int:x>/<int:y>')
def divide(x, y):try:result = x / yreturn f'Result: {result}'except ZeroDivisionError:return 'Error: Division by zero', 400if __name__ == '__main__':app.run(debug = True)

如果除数为0会报错:

在这里插入图片描述
如果除数不为0则不会报错:

在这里插入图片描述

(2)全局错误处理

from flask import Flaskapp = Flask(__name__)@app.errorhandler(404)
def not_found(error):return 'Page not found', 404if __name__ == '__main__':app.run(debug = True)

在这里插入图片描述

6.视图函数的装饰器

使用 @app.before_request、@app.after_request 等装饰器处理请求前后逻辑。

@app.before_request:在每个请求处理之前运行的函数。
@app.after_request:在每个请求处理之后运行的函数。
@app.teardown_request:在请求结束后运行的函数,用于清理工作。

flask:

from flask import Flaskapp = Flask(__name__)@app.before_request
def before_request():print('Before request')@app.after_request
def after_request(response):print('After request')return response@app.teardown_request
def teardown_request(exception):print('Teardown request')@app.route('/')
def home():return 'Hello World'if __name__ == '__main__':app.run(debug = True)

访问网页:
在这里插入图片描述
之后可以在pycharm终端看到输出:

在这里插入图片描述

7.视图函数返回的状态码

可以指定 HTTP 状态码来表示请求的处理结果。

(1)指定 HTTP 状态码

flask:

from flask import Flaskapp = Flask(__name__)@app.route('/status')
def status():return 'Everything is OK', 200@app.route('/')
def home():return 'Hello World'if __name__ == '__main__':app.run(debug = True)

访问网页:

在这里插入图片描述

(2)返回带有状态码的响应对象

flask:

from flask import Flask,Responseapp = Flask(__name__)@app.route('/error')
def error():return Response('An error occurred', status=500)@app.route('/')
def home():return 'Hello World'if __name__ == '__main__':app.run(debug = True)

访问网页:

在这里插入图片描述

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

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

相关文章

为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白

H.266&#xff0c;也被称为Versatile Video Coding&#xff08;VVC&#xff09;&#xff0c;是近年来由MPEG&#xff08;Moving Picture Experts Group&#xff09;和ITU&#xff08;International Telecommunication Union&#xff09;联合开发并发布的新一代国际视频编码标准…

音视频入门基础:AAC专题(6)——FFmpeg源码中解码ADTS格式的AAC的Header的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.aac 可以获取到ADTS格式的AAC裸流的音频采样频率、声道数、采样位数、码率等信息&#xff1a; 在vlc中也可以获取到这些信息&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 所以FFmpeg和vlc是怎样…

C语言 | Leetcode C语言接雨水II

题目&#xff1a; 题解&#xff1a; typedef struct{int row;int column;int height; } Element;struct Pri_Queue; typedef struct Pri_Queue *P_Pri_Queue; typedef Element Datatype;struct Pri_Queue{int n;Datatype *pri_qu; };/*优先队列插入*/ P_Pri_Queue add_pri_que…

视频服务器:GB28181网络视频协议

一、前言 某项目中需要集成视频管理平台&#xff0c;实现分布在各省公司的摄像及接入&#xff0c;对视频进行统一管理。本项目中视频管理平台采用GB/T28181实现的监控设备接入管理平台&#xff0c;支持在开放互联网和局域网对监控设备进行远程接入、远程管理、远程调阅、录像回…

基于 PyQt5 和 OpenCV 进行图像处理操作的GUI工具初版

为了实现一个基于 PyQt5 和 OpenCV 的图形用户界面&#xff08;GUI&#xff09;&#xff0c;要求如下&#xff1a; 左边显示加载的图片。 中间提供各种对图片进行处理的操作方法&#xff08;如灰度化、模糊处理等&#xff09;。 右边显示处理后的效果图。 接下来我将详细讲解如…

PyQt5-loading-圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

Spring IOC的应用

目录 一、IOC基础 1、maven导入spring的 jar包 和 单测包 2、bean的配置 2.1 纯xml模式 2.1.1 xml文件头 2.1.2 实例化Bean的三种方式 2.1.3 Bean的生命周期 2.1.4 Bean标签属性 2.1.5 DI依赖注入的xml配置 2.1.5.1 构造函数注入 2.1.5.2 set方法注入 2.1.5.3 复杂数据类型注入…

【QT】常用控件-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;QComboBox&#x1f449;&#x1f3fb; QSpinBox&#x1f449;&#x1f3fb;QDateTimeEdit&#x1f449;&#x1f3fb;QD…

二叉树OJ题——二叉树的最大深度

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 二叉树的最大深度 二、解题思路 三、解题代码

API - String 和 ArrayList

01 API是什么 答&#xff1a;API 全称 Application Programming Interfaace 应用程序编程接口。就是别人写好的一些程序&#xff0c;我们可以使用它们去解决相关问题。 02 为什么要学API 答&#xff1a;不要重复造轮子。Java已经有20多年的历史了&#xff0c;在这20多年里Ja…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图&#xff1a;这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢&#xff0c;安装过一版最新的android studio&#xff0c;然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候&#xff0c;就报错了&#xff1a; Execution failed…

初探全同态加密1 —— FHE的定义与历史回顾

文章目录 一、加密体系1、什么是加密体系2、加密体系的属性 Properties 二、同态加密&#xff1a;偶然的特殊性质三、同态加密体系的分类四、部分同态加密 Partially Homomorphic Encryption1、加法同态加密算法 —— ElGamal 加密算法1.1、ElGamal 的大致步骤1.2、ElGamal 的加…

7-ZIP工具的功能分享:合并分卷压缩文件

在日常工作中&#xff0c;有些大文件无法单独传输&#xff0c;我们通常会通过压缩拆分成多个分卷文件来完成传输。 当完成传输后&#xff0c;不想要这么多分卷文件的时候&#xff0c;就可以通过7-ZIP工具的合并功能来解决这个问题。下面一起来看看&#xff0c;具体如何操作。 …

Cortex-A7的GIC(通用中断控制器):边沿触发和电平触发中断处理流程

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 边沿触发和电平触发中断处理流程 1.0 边沿触发和电平触发的区别 边沿触发&#xff08;Edge-triggered&#xff09; This is an interrupt that is asserted on detection of…

学习笔记(一)

前言 一、对象 1、由类建模而成&#xff0c;是消息、数据和行为的组合 2、可以接收和发送消息&#xff0c;并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化&#xff1a;把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

node.js+Koa框架+MySQL实现注册登录

完整视频展示&#xff1a;https://item.taobao.com/item.htm?ftt&id831092436619&spma21dvs.23580594.0.0.52de2c1bg9gTfM 效果展示&#xff1a; 一、项目介绍 本项目是基于node.jsKoamysql的注册登录的项目,主要是给才学习node.js和Koa框架的萌新才写的。 二、项目…

Datawhale------Tiny-universe学习笔记——Qwen(1)

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说&#xff0c;猛一听这个名字首先会一懵&#xff1a;Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍&#xff1a;Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)

Pytorch详解-模型模块 Module & parameterModule初认识forward函数 ParameterPytorch中的权重、参数和超参数 Module容器-ContainersSequentialModuleListModuleDictParameterList & ParameterDict 常用网络层LSTM输入和输出 GRUConvolutional Layers卷积层的基本概念常…

第十七节:学习Hutool上传文件(自学Spring boot 3.x的第四天)

这节记录下如何使用Hutool库上传本地的文件到服务器端&#xff08;因为是练习&#xff0c;所以是本地端&#xff09;。 第一步&#xff1a;引入Hutool库最新版本&#xff0c;通过maven方式。&#xff08;最新版本需去maven仓库查询&#xff09; 第二步&#xff1a;编写一个post…