Python 烧瓶-在某些路线上获得404不一致

Python 烧瓶-在某些路线上获得404不一致,python,flask,quart,Python,Flask,Quart,问题很简单 #This works @app.route("/projects") def user_home(): return 'projects' #This works @app.route("/projects/new", methods=["GET", "POST"]) def create_project(): return 'new project' #This works @app.route("/projects/<project_id>")

问题很简单

#This works
@app.route("/projects")
def user_home():
    return 'projects'

#This works
@app.route("/projects/new", methods=["GET", "POST"])
def create_project():
    return 'new project'

#This works
@app.route("/projects/<project_id>")
async def project_detail(project_id):
    return 'project detail'

#This works
@app.route("/projects/<project_id>/tasks")
def user_tasks(project_id):
    return 'project tasks'

#This gives a 404
@app.route("/projects/<project_id>/tasks/new", methods=["GET", "POST"])
def create_task(project_id):
    return 'new project task'

#This works
@app.route("/projects/<project_id>/tasks/<task_id>")
async def task_detail(project_id, task_id):
    return 'task detail'
#这很有效
@应用程序路线(“/项目”)
def user_home():
返回“项目”
#这很有效
@app.route(“/projects/new”,methods=[“GET”,“POST”])
def create_project():
返回“新项目”
#这很有效
@应用程序路线(“/projects/”)
异步def项目详细信息(项目id):
返回“项目详细信息”
#这很有效
@app.route(“/projects//tasks”)
def用户任务(项目id):
返回“项目任务”
#这给出了一个404
@app.route(“/projects//tasks/new”,methods=[“GET”,“POST”])
def创建任务(项目id):
返回“新项目任务”
#这很有效
@app.route(“/projects//tasks/”)
异步定义任务详细信息(项目id、任务id):
返回“任务详细信息”
最后一条路线是给我一个404,尽管它遵循与上面相同的逻辑

这里发生了什么

如果我能更好地设计我的路线,我愿意接受建议,这是一个简单的master/detail/CRUD应用程序


(标记Quart,因为我实际使用的是Quart,但现在我假设这无关紧要,因为它与烧瓶具有相同的api)

没有收到任何错误您的代码有关,请重新检查。但也许你可以试试

@app.route("/projects/<project_id>/tasks/new_task/", methods=["GET", "POST"])
def create_task(project_id):
    return 'new project task'
@app.route(“/projects//tasks/new_task/”,方法=[“GET”,“POST”])
def创建任务(项目id):
返回“新项目任务”

我对您的代码没有任何错误,请重新检查。但也许你可以试试

@app.route("/projects/<project_id>/tasks/new_task/", methods=["GET", "POST"])
def create_task(project_id):
    return 'new project task'
@app.route(“/projects//tasks/new_task/”,方法=[“GET”,“POST”])
def创建任务(项目id):
返回“新项目任务”
根据,关键问题是解释时,Werkzeug缺少正斜杠,这反过来会产生404错误

您的/用户路由缺少尾随斜杠,Werkzeug将其解释为与尾随斜杠不匹配的显式规则。添加尾随斜杠,如果url没有,Werkzeug将重定向,或者在路由上设置strict_slashes=False,Werkzeug将匹配带斜杠或不带斜杠的规则

根据报告:

以斜杠结尾的URL规则是分支URL,其他规则是叶子。如果启用了严格的_斜杠(这是默认设置),则访问的所有分支URL如果没有尾部斜杠,则会触发重定向到附加该斜杠的同一URL

因此,对于您的情况,您可以尝试:

@app.route(“/projects//tasks/new”,methods=[“GET”,“POST”],strict_slashes=False)
def创建任务(项目id):
返回“新项目任务”
根据,关键问题是解释时,Werkzeug缺少正斜杠,这反过来会产生404错误

您的/用户路由缺少尾随斜杠,Werkzeug将其解释为与尾随斜杠不匹配的显式规则。添加尾随斜杠,如果url没有,Werkzeug将重定向,或者在路由上设置strict_slashes=False,Werkzeug将匹配带斜杠或不带斜杠的规则

根据报告:

以斜杠结尾的URL规则是分支URL,其他规则是叶子。如果启用了严格的_斜杠(这是默认设置),则访问的所有分支URL如果没有尾部斜杠,则会触发重定向到附加该斜杠的同一URL

因此,对于您的情况,您可以尝试:

@app.route(“/projects//tasks/new”,methods=[“GET”,“POST”],strict_slashes=False)
def创建任务(项目id):
返回“新项目任务”

但浏览器没有尝试使用尾部斜杠url\u访问它,以便正确生成
../tasks/new
。添加严格的斜杠不起作用。如果同时使用
/projects//tasks
/projects//tasks/new
这两个路径会使一个路径与另一个路径混淆,是否会有问题?如果您尝试将正斜杠添加到两个路由中,会起作用吗?@Mojimi,构建似乎是正确的,但它从
../tasks/
路由的角度处理
/tasks/new
,将
new
作为id,因为缺少正斜杠。问题是,没有斜线的路线是有效的,因为它是一条不同的路线。我强烈建议在
…tasks/new/
中添加正斜杠,使其成为一个新路由(分支),而不是另一个路由的元素。但浏览器不会尝试使用尾部斜杠url\u访问它,以正确生成
../tasks/new
。添加严格的斜杠不起作用。如果同时使用
/projects//tasks
/projects//tasks/new
这两个路径会使一个路径与另一个路径混淆,是否会有问题?如果您尝试将正斜杠添加到两个路由中,会起作用吗?@Mojimi,构建似乎是正确的,但它从
../tasks/
路由的角度处理
/tasks/new
,将
new
作为id,因为缺少正斜杠。问题是,没有斜线的路线是有效的,因为它是一条不同的路线。我强烈建议将正斜杠添加到
…tasks/new/
,使其成为一个新路由(分支),而不是另一个路由的元素。抱歉,错误基于我忘记添加的另一个路由,现在编辑抱歉,错误基于我忘记添加的另一个路由,现在编辑