Flask使用蓝图的URL路由不起作用,返回404 HTTP代码。

3

我在使用Flask进行URL路由时遇到了问题,似乎路由没有按照预期工作。

  1. Under project/src/views.py, I have the following sample routes

    from flask import (Flask,request,jsonify,Blueprint)
    my_view = Blueprint('my_view', __name__)
    
    @my_view.route('/',methods=("GET",))
    @my_view.route('/index',methods=("GET",))
    def index():
        ....
        <return response code here> 
    
    @my_view.route("/key/<inp1>/<inp2>", methods=("POST","GET"))
    def getKey(inp1=None, inp2=None):
        ....
        <return response code here>
    
  2. Now, under project/src/app.py, I have the following code

    from ../src.views import my_view 
    
    my_app = Flask("myappname")
    my_app.register_blueprint(my_view)
    my_app.run(debug=True,host=APP_IP,port=APP_PORT)
    
现在,当我使用有效参数访问URL http://ip:port/indexhttp://ip:port/key...时,它会返回 404 错误,并显示消息“服务器上未找到请求的 URL。如果您手动输入了 URL,请检查拼写并重试。” 我认为这些路由不起作用。

团队,有什么建议吗?另外,当这个端点被触发时,我们如何知道正在发生什么?无论如何,我们可以在代码中添加一些调试语句。 - Santhosh
1个回答

4
第一个问题是关于您的 methods 参数。它期望一个列表/元组,但您正在传递一个字符串('GET')。请更改为 methods=('GET', )。请注意这里 'GET' 后面的逗号。或者为避免将来可能出现的混淆,使用 methods=['GET']。
第二个问题是您在 app.py 中导入 my_view 的方式。由于 views.py 和 app.py 在同一个目录中,并且您正在该目录中启动 flask 应用程序,因此可以直接执行以下操作:
from views import my_view

然而,你应该考虑将应用程序构建为Python Package
第三个问题是缺少from flask import Flask。也许你在发布代码时忽略了这个问题。
我使用以上修复的代码进行了测试,它能够正常工作。
编辑:感谢@dirn指出方法参数可以接受元组。

1
元组没问题。问题在于('GET')不是元组,它是一个字符串;而('GET',)才是元组。 - dirn
只是为了明确,当我在没有蓝图的情况下运行app.py,并将所有路由和业务逻辑保留在同一代码文件app.py中时,这些都可以正常工作,因此我认为装饰器、参数和业务代码不是问题,在测试后,我只是将一些东西移动到views.py作为一个好的项目结构并添加了蓝图,此后问题就出现了。 - Santhosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接