【问题标题】:2 GET routes to same Resource in Flask-RESTful2 GET 路由到 Flask-RESTful 中的相同资源
【发布时间】:2019-05-23 09:30:52
【问题描述】:

我正在学习 Flask-RESTful,我有以下任务要做:

有这 2 条 GET 路由

GET /student/id(获取学生详细信息,按 ID 搜索学生)
GET /student/id/grades(获取学生成绩,按ID搜索学生)

如果我不想在学生 GET 函数中使用 if 语句,我该如何实现呢? 我必须创建 2 个不同的资源?学生和成绩列表?

谢谢,阿隆

【问题讨论】:

    标签: python rest flask-restful


    【解决方案1】:

    将顺序改为

    /student/id/grades
    
    /student/id
    

    发生错误是因为路线搜索按您列出它们的顺序进行。

    例如。假设您有两条路线如下: /a/b/a/ 让我们考虑两种情况 -

    订单 1

    /a/

    /a/b/

    现在,如果您搜索/a/<some id>,那么它会匹配第一条路线,并且您会被相应地路由。同样,当您搜索 /a/b/<some id> 时,前缀即 /a/ 再次匹配,您将被路由到第一个路由。

    订单 2-

    /a/b/

    /a/

    现在,如果您搜索 /a/<some id>,那么它与第一条路由不匹配(​​因为前缀 /a/b/ 不匹配)。但是第二条路由匹配,您将被相应地路由。或者,如果您搜索/a/b/<some id>,则第一条路由匹配。然后您将被路由到正确的 URL。

    根据经验,请记住将更特殊的情况放在首位。

    【讨论】:

    • 感谢您的回答,但我的问题是关于如何构建资源。我没有错误。我的问题是是否以及如何为学生资源提供多个 GET 功能。谢谢
    【解决方案2】:

    是的,您应该创建 2 个不同的资源,如下所示:

    from flask_restful import Api
    
    api = Api(app)
    
    class StudentResource(Resource):
    
        def get(self, id):
            // Your code here. This is an example
            student = Student.get(id)
    
    class GradeListResource(Resource):
    
        def get(self, id):
            // Your code here. This is an example
            student = Student.get(id)
            grades = studen.grades()
    
    api.add_resource(StudentResource, '/student/<int:id>', endpoint='student_resource')
    api.add_resource(GradeListResource, '/student/<int:id>/grades', endpoint='grade_list_resource')
    

    【讨论】:

      【解决方案3】:

      当然,您需要创建 2 个不同的资源,因为同一 Resource 类中的第二个 GET 将覆盖第一个。

      但是,您仍然可以使用简单的 Flask API 而不是 flask_restful。 你可能会发现这个帖子很有用:Using basic Flask vs Flask-RESTful for API development

      更重要的是:Flask RESTful API multiple and complex endpoints

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        相关资源
        最近更新 更多