当前位置: 首页 > news >正文

基于菜鸟教程的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)

访问网页:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 零基础考过软考信息系统项目管理师经验分享
  • saltstack高级用法
  • MATLAB基础:5脚本与函数
  • 鸿萌数据恢复服务:Synology Hybrid RAID 的容错、优势和数据恢复
  • 【Java算法】二叉树的深搜
  • 数据结构修炼——顺序表和链表的区别与联系
  • 【目标检测】labelimg图像标注软件的使用流程
  • Vue3:reactive丢失响应式,数据有更新但表单没有更新
  • 完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
  • Python模块和包:标准库模块(os, sys, datetime, math等)②
  • 邮件营销:助力企业转换客户,提升曝光率
  • Redis实践之缓存:设置缓存过期策略
  • web基础+http协议+httpd详细配置
  • docker中图形化界面的转发
  • 大模型技术新手指南:从零开始的全方位教程
  • SegmentFault for Android 3.0 发布
  • 「译」Node.js Streams 基础
  • 【css3】浏览器内核及其兼容性
  • Apache Spark Streaming 使用实例
  • gf框架之分页模块(五) - 自定义分页
  • js继承的实现方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Selenium实战教程系列(二)---元素定位
  • 程序员最讨厌的9句话,你可有补充?
  • 服务器从安装到部署全过程(二)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 浏览器缓存机制分析
  • 世界上最简单的无等待算法(getAndIncrement)
  • 新书推荐|Windows黑客编程技术详解
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Python第六天)文件处理
  • (备份) esp32 GPIO
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第二周)效能测试
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (回溯) LeetCode 46. 全排列
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)c52学习之旅-中断
  • (七)Knockout 创建自定义绑定
  • (十六)一篇文章学会Java的常用API
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转)Linux下编译安装log4cxx
  • (自用)仿写程序
  • 、写入Shellcode到注册表上线
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core 版本不支持的问题