【问题标题】:Difference between prepend_urls and urlpatterns in urls.pyurls.py 中 prepend_urls 和 urlpatterns 的区别
【发布时间】:2015-03-12 19:48:34
【问题描述】:

我在 Django 上有一个带有 TastyPie 的 REST API,其中包括一个资源,比如 ProductResource。此资源可通过http://my_url/api/product 访问。

我的ProductResource 类中还有一个名为addNew 的函数,它应该处理添加新产品的请求。我想将此方法链接到诸如http://my_url/api/product/new 之类的url。

一种选择是像这样覆盖prepend_urls

def prepend_urls(self):
    return [
        url(r"^(?P<resource_name>%s)/addNew%s$" %
            (self._meta.resource_name, trailing_slash()),
            self.wrap_view('addNew'), name="product_add_new"),
    ]

这按预期工作。我假设另一个选项是使用 urls.py,并在那里定义终点。我试过这样做,并将这一行添加到我的urlpatterns

url(r"^(?P<resource_name>ProductResource)/addNew/$", ProductResource.addNew, name="product_add_new")

当我这样做时,我收到以下错误:

unbound method addNew() must be called with ProductResource instance as first argument (got WSGIRequest instance instead)

这是可以理解的。所以我的问题是,是否可以通过urls.py 而不是prepend_urls 将资源中的方法绑定到url?如果是,正确的语法是什么?如果不是,prepend_urlsurls.py 有什么区别?

谢谢

【问题讨论】:

    标签: django rest tastypie


    【解决方案1】:

    好吧,您不能将 addNew 之类的方法直接映射到 url,因为 url() 中使用的可调用对象必须接收请求作为第一个参数。如果您真的想将 url 映射到资源方法,您可以这样做:

    def my_view(request):
        resource = MyResource(api_name='myapi')
        resource.addNew(request)
    

    然后在 url() 中映射这个视图

    url(r"^(?P<resource_name>ProductResource)/addNew/$", my_view, name="product_add_new")
    

    关于prepend_urls() 发生的情况是,您在 url() 中用作可调用对象的是wrap_view() 的返回,而不是方法本身。 wrap_view() 返回的是一个将请求作为其第一个参数的可调用对象。

    https://github.com/django-tastypie/django-tastypie/blob/master/tastypie/resources.py#L188

    【讨论】:

      猜你喜欢
      • 2017-06-30
      • 2012-11-09
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多