【问题标题】:Is it equivalent to put something as part of the path and as a parameter?是否相当于将某些内容作为路径的一部分和作为参数?
【发布时间】:2015-11-22 18:58:33
【问题描述】:

现在我有两种方法可以在我的应用程序中完成(显然)相同的事情。我可以让我的网址看起来像这样https://something/product/shirthttps://something/product?q=shirt。在这两种情况下,我都可以从中提取出我需要的东西,那就是衬衫。

第一种方式(使用正则表达式):

class FirstHandler(BaseHandler):
    def get(self, page_id):
        target = page_id

PAGE_RE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'
app = webapp2.WSGIApplication([('/something' + PAGE_RE, FirstHandler)],
                               debug=True)

我可以处理它的第二种方法是使用一个参数,它看起来像这样:

class SecondHandler(BaseHandler):
    def get(self):
        target = self.request.get('q')

app = webapp2.WSGIApplication([('/something' SecondHandler)],
                               debug=True)

我的问题是,这些方法是否等效?如果我做一个或另一个是否相同,或者我必须考虑其他事情?

【问题讨论】:

    标签: google-app-engine url webapp2


    【解决方案1】:

    查看您希望发出的所有请求,并决定其中哪些应由唯一端点 (/shirt) 表示,哪些将允许一个或多个参数。您可以在必要时结合使用这些方法。

    使用 url 路径或参数没有性能损失或任何其他优势。关键因素是:

    • 如果您的 API 被或将被外部开发人员使用,那么理解它是多么容易
    • 组织和维护代码是多么容易
    • 当您需要扩展时,您的方法有多灵活

    例如,/shirt 现在看起来可能是个好主意,但是一旦您拥有数千种产品类型,维护它就变成了一场噩梦。相反,您可能想要使用类似的东西:

    /product/?type=shirt&size=10&orderBy=price&results=20&offset=40
    

    【讨论】:

      【解决方案2】:

      app.yaml 可以根据 URL 为您预先路由(到不同的 WSGI 应用程序——甚至在 dispatch.yaml 的帮助下,到不同的模块),但不是 基于对给定 URL 的特定查询。

      因此,如果您将资源标识为 /something/product/shirt,您可能在未来“以管理方式”(通过更改 app.yaml 和可能 dispatch.yaml 配置文件,而不是 Python 代码)预先将某些产品路由到不同的 WSGI 应用程序甚至模块;如果您将其标识为/something/product?q=shirt,则基于配置文件的管理路由将仅针对基于/something/product 的单个WSGI 应用程序,然后由服务于该应用程序的代码来处理查询部分.

      因此,在其他条件相同的情况下,您可能更喜欢使用 URL 来为未来保留更多路由灵活性。查询部分对于诸如可选参数和顺序独立性之类的东西很宝贵——想象一下,例如/something/product/shirt?fmt=json&size=xl,其中fmtsize 都是可选的,具有一些默认值,并且可以选择以任何顺序出现,这将是令人讨厌/复杂的仅在使用查询很容易实现时才使用 URL。

      但是,带有单个 强制 参数的“查询语法”是(适度的)“API 设计味道”——而且不仅仅是在 App Engine 中;虽然 App Engine 有自己的路由和分派机制,但它们与您对其他服务器的期望并没有特别不同。

      【讨论】:

      • 感谢您的回答。目前应用程序很小,不会获得太多流量,所以我对性能很感兴趣(现在我知道它不受决定的影响)。我会在未来的项目中考虑您所说的。
      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 2020-10-04
      相关资源
      最近更新 更多