前言
待业家中继续学习。
Flask 项目结构
my_flask_app/
│
├── app/
│ ├── __init__.py
│ ├── routes/ -- 将不同功能模块的路由分开管理
│ │ ├── __init__.py
│ │ ├── main.py -- 主模块的路由
│ │ └── auth.py -- 认证相关的路由
│ ├── models/ -- 管理数据模型,通常与数据操作相关
│ │ ├── __init__.py
│ │ └── user.py -- 用户模型
│ ├── templates/ -- 存放 HTML 模板文件
│ │ ├── layout.html -- 布局相关
│ │ └── home.html
│ └── static/ -- 存放静态文件,如CSS和JavaScript
│ ├── css/
│ └── js/
│
├── config.py -- 配置文件,包含应用的配置信息
├── requirements.txt -- 列出项目的依赖库
├── migrations/
│ └── ...
└── run.py -- 用于启动Flask应用
如何在Trae IDE中配置Python解释器
看到app.py
报错,因为没有导入flask
库,但我的设备已经安装了,所以应该是需要配置下。在设置中找半天没有找到,后来搜索才知道原来是在Editor
中,搜索python,然后将 Python: Default Interpreter Path
的路径设置为设备安装的路径。
藏的有点深,可能从产品的角度上看是不想局限在某种语言,可以在Editor
设置的说明文案部分增加编译器,解释器。
路由
Flask 路由是Flask应用的核心部分,用于处理不同URL的请求,并将请求的处理委托给相应的视图函数
路由的相关说明
- 定义路由: 使用 @app.route(‘/path’) 装饰器定义URL和视图函数的映射。
- 路由参数: 通过动态部分在URL中传递参数的类型
- 路由规则: 使用类型转换器指定URL参数的类型
- 请求方法: 指定允许的HTTP请求方法。(GET,POST,DELETE,PUT)
- 路由函数返回: 视图函数可以返回不同类型的响应
- 静态文件和模板: 管理静态文件和动态渲染 HTML 模板
- 路由优先级: 确保路由顺序正确,以避免意外的匹配结果
定义路由
from flask import Flask
app = Flask(__name__)
@app.route('/') # 装饰器,用于定义路由。/ 表示根 URL
def home():
return 'Welcome to the Home Page!'
if __name__ == '__main__':
app.run(debug=True)
路由参数
...
@app.route('/greet/<name>') # 动态路由,<name> 是一个变量
def greet(name):
return f'Hello, {name}!'
if __name__ == '__main__':
app.run(debug=True)
路由规则
路由规则支持不同
- 字符串(默认): 匹配任意字符串
- 整数(int:name): 匹配整数值
- 浮点数float:value): 匹配浮点数值
- path(path:name): 匹配任意字符,包括斜杆/
# 访问/user/1 能正常输出User ID:1
@app.route('/user/<int:user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
# 访问/user/1 能正常输出User ID:1
@app.route('/user/<user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
# 访问/user/1 int和user_id同时存在时走int
@app.route('/user/<user_id>')
def user_profile2(user_id):
return f'User ID2: {user_id}'
# 换成float,访问/user/1
# Not Found
# The requested URL was not found on the server. If you entered the URL # manually please check your spelling and try again.
@app.route('/user/<float:user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
请求方法
Flask 路由支持不同的 HTTP 请求方法,如 GET、POST、PUT、DELETE 等。可以通过 methods 参数指定允许的请求方法。
@app.route('/submit', methods=['POST'])
def submit():
return 'Form submitted!'
此时设置了是POST请求,如果用Trae自带的浏览器访问,因为实际是GET请求,会报405错误码不允许
使用postman发送post请求验证能获得正常的返回
路由函数返回
- 字符串: 返回纯文本响应
- HTML: 返回HTML页面
- JSON: 返回JSON数据
- Response对象: 自定义响应
from flask import jsonify, Response
@app.route('/json')
def json_response():
data = {'key': 'value'}
return jsonify(data)
@app.route('/custom')
def custom_response():
response = Response('Custom response with headers', status=200)
response.headers['X-Custom-Header'] = 'Value'
return response
返回json
返回自定义响应
静态文件和模板
静态文件(如 CSS、JavaScript、图片)可以通过 static 路由访问。模板文件则通过 templates 文件夹组织,用于渲染 HTML 页面。
styles.css
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
p {
color: #940f0f;
}
这个格式默认是在找工程下的static目录下的styles.css
app.py
@app.route('/tutorial02/<name>')
def hello(name):
return render_template('02.html', name=name)
02.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
<title>02</title>
</head>
<body>
<h1>02</h1>
<p>
{{ name }}
</p>
</body>
</html>
路由优先级
Flask 按照定义的顺序匹配路由,第一个匹配成功的路由将被处理。确保更具体的路由放在更一般的路由之前。
@app.route('/user/<int:user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
@app.route('/user')
def user_list():
return 'User List'
/user/123
将匹配到 /user/<int:user_id>
,而 /user 将匹配到 user_list
。