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

Flask 路由详解:构建灵活的 URL 映射系统

路由(Routing)是 Web 框架的核心功能之一,它负责将客户端发来的 HTTP 请求(通过 URL 和 HTTP 方法标识)精准地映射到服务器端相应的处理函数(在 Flask 中称为“视图函数”)。Flask 提供了一套强大、灵活且直观的路由系统,让你能够轻松定义清晰、语义化的应用 URL 结构,无论是构建简单的静态网站还是复杂的 RESTful API。

本文将带你从路由的基础概念出发,逐步深入到高级技巧和最佳实践,全面掌握 Flask 路由的方方面面。


一、路由基础:构建应用的骨架

1. 基本路由定义

Flask 使用 @app.route() 装饰器来定义路由。这个装饰器接收一个 URL 规则(字符串),并将其与一个 Python 函数(视图函数)关联起来。当用户访问该 URL 时,Flask 会自动调用对应的函数并返回其结果。

from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():"""首页视图函数"""return '这是首页'@app.route('/about')
def about():"""关于页面视图函数"""return '这是关于页面'@app.route('/contact')
def contact():"""联系页面视图函数"""return '这是联系页面'

关键点解析:

  • @app.route() 装饰器:这是定义路由的核心。它将 URL 路径与下方的函数绑定。
  • 视图函数 (View Function):被 @app.route() 装饰的函数。它负责处理请求并返回响应(通常是字符串、HTML 或 JSON)。
  • 函数返回值:Flask 期望视图函数返回一个可作为 HTTP 响应主体的值。最简单的是字符串,Flask 会自动将其封装成一个包含 Content-Type: text/html 头的响应。

2. 运行应用与访问

if __name__ == '__main__':app.run(debug=True)
  • debug=True:开启调试模式。这带来了两大好处:
    1. 自动重载:当你的 Python 代码文件发生更改时,Flask 开发服务器会自动重启,无需手动停止再启动。
    2. 交互式调试器:当代码出错时,会显示一个详细的错误页面,包含堆栈跟踪和一个 Web 控制台,方便你在线调试(注意:生产环境绝对不要开启 debug=True,因为它存在安全风险)。

访问示例:

  • http://127.0.0.1:5000/ → 显示 "这是首页"
  • http://127.0.0.1:5000/about → 显示 "这是关于页面"
  • http://127.0.0.1:5000/contact → 显示 "这是联系页面"

小贴士127.0.0.1 是本地回环地址,5000 是 Flask 默认端口。你可以通过 app.run(port=8080) 等方式修改端口。


二、动态路由:处理可变 URL

静态路由适用于固定路径,但 Web 应用的许多内容是动态的(如用户资料、文章详情)。Flask 的动态路由允许你在 URL 中定义变量部分

1. 带参数的路由

使用 <variable_name> 语法在 URL 规则中定义参数。该参数的值会作为同名参数传递给视图函数。

@app.route('/user/<username>')
def show_user(username):"""显示指定用户名的页面"""return f'用户页面:{username}'@app.route('/post/<int:post_id>')
def show_post(post_id):"""显示指定 ID 的文章"""return f'文章ID:{post_id},类型:{type(post_id).__name__}'

访问示例:

  • /user/alice → 显示 "用户页面:alice"
  • /post/123 → 显示 "文章ID:123,类型:int" (注意 post_idint 类型)

2. 支持的参数类型

Flask 内置了多种转换器,用于对 URL 中的变量进行类型转换和约束:

转换器 (Converter)

说明

示例

string

(默认) 接受任何不包含斜杠 / 的文本

/user/<username>

int

接受正整数,并自动转换为 Python int 类型

/post/<int:post_id>

float

接受浮点数,并自动转换为 Python float类型

/price/<float:price>

path

类似 string,但可以包含斜杠 /,用于匹配多级路径

/path/<path:subpath>

uuid

接受标准的 UUID 字符串 (如 ca761232-1f3a-4711-b3c6-7575c8a8ac20),并转换为 uuid.UUID对象

/user/<uuid:user_id>

更多示例:

@app.route('/price/<float:price>')
def show_price(price):return f'价格:{price:.2f},类型:{type(price).__name__}'  # 格式化输出@app.route('/path/<path:subpath>')
def show_path(subpath):return f'路径:{subpath}'  # /path/foo/bar 会匹配,subpath 值为 "foo/bar"@app.route('/user/<uuid:user_id>')
def show_user_by_uuid(user_id):# user_id 是 uuid.UUID 对象return f'用户UUID:{user_id}, 版本:{user_id.version}'

