【问题标题】:Django Tastypie prepend_urls errorDjango Tastypie prepend_urls 错误
【发布时间】:2023-03-05 11:53:02
【问题描述】:

Django-tastypie 错误。我正在尝试 prepend_urls 以便我可以为用户列出朋友,但我收到错误 "NameError at /api/v1/friends/user/1/ global name 'url' is not defined"。 这是朋友资源的代码。

class FriendsResource(ModelResource):
      from_user=fields.ForeignKey(UserResource,'from_user')
      to_user=fields.ForeignKey(UserResource,'to_user')


      class Meta:
           queryset=Friends.objects.all()
           serializer=Serializer(formats=['json'])
           resource_name='friends'
           filtering={
                       'from_user':ALL_WITH_RELATIONS,
                       'to_user':ALL_WITH_RELATIONS

           }   

这里是 prepend_urls 的代码和放入 wrap_view 的方法。

def get_users(self,request):
       self.method_check(request,['get'])
       friends = []
       for friend in Friends.objects.filter(Q(from_user=request.user)|Q(to_user=request.user)):
            friends.append(friend)      

  def prepend_urls(self):
       return [

             url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/user%s$" %(self._meta.resource_name,trailing_slash()),
                   self.wrap_view('get_users'),name= 'api_get_friends_for_user')
               ]

这是回溯:

  Environment:

Request Method: GET
Request URL: http://localhost:8000/api/v1/friends/user/1/

Django Version: 1.6.2
Python Version: 2.7.3
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'tastypie',
 'userprof',
 'relations',
 'event',
 'liking',
 'feed')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/root/python/django-zack/local/lib/python2.7/site-packages/Django-1.6.2-py2.7.egg/django/core/handlers/base.py" in get_response
  101.                 resolver_match = resolver.resolve(request.path_info)
File "/root/python/django-zack/local/lib/python2.7/site-packages/Django-1.6.2-py2.7.egg/django/core/urlresolvers.py" in resolve
  318.             for pattern in self.url_patterns:
File "/root/python/django-zack/local/lib/python2.7/site-packages/Django-1.6.2-py2.7.egg/django/core/urlresolvers.py" in url_patterns
  346.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/root/python/django-zack/local/lib/python2.7/site-packages/Django-1.6.2-py2.7.egg/django/core/urlresolvers.py" in urlconf_module
  341.             self._urlconf_module = import_module(self.urlconf_name)
File "/root/python/django-zack/local/lib/python2.7/site-packages/Django-1.6.2-py2.7.egg/django/utils/importlib.py" in import_module
  40.         __import__(name)
File "/root/python/django-zack/wyat/wyat/urls.py" in <module>
  25.      url(r'^api/',include(v1_api.urls)),
File "/root/python/django-zack/local/lib/python2.7/site-packages/tastypie/api.py" in urls
  107.             pattern_list.append((r"^(?P<api_name>%s)/" % self.api_name, include(self._registry[name].urls)))
File "/root/python/django-zack/local/lib/python2.7/site-packages/tastypie/resources.py" in urls
  324.         urls = self.prepend_urls()
File "/root/python/django-zack/wyat/event/api.py" in prepend_urls
  68.                  url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/user%s$" %(self._meta.resource_name,trailing_slash()),

Exception Type: NameError at /api/v1/friends/user/1/
Exception Value: global name 'url' is not defined

请告诉我哪里错了,因为我使用了关于嵌套资源的食谱中的示例,但我看不出哪里错了。

【问题讨论】:

  • 你能检查一下你是否从 django.core.urlresolvers 导入解析。如果是这种情况,请告诉我
  • @Sumuga 即使在导入它之后,我仍然会遇到同样的错误。我的语法可能是错误的还是我使用的 django 版本是 1.6.1。

标签: python django api tastypie


【解决方案1】:

@Zacmwa

我有一个有效的 prepend_urls .. 你可以看看下面的例子。

def prepend_urls(self): 返回 [ url(r"^(?P%s)/生成%s$"% (self._meta.resource_name, trailing_slash()), self.wrap_view('genusr'), name="api_get_genusr"), ] def genusr(self, request, **kwargs): data = self.deserialize(request, request.body, format=request.META.get('Content-Type', 'application/json')) 打印(data.get('工作流',无)) child_resource = 用户资源() 返回 child_resource.get_list(请求)

以上方法封装在我的资源模型中。

错误很可能是由于缺少一些导入而导致请尝试导入 django.core.urlresolvers import resolve, from tastepie.utils import trailing_slash 并重试。让我知道当你这样做时会发生什么。

【讨论】:

  • 谢谢。我需要导入 django.conf.url。现在我唯一的问题是 url 的语法。我希望它显示 api/v1/friends/user/1 其中 1 是用户的 ID,但我收到错误消息 提供的资源查找数据无效。 我的 url 应该如何写。跨度>
  • 我将 prepend_urls 用于嵌套资源,因此我可以根据此问题stackoverflow.com/questions/19707400/… 中的第一个建议列出用户的朋友。你能告诉我如何做到这一点。我也可以按照我的 get_users 方法传递一个朋友数组。def get_users(self,request): self.method_check(request,['get']) friends = [] for friend in Friends,objects.filter(Q(from_user=request.user)|Q(to_user=request.user)): friends.append(friend)
  • 有一种方法可以做到这一点。您已经提到 user/ 后面将跟随您在 prepend_urls 方法中编写的正则表达式中的主键。看看下面的帖子。它有你上面提到的主键stackoverflow.com/questions/12877437/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2012-08-17
  • 2013-11-21
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多