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

基于菜鸟教程的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 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.kler.cn/a/314290.html

相关文章:

  • k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
  • ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic
  • 【缺陷检测】Anomaly Detection via Reverse Distillation from One-Class Embedding
  • 蓝桥杯每日真题 - 第7天
  • 【真题笔记】21年系统架构设计师案例理论点总结
  • 轻松上手:使用Docker部署Java服务
  • Java.猜数字小游戏
  • Go 语言字典探秘:操作指南与约束解析
  • Git之如何删除Untracked文件(六十八)
  • MySQL的索引——提高查找算法的数据结构 B+树
  • Qt容器类控件——QGroupBox和QTabWidget
  • 计算机网络(月考一知识点)
  • Windows安装Oracle11gR2(图文教程)
  • Docker部署ddns-go教程(包含完整的配置过程)
  • 基于 K8S kubernetes 搭建 安装 EFK日志收集平台
  • 深度学习实战93-基于BiLSTM-CRF模型的网络安全知识图谱实体识别应用
  • CTC loss 博客转载
  • C++(2)进阶语法
  • 职业技能大赛-自动化测试笔记分享-2
  • 长亭WAF绕过测试
  • Spring AI Alibaba,阿里的AI Java 开发框架
  • 【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
  • C语言CRC16_CCITT_FALSE函数法和查表法实现
  • ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)
  • Unity坐标系求向量的模长
  • 【深度学习|可视化】如何以图形化的方式展示神经网络的结构、训练过程、模型的中间状态或模型决策的结果??