我想匹配所有路由并处理 Flask 中所有收到的 HTTP 请求。代码如下:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/<path:full_path>', methods=['GET', 'PUT', 'DELETE', 'POST'])
def catch_all(full_path):
print(request.url)
return request.url
if __name__ == "__main__":
app.run(port=8080, host='0.0.0.0', ssl_context='adhoc', debug=True)
除了路径中存在“static”的情况外,上面的代码运行良好。例如,如果url是 https://127.0.0.1:8080/static/index.html ,那么上面的代码不起作用。如何解决这个问题?
我尝试通过修改代码来解决这个问题
app = Flask(__name__, static_url_path='')
还是不行。
问题在于 Flask 处理静态文件的默认行为。当你访问
/static/
路径下的资源时,Flask 会直接从
static
文件夹中提供文件,而不会经过你的路由函数。
你可以通过以下几种方式解决这个问题:
1. 使用
send_from_directory
函数:
from flask import Flask, request, send_from_directory
app = Flask(__name__)
@app.route('/<path:full_path>')
def catch_all(full_path):
print(request.url)
# 检查路径是否以 'static/' 开头
if full_path.startswith('static/'):
# 如果是,则从 static 文件夹中提供文件
return send_from_directory('static', full_path[7:])
else:
# 否则,执行其他操作
return request.url
if __name__ == "__main__":
app.run(port=8080, host='0.0.0.0', ssl_context='adhoc', debug=True)
这个方法首先检查请求路径是否以
static/
开头。如果是,则使用
send_from_directory
函数从
static
文件夹中提供文件。否则,执行你的其他逻辑。
2. 修改静态文件路径:
from flask import Flask, request
app = Flask(__name__, static_url_path='/assets')
@app.route('/<path:full_path>')
def catch_all(full_path):
print(request.url)
return request.url
if __name__ == "__main__":
app.run(port=8080, host='0.0.0.0', ssl_context='adhoc', debug=True)
这个方法将静态文件路径从默认的
/static/
修改为
/assets/
。这样,所有对
/static/
的请求都会经过你的路由函数。
3. 使用
Blueprint
:
from flask import Flask, Blueprint, request
app = Flask(__name__)
bp = Blueprint('catch_all', __name__)
@bp.route('/<path:full_path>')
def catch_all(full_path):
print(request.url)
return request.url
app.register_blueprint(bp, url_prefix='/')
if __name__ == "__main__":
app.run(port=8080, host='0.0.0.0', ssl_context='adhoc', debug=True)
这个方法创建一个 Blueprint,并将所有路由都定义在 Blueprint 中。最后将 Blueprint 注册到应用的根路径下,这样就可以捕获所有请求,包括对静态文件的请求。
请注意,捕获所有请求可能会带来安全风险,尤其是在生产环境中。请谨慎使用,并确保你的代码能够安全地处理所有请求。
标签:python,flask,routes,static From: 78810768