1

问题很简单

#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'

最后一条路线给了我一个 404,即使它遵循与上述相同的逻辑。

这里发生了什么?

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

(在我实际使用 Quart 时标记 Quart,但现在我认为这并不重要,因为它与烧瓶具有相同的 api)

4

2 回答 2

0

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

@app.route("/projects/<project_id>/tasks/new_task/", methods=["GET", "POST"])
def create_task(project_id):
    return 'new project task'
于 2019-08-09T18:05:36.677 回答
0

根据this answer,关键问题是缺少正斜杠 by 的解释Werkzeug,这反过来会导致 404 错误。

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

根据文档

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

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

@app.route("/projects/<project_id>/tasks/new", methods=["GET", "POST"], strict_slashes=False)
def create_task(project_id):
    return 'new project task'
于 2019-08-09T18:48:36.860 回答