基于菜鸟教程的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)
访问网页: