Flask基础和URL映射
目录
1. Flask介绍
2. Flask第一个应用程序
3. Flask运行方式
4. Flask中DEBUG模式
5. Flask环境参数的加载
6. Flask路径参数的使用
7. Flask路径参数类型
8. Flask路径参数类型转换底层
9. Flask自定义路由转换器
自定义步骤:
10. 自定义转换 to_python 函数
11. Postman的使用
功能:
使用示例:
12. 查询参数的使用
13. 请求体参数的使用
14. 上传文件的使用
15. request其它参数的使用
16. url_for函数的使用
17. 使用url_for的原因
18. 响应_重定向的使用
19. 响应_响应内容
20. 响应_自定义响应对象
1. Flask介绍
Flask -- 轻量级的 Python Web 框架
特点:
- 微框架:核心功能精简,开发者可根据需要扩展功能。
- 高效开发:支持 SQLAlchemy ORM,大幅减少手写 SQL 的需求。
- 自由选择:选择适合自己的数据库或工具,如 SQLAlchemy、MongoEngine。
- 模块化扩展:通过扩展库实现功能,如 Flask-Mail、Flask-Login 等。
核心工具:
- WSGI 工具箱:Werkzeug(路由模块)
- 模板引擎:Jinja2
2. Flask第一个应用程序
创建一个简单的 Flask 应用程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run()
运行后访问 http://127.0.0.1:5000/ 将显示 "Hello, Flask!"。
3. Flask运行方式
- 直接运行文件: 使用python app.py 运行应用程序。
- 设置主机和端口:
这里设置的端口是本地的
app.run(host="0.0.0.0", port=8080)
- 通过命令行: 使用flask run 命令启动服务。
- 设置环境变量:
$ export FLASK_APP=app.py
$ flask run
4. Flask中DEBUG模式
作用:
- 提供详细的错误调试信息。
- 实现代码修改后自动重启服务。
开启方式:
- 在 app.run方法中设置:
app.run(debug=True)
2.修改配置参数:
app.config['DEBUG'] = True
app.run()
5. Flask环境参数的加载
加载方法:
- 直接设置:
app.config['DEBUG'] = True
2.从文件加载:
app.config.from_pyfile('config.py')
3.使用对象配置:
class Config:
DEBUG = True
app.config.from_object(Config)
4.从环境变量加载:
app.config.from_envvar('APP_CONFIG_FILE')
6. Flask路径参数的使用
Flask 支持通过 URL 路径传递参数,例如:
@app.route('/user/<user_id>')
def get_user(user_id):
return f'User ID: {user_id}'
访问 /user/123 时,user_id 的值为 123。
7. Flask路径参数类型
可以为路径参数指定类型:
- string(默认)
- int:仅接受整数。
- float:仅接受浮点数。
- path:可包含斜杠的字符串。
- uuid:符合 UUID 格式的字符串。
示例:
@app.route('/item/<int:item_id>')
def get_item(item_id):
return f'Item ID: {item_id}'
8. Flask路径参数类型转换底层
路径参数类型由 Flask 的底层路由机制(Werkzeug)决定,具体通过以下类处理:
- IntegerConverter:处理整数类型路径参数。
- FloatConverter:处理浮点数类型路径参数。
- StringConverter:处理字符串类型路径参数。
示例:
@app.route('/product/<int:product_id>')
def get_product(product_id):
return f'Product ID: {product_id}'
访问 /product/10 会解析 product_id 为整数类型,若类型不匹配将返回 404 错误。
9. Flask自定义路由转换器
当内置转换器不能满足需求时,可以自定义转换器。
自定义步骤:
- 创建转换器类:继承 werkzeug.routing.BaseConverter。
- 定义 regex 属性以匹配正则表达式。
- 注册转换器: 使用app.url_map.converters 注册转换器。
- 在路由中使用。
示例:
from werkzeug.routing import BaseConverter
class MobileConverter(BaseConverter):
regex = r'1[3-9]\d{9}' # 匹配手机号格式
app.url_map.converters['mobile'] = MobileConverter
@app.route('/sms/<mobile:phone_number>')
def send_sms(phone_number):
return f'SMS sent to {phone_number}'
访问 /sms/13812345678 将匹配成功。
10. 自定义转换 to_python 函数
在转换器类中可以实现 to_python 方法,处理路径参数的值并返回处理后的结果。
示例:
class ListConverter(BaseConverter):
def to_python(self, value):
return value.split('+') # 将路径参数以 "+" 分隔成列表
app.url_map.converters['list'] = ListConverter
@app.route('/tags/<list:tag_list>')
def get_tags(tag_list):
return f'Tags: {", ".join(tag_list)}'
访问 /tags/python+flask+web 时,tag_list 将是 ['python', 'flask', 'web']。
11. Postman的使用
Postman 是一个流行的 API 调试工具,可用于测试接口。
功能:
- 支持各种 HTTP 请求方法(GET、POST、PUT、DELETE 等)。
- 设置请求头、查询参数和请求体。
- 支持保存请求集合和生成文档。
使用示例:
- 创建 POST 请求,设置请求地址和参数。
- 使用 form-data上传文件:设置 Content-Type 为 multipart/form-data。
- 在 Body 中添加文件字段。
12. 查询参数的使用
查询参数通常附加在 URL 的末尾,用于传递附加信息。
获取查询参数: 通过request.args 获取查询参数,返回一个 MultiDict 对象。
示例:
from flask import request
@app.route('/search')
def search():
query = request.args.get('q')
return f'Searching for: {query}'
访问 /search?q=flask 将返回 Searching for: flask。
13. 请求体参数的使用
在 POST 请求中,数据通常通过请求体传递。
获取请求体参数:
- 使用 request.form 获取表单数据。
- 使用 request.json 获取 JSON 数据。
示例:
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
return f'Login with username: {username}, password: {password}'
14. 上传文件的使用
Flask 支持通过 request.files 获取上传的文件。
示例:
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(f'./uploads/{file.filename}')
return 'File uploaded successfully!'
注意:
- 上传文件需要设置 Content-Type 为 multipart/form-data。
15. request其它参数的使用
Flask 提供 request 对象来读取请求的不同部分。
属性 | 描述 | 类型 |
values | 包含所有请求参数 | MultiDict |
form | 包含表单数据 | MultiDict |
args | 包含查询参数 | MultiDict |
cookies | 包含请求中的 Cookie | 字典 |
headers | 包含请求的头部信息 | EnvironHeaders |
method | 请求方法(GET/POST) | 字符串 |
url | 请求的完整 URL 地址 | 字符串 |
files | 上传的文件 | 字典 |
16. url_for函数的使用
url_for 函数用于根据函数名生成对应的 URL。
示例:
@app.route('/user/<int:user_id>')
def user_profile(user_id):
return f'User ID: {user_id}'
@app.route('/')
def index():
return url_for('user_profile', user_id=42)
返回值为:/user/42
17. 使用url_for的原因
- 维护性:URL 变更时,只需修改函数对应的路由,调用处无需改动。
- 自动转义:避免手动处理特殊字符和编码问题。
提示: 定义 URL 时,最好以斜杠/ 结尾,避免搜索引擎将加斜杠和不加斜杠的视为不同 URL。
18. 响应_重定向的使用
使用 redirect 实现重定向:
from flask import redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
return 'Login Page'
状态码:
- 301:永久重定向。
- 302:临时重定向(默认)。
19. 响应_响应内容
Flask 支持多种响应类型:
- 返回字符串:
return "Hello, Flask!"
2.返回 JSON:
from flask import jsonify
return jsonify({
'message': 'Hello, Flask!'})
3.返回元组:
return "Success", 200, {
'Custom-Header': 'Value'}
20. 响应_自定义响应对象
可以通过 make_response 创建自定义响应:
from flask import make_response
@app.route('/custom')
def custom_response():
resp = make_response("Custom Response", 404)
resp.headers['X-Custom-Header'] = 'CustomValue'
return resp