3. 多参数路由

一个 URL 规则中可以包含多个参数。

@app.route('/user/<username>/post/<int:post_id>')
def user_post(username, post_id):"""显示特定用户下的特定文章"""return f'用户 {username} 的第 {post_id} 篇文章'

访问示例:

  • /user/bob/post/42 → 显示 "用户 bob 的第 42 篇文章"

三、HTTP 方法路由:构建 RESTful API

HTTP 定义了多种请求方法(如 GET, POST, PUT, DELETE),用于表示对资源的不同操作。Flask 允许你为同一个 URL 规则指定不同的允许方法,并在视图函数中区分处理。

1. 指定允许的 HTTP 方法

使用 methods 参数在 @app.route() 中指定允许的 HTTP 方法列表。注意: 如果不指定 methods,默认只允许 GET 请求。

from flask import request@app.route('/login', methods=['GET', 'POST'])
def login():"""处理登录请求。GET: 显示登录表单。POST: 处理表单提交。"""if request.method == 'POST':# 获取表单数据username = request.form.get('username')password = request.form.get('password')# 这里应该进行验证逻辑...return f'处理登录表单提交。用户名:{username}'else:  # GET 请求return '''<form method="post"><label for="username">用户名:</label><input type="text" name="username" placeholder="请输入用户名" required><br><br><label for="password">密码:</label><input type="password" name="password" placeholder="请输入密码" required><br><br><input type="submit" value="登录"></form>'''

2. 常见的 HTTP 方法与 RESTful 设计

方法

用途

幂等性

安全性

GET

获取资源

POST

创建新资源

PUT

更新整个资源

DELETE

删除资源

PATCH

更新资源的部分属性

RESTful API 示例:

