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

news2024/12/26 0:34:09

文章目录

  • 前言
  • 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 Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

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

2.接收请求数据

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

(1)获取URL参数

flask:

from flask import Flask

app = 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_template

app = 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_template

app = 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 Flask

app = 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_template

app = 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,jsonify

app = 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,Response

app = Flask(__name__)

@app.route('/custom')
def custom_response():
    response = Response('Custom response with headers', status=200)
    response.headers['X-Custom-Header'] = 'Value'
    return response

if __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_response

app = 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 response

if __name__ == '__main__':
    app.run(debug = True)

访问网页:

使用 request 对象:

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

在这里插入图片描述

5.处理错误

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

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

flask:

from flask import Flask

app = Flask(__name__)

@app.route('/divide/<int:x>/<int:y>')
def divide(x, y):
    try:
        result = x / y
        return f'Result: {result}'
    except ZeroDivisionError:
        return 'Error: Division by zero', 400

if __name__ == '__main__':
    app.run(debug = True)

如果除数为0会报错:

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

在这里插入图片描述

(2)全局错误处理

from flask import Flask

app = Flask(__name__)

@app.errorhandler(404)
def not_found(error):
    return 'Page not found', 404

if __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 Flask

app = 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 Flask

app = 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,Response

app = 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.coloradmin.cn/o/2141291.html

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

相关文章

机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

本文参考资料&#xff1a; rviz - ROS 维基 Gazebo : Tutorial : Ubuntu (gazebosim.org) 零. 什么是Rviz和Gazebo&#xff1a; Rviz是一个三维可视化工具&#xff0c;它利用已有的数据将数据可视化&#xff0c;并提供了可以显示图像、模型、表格、路径等信息的插件&#x…

css百分比布局中height:100%不起作用

百分比布局时&#xff0c;我们有时候会遇到给高度 height 设置百分比后无效的情况&#xff0c;而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时&#xff0c;是相对于父元素的高度来计算的。当没有给父元素设置高度&#xff08;height&#xff09;时或设置…

浮点数始末详解|科学计数法、浮点数表示、精度有效值、规格化与非规格化

如果直接看浮点数表示法有点费力或者不好理解&#xff0c;不妨复习一下科学计数法。毕竟我们一直接触十进制&#xff0c;从十进制的角度可能更好理解其特性。 目录 科学计数法 Scientific Notation1. 科学计数法的定义2. 精确度与有效数字3. 转换为科学计数法示例&#xff1a;…

商务人士必备的精准翻译工具盘点

网易翻译是一款我外出游玩时候必备的翻译工具&#xff0c;最近没出去玩但是有更多的翻译需求了&#xff0c;为了方便在电脑上的操作我也找了不少翻译工具&#xff0c;这次一起分享给大家&#xff0c;看看哪款更得你的眼缘。 1.福昕在线翻译 链接直达&#xff1a;https://fany…

集群聊天服务器项目【C++】(六)MySql数据库

前面已经介绍了网络模块和业务模块&#xff0c;本章介绍数据模块&#xff0c;同样保持模块解耦的特性&#xff0c;即业务模块不能出现数据模块内容&#xff0c;如出现SQL语句&#xff0c;接下来看看怎么实现的。 1.环境安装 第一章已经介绍了MySql安装&#xff0c;但注意需要…

基于R语言的统计分析基础:使用SQL语句操作数据集

在使用R语言数据分析时&#xff0c;可以融合SQL语言使数据聚集操作更加便利&#xff0c;同时也可以增加对SQL语句的熟悉。借助sqldf、DBI、RSDLite等包&#xff0c;可以在R环境中直接运用SQL语句&#xff0c;轻松实现数据的分组统计、汇总分析&#xff0c;SQL的强大查询能力简化…

MTC完成右臂抓取放置任务\\放置姿态设置

