首页 > 编程问答 >如何匹配Flask中的所有路由?

如何匹配Flask中的所有路由?

时间:2024-07-31 10:34:16浏览次数:9  
标签:python flask routes static

我想匹配所有路由并处理 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

相关文章

  • 尝试通过Python访问.zip文件中的.gz文件
    我有一个包含大量.gz文件的.zip文件,我需要对其进行处理。我想打开.zip,我可以通过以下代码轻松完成:zf=zipfile.ZipFile("file.zip","r")forgzfileinzf.filelist:withgzip.GzipFile(fileobj=zf.open(gzfile.filename,"r"),mode="r")asf:df......
  • python导入包报错ImportError: cannot import name ‘Protocol‘
    python32.pyTraceback(mostrecentcalllast):File"2.py",line5,in<module>importptwt#use"fromsrcimportptwt"foraclonedtherepoFile"……lib/python3.6/site-packages/ptwt/_util.py",line2......
  • Python - Creating your own Iterator
    Inourfirstexample,wewillcreateiterableobjects,which,wheniteratedover,willgiveoutcubesofnumbers,andtheseobjectswillsupportmultipleiterations.classCubes:def__init__(self,start,stop):self.start=startsel......
  • 三种语言实现前缀和(C++/Python/Java)
    题目输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l,r对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。......
  • Python - 旨在通过命令提示符执行数据清理,但代码似乎无法运行
    我从一位同事那里收到了这段代码,我打算用它来处理100csv文件以提取有关粒子的值。代码如下所示:importsysimportcsv#Usage#skdata_decode.py[inputfile1][inputfile2]...#(Itispossibletousefiledcardtospecifyinputfiles.)##l......
  • 如何在 python 终端中的 x,y 位置上书写(基于文本)
    我想在python(基于文本)的终端中的定义位置(x,y)上写入字符。假设,我有一个大小为25x80的终端,并且想要在位置(2,20)上写入字符。我可以在Python中执行此操作吗?现在,我使用25x80数组,并写入该数组。为了在屏幕上显示,我清除屏幕并将该数组的全部内容写入屏幕,但这效......
  • Python - Composition
     classEngine:def__init__(self,power):self.power=powerdefstart(self):self.draw_current()self.spin()self.ignite()defdraw_current(self):print('Drawingcurrent')defspin(sel......
  • Python - Iterator vs Iterable
    Therearemanybuilt-infunctionsandmethodsthatreturniterablesanditerators.Hereareafewexamples:range()returnsaniterabledict.keys()returnsaniterabledict.items()returnsaniterabledict.values()returnsaniterableenumerate()returns......
  • 在python中使用变量引用Panda列名称
    我正在尝试编写一个函数来简化我的代码,因此我传递了包含列名称的变量。它适用于Django应用程序,调试器不会对我的错误所在提供任何反馈,只是“内部服务器错误”。我的代码工作正常,不是作为函数编写的:df_trips['trip_time_prep_starts']=df_trips["trip_time_prep_sta......
  • 如何在 Pyqt5 Python 中实现 QTableWidget 列过滤器中的搜索栏?
    我使用pyqt5创建了一个QTableWidget,并成功地在表格小部件的每一列中添加了过滤选项,并使用堆栈溢出上可用的答案之一。过滤器按预期工作,但我想在顶部的过滤器中添加搜索栏来搜索值。在我的python脚本中,过滤器中可能有大约50多个唯一值。因此,如果有一种方法可以在过滤器......