from flask import jsonify# 假设这些是你的数据操作函数
def get_all_users(): return [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
def create_user(data): return {"id": 3, "name": data.get("name"), "status": "created"}
def get_user(user_id): return {"id": user_id, "name": "User"}
def update_user(user_id, data): return {"id": user_id, "name": data.get("name"), "status": "updated"}
def delete_user(user_id): return {"id": user_id, "status": "deleted"}@app.route('/api/users', methods=['GET', 'POST'])
def users_api():if request.method == 'GET':users = get_all_users()return jsonify(users), 200  # 返回 JSON 和状态码elif request.method == 'POST':data = request.get_json()  # 获取 JSON 请求体if not data or 'name' not in data:return jsonify({"error": "Name is required"}), 400new_user = create_user(data)return jsonify(new_user), 201  # 201 Created@app.route('/api/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user_api(user_id):# 可以在这里添加用户是否存在检查if request.method == 'GET':user = get_user(user_id)return jsonify(user), 200elif request.method == 'PUT':data = request.get_json()if not data:return jsonify({"error": "Invalid JSON"}), 400updated_user = update_user(user_id, data)return jsonify(updated_user), 200elif request.method == 'DELETE':result = delete_user(user_id)return jsonify(result), 200

重要jsonify() 函数将 Python 字典或列表转换为 JSON 格式的响应,并自动设置 Content-Type: application/json 头。


四、URL 构建与反向解析:避免硬编码

硬编码 URL(如 href="/user/alice")在开发中非常危险。如果将来修改了路由规则,所有硬编码的链接都需要手动更新,极易出错。Flask 提供了 url_for() 函数来反向生成 URL。

1. 使用 url_for() 生成 URL

url_for() 接收视图函数的端点名(通常是函数名)作为第一个参数,以及该函数所需的任何参数。

from flask import url_for@app.route('/')
def index():# 生成其他路由的 URLabout_url = url_for('about')  # 生成 /aboutcontact_url = url_for('contact')  # 生成 /contactuser_url = url_for('show_user', username='alice')  # 生成 /user/alicereturn f'''<h1>欢迎来到我的网站</h1><nav><ul><li><a href="{about_url}">关于</a></li><li><a href="{contact_url}">联系</a></li><li><a href="{user_url}">Alice 的个人主页</a></li></ul></nav>'''@app.route('/about')
def about():# 生成首页 URLhome_url = url_for('index')  # 生成 /return f'<p><a href="{home_url}">返回首页</a></p><h2>关于我</h2>'

优势:

  • 解耦:URL 生成与路由定义分离。
  • 维护性:修改路由规则后,所有通过 url_for() 生成的链接会自动更新。
  • 正确性:确保生成的 URL 总是符合当前的路由配置。

2. 带参数的 URL 生成

如上例所示,传递参数给 url_for() 即可生成包含变量的 URL。

@app.route('/blog/<int:year>/<int:month>')
def archive(year, month):return f'<h1>{year}年{month}月的博客归档</h1>'# 在其他地方生成此 URL
archive_url = url_for('archive', year=2024, month=1)
# 结果:/blog/2024/1

五、路由匹配规则:精确控制行为

1. 斜杠处理与严格斜杠

Flask 对 URL 末尾的斜杠 / 有特定的处理逻辑:

@app.route('/about') # 无尾部斜杠
def about():return '关于页面'@app.route('/contact/') # 有尾部斜杠
def contact():return '联系页面'
  • /about/about/ 都会成功访问 about() 函数。当用户访问 /about/ 时,Flask 会自动将其重定向(308 Permanent Redirect)到 /about
  • /contact/contact/ 都会成功访问 contact() 函数。当用户访问 /contact 时,Flask 会自动将其重定向(308 Permanent Redirect)到 /contact/

核心规则:Flask 会根据你定义路由时是否包含尾部斜杠来决定重定向的方向。

2. 严格斜杠 (strict_slashes=False)

你可以通过设置 strict_slashes=False 来禁用这种重定向行为,允许一个路由同时匹配带和不带斜杠的 URL。

@app.route('/strict', strict_slashes=False)
def strict_example():return '这个路由对 /strict 和 /strict/ 都响应,且不会重定向。'

3. 子域名路由

Flask 支持基于子域名的路由,这对于构建多租户应用或分离管理后台非常有用。

# 注意:需要在配置中设置 SERVER_NAME 才能使用子域名
# app.config['SERVER_NAME'] = 'example.com'@app.route('/dashboard', subdomain='admin')
def admin_dashboard():return '管理员仪表板 (访问 admin.example.com/dashboard)'@app.route('/profile')
def user_profile():return '用户个人资料 (访问 example.com/profile)'

配置要求:为了在本地开发时测试子域名,你需要:

  1. 设置 app.config['SERVER_NAME'] = 'localhost:5000' (或你的域名)。
  2. 修改本地 hosts 文件(如 /etc/hostsC:\Windows\System32\drivers\etc\hosts),添加行:127.0.0.1 admin.localhost

六、错误处理路由:提升用户体验

当用户访问不存在的页面或服务器出错时,提供友好的错误页面至关重要。

1. 自定义错误页面

使用 @app.errorhandler() 装饰器来捕获特定的 HTTP 错误状态码。

@app.errorhandler(404)
def not_found(error):"""处理 404 错误"""return '''<h1>404 - 页面未找到</h1><p>您访问的页面不存在。</p><a href="/">返回首页</a>''', 404  # 显式返回状态码@app.errorhandler(500)
def internal_error(error):"""处理 500 错误"""# 在生产环境中,这里通常会记录错误日志return '''<h1>500 - 服务器内部错误</h1><p>服务器遇到了一个错误,我们正在努力修复。</p><a href="/">返回首页</a>''', 500@app.errorhandler(403)
def forbidden(error):return '403 - 禁止访问', 403

2. 处理特定异常

你也可以捕获 Werkzeug(Flask 依赖的 WSGI 工具库)定义的具体异常类。

from werkzeug.exceptions import NotFound, InternalServerError@app.errorhandler(NotFound)
def handle_not_found(error):"""捕获 NotFound 异常"""return f'''<h1>资源未找到</h1><p>请求的资源 "{error.description}" 不存在。</p><a href="/">返回首页</a>''', 404@app.errorhandler(InternalServerError)
def handle_internal_error(error):"""捕获 InternalServerError 异常"""app.logger.error(f'服务器内部错误: {error.original_exception}')return '500 - 服务器内部错误', 500

七、蓝图(Blueprint):组织大型应用

当应用变得庞大时,将所有路由都写在 app.py 中会导致文件臃肿,难以维护。蓝图 (Blueprint) 是 Flask 提供的模块化组件,用于组织路由、静态文件、模板等。

1. 创建蓝图

通常将相关功能的路由分组到一个蓝图中。

# routes/users.py
from flask import Blueprint# 创建蓝图实例
# 'users' 是蓝图的名称(通常用作前缀)
# __name__ 是蓝图所在的包或模块
# url_prefix='/users' 为该蓝图下的所有路由添加统一前缀
users_bp = Blueprint('users', __name__, url_prefix='/users')@users_bp.route('/')
def list_users():"""获取用户列表"""return '用户列表 (GET /users/)'@users_bp.route('/<int:user_id>')
def user_detail(user_id):"""获取单个用户详情"""return f'用户详情:{user_id} (GET /users/{user_id})'@users_bp.route('/<username>/posts')
def user_posts(username):"""获取用户的所有文章"""return f'{username} 的文章 (GET /users/{username}/posts)'

2. 注册蓝图

在主应用文件中创建 Flask 应用实例,并注册一个或多个蓝图。

# app.py
from flask import Flask
from routes.users import users_bp  # 导入蓝图
# from routes.posts import posts_bp
# from routes.admin import admin_bpapp = Flask(__name__)# 注册蓝图
app.register_blueprint(users_bp)# 注册其他蓝图
# app.register_blueprint(posts_bp)
# app.register_blueprint(admin_bp, url_prefix='/admin') # 为 admin 蓝图设置不同前缀if __name__ == '__main__':app.run(debug=True)

访问效果:

  • /users/ → 调用 users_bplist_users() 函数
  • /users/123 → 调用 users_bpuser_detail(123) 函数
  • /users/alice/posts → 调用 users_bpuser_posts('alice') 函数

蓝图的优势:

  • 模块化:将大型应用拆分成可管理的小块。
  • 可重用性:可以在不同的应用中注册同一个蓝图。
  • 命名空间:避免视图函数名冲突。
  • 统一配置:可以为蓝图设置统一的 URL 前缀、错误处理器、静态文件夹等。

八、高级路由技巧

1. 条件路由

有时,多个 URL 规则需要映射到同一个处理逻辑。

# 方法一:使用多个 @app.route 装饰器
@app.route('/admin')
@app.route('/moderator')
def staff_area():"""管理员和版主共用的后台区域"""# 可以通过 request.url_rule.rule 获取当前匹配的路径role = request.url_rule.rule.strip('/').title()  # '/admin' -> 'Admin'return f'欢迎,{role}!您进入了后台区域。'# 方法二:动态创建路由(适用于大量相似路由)
def create_role_route(role_name):@app.route(f'/{role_name}/dashboard')def role_dashboard():return f'这是 {role_name.title()} 的仪表板'# 必须返回函数,否则装饰器作用域可能有问题return role_dashboard# 注册多个角色路由
create_role_route('admin')
create_role_route('moderator')
create_role_route('editor')

2. 正则表达式路由

虽然 Flask 内置转换器很强大,但有时需要更复杂的匹配模式(如匹配特定格式的字符串)。可以使用 werkzeug.routing.Rule

from werkzeug.routing import Rule
import re# 定义一个正则表达式转换器
class RegexConverter:def __init__(self, map, *args):self.map = mapself.regex = args[0]def to_python(self, value):return valuedef to_url(self, value):return value# 将转换器添加到 URL Map
app.url_map.converters['regex'] = RegexConverter# 使用自定义转换器
@app.route('/api/<regex("v[0-9]+"):version>/users')
def api_users(version):return f'API 版本:{version}'  # 匹配 /api/v1/users, /api/v2/users 等# 或者直接使用 Rule (较少用)
# app.url_map.add(Rule('/api/<regex("v[0-9]+"):version>/users', endpoint='api_users'))
# @app.endpoint('api_users')
# def api_users(version):
#     return f'API 版本:{version}'

3. 路由重定向

将用户从一个旧的或不正确的 URL 重定向到新的或正确的 URL。

from flask import redirect, url_for@app.route('/old-page')
def old_page():"""旧页面,重定向到新页面"""return redirect(url_for('new_page'))  # 302 Found (临时重定向)@app.route('/new-page')
def new_page():return '这是新页面的内容。'# 永久重定向 (SEO 友好)
@app.route('/legacy')
def legacy():return redirect(url_for('modern'), code=301)  # 301 Moved Permanently@app.route('/modern')
def modern():return '这是现代版的页面。'

九、路由最佳实践

1. RESTful 路由设计

遵循 REST 原则,使用名词复数表示资源集合,HTTP 方法表示操作。

# 资源:用户 (Users)
@app.route('/users', methods=['GET'])      # 获取用户列表
@app.route('/users', methods=['POST'])     # 创建新用户
@app.route('/users/<int:user_id>', methods=['GET'])    # 获取单个用户
@app.route('/users/<int:user_id>', methods=['PUT'])    # 替换整个用户信息
@app.route('/users/<int:user_id>', methods=['PATCH'])  # 更新用户部分信息
@app.route('/users/<int:user_id>', methods=['DELETE']) # 删除用户# 资源:文章 (Posts) 与评论 (Comments) - 体现资源嵌套
@app.route('/posts', methods=['GET', 'POST'])
@app.route('/posts/<int:post_id>', methods=['GET', 'PUT', 'PATCH', 'DELETE'])
@app.route('/posts/<int:post_id>/comments', methods=['GET', 'POST']) # 获取或创建评论
@app.route('/posts/<int:post_id>/comments/<int:comment_id>', methods=['GET', 'PUT', 'DELETE'])

2. 路由命名规范

  • URL 设计
    • 使用小写字母和连字符 - 分隔单词(如 /user-profile),避免下划线 _
    • 使用名词,避免动词(如用 /users 而不是 /get_users)。
    • 保持简洁和语义化。
  • 视图函数命名
    • 函数名应清晰表达其功能。
    • 使用小写字母和下划线 _ 分隔单词(Python 命名规范)。
    • 好例子
@app.route('/user/profile')
def user_profile():  # 清晰表达功能pass@app.route('/api/v1/users')
def api_v1_users():  # 包含版本信息,便于 API 管理pass
    • 避免
@app.route('/up')  # 不清晰
def func1():       # 无意义的函数名pass

3. 路由组织策略

  • 小型应用:所有路由直接定义在主应用文件(如 app.py)中。
  • 中型应用:按功能模块(如用户、文章、产品)创建蓝图,分别存放。
  • 大型应用:采用包结构(Package Structure),例如:
myapp/
├── __init__.py          # 创建 Flask 应用实例
├── models/              # 数据模型
├── views/               # 视图(蓝图)
│   ├── __init__.py
│   ├── users.py
│   ├── posts.py
│   └── admin.py
├── static/              # 静态文件
├── templates/           # 模板文件
└── config.py            # 配置文件

__init__.py 中注册所有蓝图。


十、常见问题与解决方案

1. 路由冲突

问题:定义了两个完全相同的路由规则,后定义的会覆盖前一个。

# ❌ 错误:冲突!
@app.route('/user')
def user_list():return '用户列表'@app.route('/user') # 与上面完全相同
def user_profile(): # 这个函数会覆盖 user_listreturn '用户个人资料' # /user 现在只返回这个

解决方案:使用不同的路径或不同的 HTTP 方法。

# ✅ 正确:使用不同路径
@app.route('/users')
def user_list():return '用户列表'@app.route('/user/<int:user_id>')
def user_profile(user_id):return f'用户详情:{user_id}'# ✅ 正确:使用相同路径但不同方法(RESTful)
@app.route('/user', methods=['GET'])
def get_user():return '获取用户信息'@app.route('/user', methods=['POST'])
def create_user():return '创建用户'

2. 路由顺序

Flask 按照路由定义的顺序进行匹配。更具体的路由应该放在更通用的路由之前,否则通用路由可能会“吞噬”本应由具体路由处理的请求。

# ✅ 正确:具体路由在前
@app.route('/user/admin')  # 具体路由
def admin():return '管理员页面'@app.route('/user/<username>')  # 通用路由
def user(username):return f'普通用户:{username}'# ❌ 错误:通用路由在前,/user/admin 会被匹配到 user('admin')
@app.route('/user/<username>')
def user(username):return f'用户:{username}'@app.route('/user/admin') # 这个永远不会被访问到!
def admin():return '管理员'

3. 调试路由

当路由行为不符合预期时,可以打印出所有已注册的路由进行检查。

import json
from flask import jsonify@app.route('/debug/routes')
def debug_routes():"""调试:列出所有注册的路由"""routes = []for rule in app.url_map.iter_rules():routes.append({'endpoint': rule.endpoint,  # 视图函数名'methods': list(rule.methods - set(['HEAD', 'OPTIONS'])),  # 去掉 Flask 自动添加的 HEAD, OPTIONS'rule': str(rule),  # URL 规则'strict_slashes': rule.strict_slashes,})# 返回格式化的 JSONreturn jsonify(sorted(routes, key=lambda x: x['rule']))

访问 /debug/routes 即可看到类似以下的输出:

[{"endpoint": "index", "methods": ["GET"], "rule": "/", "strict_slashes": true},{"endpoint": "about", "methods": ["GET"], "rule": "/about", "strict_slashes": true},...
]

十一、总结

路由特性

说明

典型使用场景

静态路由

固定不变的 URL 路径

首页、关于页面、服务条款等

动态路由

包含变量的 URL 路径,可进行类型转换

用户资料页 (/user/<username>

)、文章详情页 (/post/<int:id>

)、产品页面

HTTP 方法路由

根据请求方法 (GET, POST等) 区分处理同一 URL

表单处理(GET 显示,POST 提交)、RESTful API 设计

蓝图 (Blueprint)

模块化组织路由、视图和静态资源

大型应用的分模块开发(如用户模块、文章模块、管理后台)

错误处理

自定义 HTTP 错误状态码(404, 500 等)的响应

提供友好的错误页面,改善用户体验和 SEO

URL 构建

使用 url_for()反向生成 URL

模板中生成链接、重定向,避免硬编码 URL

高级技巧

正则路由、重定向、条件路由等

处理复杂 URL 模式、API 版本控制、旧链接迁移

Flask 的路由系统以其简洁、灵活和强大的特性,让你能够:

  1. 灵活设计 URL 结构:创建清晰、直观、对用户和搜索引擎友好的 URL。
  2. 轻松处理动态内容:通过参数和转换器,高效地处理个性化和数据库驱动的内容。
  3. 构建专业 RESTful API:利用 HTTP 方法和状态码,设计符合标准的 Web API。
  4. 组织大型应用:通过蓝图实现代码的模块化和可维护性。
  5. 提供卓越的用户体验:通过自定义错误页面和智能重定向,让应用更加健壮和友好。

🚀 实践建议:

从简单的静态路由开始,逐步尝试动态路由、HTTP 方法区分和 url_for()。当项目规模增大时,果断引入蓝图进行模块化。始终遵循 RESTful 设计原则和命名规范。掌握路由调试技巧,能让你在开发中事半功倍。最终,构建出 URL 结构清晰、逻辑分明、易于维护的高质量 Flask 应用!

http://www.dtcms.com/a/339429.html

相关文章:

  • ISIS高级特性
  • 前端下载文件、压缩包
  • 【深度解析----Pycharm命令行和项目中Settings-Interpreter中安装的插件库不一致的原因以及解决办法】
  • 权重、偏置、运行均值、运行方差的概念
  • 【基础-判断】所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数
  • 图形化监控用数据动态刷新方法
  • 快手Klear-Reasoner登顶8B模型榜首,GPPO算法双效强化稳定性与探索能力!
  • Linux 定时任务 + Oracle 19c 备份完整操作手册(Linux→windows server)
  • 【git】改 GitLab 远程分支名;
  • Unity高级开发:反射原理深入解析与实践指南 C#
  • Java 线程状态与线程组
  • 水闸安全综合监测系统解决方案
  • Kafka 面试题及详细答案100道(1-10)-- 基础概念与架构
  • NestJS @Inject 装饰器入门教程
  • Hugging Face 核心组件介绍
  • 大功率变速箱总成双联试验台架系统参数
  • 机器人控制基础:运动控制中的串级pid原理以及实现方案(包含代码示例)
  • C/C++ 常见笔试题与陷阱详解
  • .net core web程序如何设置redis预热?
  • 【大白话解析】 OpenZeppelin 的 Address 库:Solidity安全地址交互工具箱​(附源代码)
  • Mybatis执行SQL流程(四)之MyBatis中JDK动态代理
  • Ansible 异步任务管理与内容重用详解
  • 10.Ansible角色管理
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • 网络间的通用语言TCP/IP-网络中的通用规则3
  • 缓存雪崩、缓存穿透、缓存击穿在实际中如何处理
  • Windows Git安装配置
  • PCL+Spigot服务器+python进行MC编程(使用Trae进行AI编程)---可以生成彩虹
  • 代码随想录Day56:图论(冗余连接、冗余连接II)
  • 【python】列表复制注意事项