#include "mtc_tutorial/mtc_glass_bottle.hpp" static const rclcpp::Logger LOGGER rclcpp::get_logger("mtc_glass_right"); // 获取节点基础接口的实现 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr MTCTaskNode_Right::getNodeBaseInterf…

(c++)字符串相加(真没想到字符串还有相加运算)

#include<iostream> #include<string> using namespace std;int main() {string ch1 "你好";string ch2 "再见";string ch3 ch1 ch2;cout << ch3 << endl;system("pause");return 0; } 运行结果&#xff1a; 学了c…

FreeRTOS学习——链表list

FreeRTOS学习——链表&#xff08;列表&#xff09;list&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 参考大佬的好文章&#xff1a; freertos内核原理 Day1(链表) FreeRTOS-链表的源码解析 *list_t只能存储指向list_item_t的指针。每个list_item_t都…

【UE5 C++课程系列笔记】01——Visual Studio环境安装

1. 进入Visual Studio 官网&#xff0c;点击下载 下载社区版即可 下载后点击应用程序开始安装 2. 在“工作负荷”中&#xff0c;勾选如下选项 在“单个组件”中&#xff0c;勾选如下选项&#xff1a; 3. 等待下载安装 4. 安装好后&#xff0c;点击“继续但无需代码” 选择“工具…

《python语言程序设计》2018版第8章17题point类设计一个名为point的类

TypeError: point_class.dis_m() missing 1 required positional argument: ‘y2’ 这段代码为什么出错 一个又一个错误 终于摸到点头绪 #distance方法 我做的叫get_dis_m def get_dis_m(self):a_m self.__x1 - self.__x2b_m self.__y1 - self.__y2return (pow(a_m, 2) po…

k8s中的存储

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

《程序猿之设计模式实战 · 观察者模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

AJAX 进阶 day4

目录 1.同步代码和异步代码 2.回调函数地狱和 Promise 链式调用 2.1 回调函数地狱 2.2 Promise - 链式调用 2.3 Promise 链式应用 3.async 和 await 使用 3.1 async函数和await 3.2 async函数和await_捕获错误 4.事件循环-EventLoop 4.1 事件循环 4.2 宏任务与微任务…

R语言统计分析——散点图1(常规图)

参考资料&#xff1a;R语言实战【第2版】 R语言中创建散点图的基础函数是plot(x,y)&#xff0c;其中&#xff0c;x和y是数值型向量&#xff0c;代表着图形中的&#xff08;x,y&#xff09;坐标点。 attach(mtcars) plot(wt,mpg,main"Basic Scatter plot of MPG vs. Weigh…

数据结构(Day14)

一、学习内容 结构体 概念 引入&#xff1a;定义整数赋值为10 int a10; 定义小数赋值为3.14 float b3.14; 定义5个整数并赋值 int arr[5] {1 , 2 , 3 , 4 ,5}; 定义一个学生并赋值学号姓名成绩 定义一个雪糕并赋值名称产地单价 问题&#xff1a;没有学生、雪糕 数据类型 解决&…

Text2vec -文本转向量

文章目录 一、关于 Text2vec1、Text2vec 是什么2、Features3、Demo4、News5、Evaluation英文匹配数据集的评测结果&#xff1a;中文匹配数据集的评测结果&#xff1a; 6、Release Models 二、Install三、使用1、文本向量表征1.2 Usage (HuggingFace Transformers)1.3 Usage (se…

★ C++进阶篇 ★ 多态

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第一章----多态 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 …

2024/9/16 英语每日一段

Stark argues that, in their gummies, at least,“The total sugar in a serving is less than in half a cherry.”Of course, cherries also provide fibre, vitamin C, and antioxidants--and 14 of them would count as one of your five-a-day. Artificial sweeteners to…

Ubuntu24.04部署docker

1、更新软件 apt update 2、安装curl apt install apt-transport-https curl 3、导入阿里云GPG秘钥 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 4、添加Docker阿里云仓库到Ubuntu 24.04的…