2012-04-10 12 views
0

Django Rest Framework을 사용하여 API를 빌드하고 개발 컴퓨터에서 구현했습니다. 오늘 빨리 배포하고 싶었는데 예상했던 것보다 훨씬 오류가 많았습니다. 나는 의존성을 다시 설치하고, 장고를 다시 설치하고, 버그를 사냥하면서 시간을 보냈지 만,이 최신 기사는 저와 구글을 물리 쳤습니다.Python에서 이상한 오류가 발생했습니다. 장고 Rest 프레임 워크에서 호출 된 Urlobject

개발 컴퓨터에서 프레임 워크의 뷰 중 하나를 호출하면 올바른 응답 (정적 파일을 제외하고 나중에 처리하겠습니다.)이 표시됩니다. 그러나 배포 컴퓨터에서이 오류가 발생합니다.

'SplitResult' object has no attribute '_replace' 

역 추적 나머지 프레임 워크에서 템플릿 태그를 통해 이동하지만, 오류가이 방법에 urlobject에 던져 질 것 같다

def __replace(self, **replace): 
     """Replace a field in the ``urlparse.SplitResult`` for this URL.""" 
     return type(self)(urlparse.urlunsplit(
      urlparse.urlsplit(self)._replace(**replace))) 

내 개발 시스템에서이를 재현 할 수없는, 그리고 anywh이 오류에 대한 참조를 찾을 수 없습니다. 오히려. 내가 장고 1.2, 1.3, 1.4를 사용하여 배포 서버에서 시도한 경우를 대비하여 오류가 장고 자체와 관련이없는 것으로 보입니다.

여기에 전체 역 추적입니다 :

Django Version: 1.3.1 
Python Version: 2.5.2 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'char', 
'djangorestframework'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/python2.5/site-packages/django/views/generic/base.py" in view 
    47.    return self.dispatch(request, *args, **kwargs) 
File "/usr/lib/python2.5/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    39.   resp = view_func(*args, **kwargs) 
File "/usr/lib/python2.5/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    52.   return view_func(*args, **kwargs) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/django-rest-framework/djangorestframework/views.py" in dispatch 
    243.   return self.final(request, response, *args, **kwargs) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/django-rest-framework/djangorestframework/views.py" in final 
    196.   return self.render(response) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/django-rest-framework/djangorestframework/mixins.py" in render 
    251.    content = renderer.render(response.cleaned_content, media_type) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/django-rest-framework/djangorestframework/renderers.py" in render 
    351.   ret = template.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    123.    return self._render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render_node 
    757.   return node.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/loader_tags.py" in render 
    127.   return compiled_parent._render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in _render 
    117.   return self.nodelist.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render_node 
    757.   return node.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/defaulttags.py" in render 
    311.    return self.nodelist_true.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render_node 
    757.   return node.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/defaulttags.py" in render 
    227.     nodelist.append(node.render(context)) 
File "/usr/lib/python2.5/site-packages/django/template/defaulttags.py" in render 
    500.   output = self.nodelist.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    744.     bits.append(self.render_node(node, context)) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render_node 
    757.   return node.render(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in render 
    792.    output = self.filter_expression.resolve(context) 
File "/usr/lib/python2.5/site-packages/django/template/base.py" in resolve 
    536.     new_obj = func(obj, *arg_vals) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/django-rest-framework/djangorestframework/templatetags/add_query_param.py" in add_query_param 
    7.  return unicode(URLObject(url).with_query(param)) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/urlobject/lib/urlobject/urlobject.py" in with_query 
    117.   return self.__replace(query=query) 
File "/home/wfrp/wfrp-django/DjangoWfrp/external apps/urlobject/lib/urlobject/urlobject.py" in __replace 
    181.    urlparse.urlsplit(self)._replace(**replace))) 

Exception Type: AttributeError at /api/ 
Exception Value: 'SplitResult' object has no attribute '_replace' 

이 스택 오버플로 내 처음이다 - 도움을 주셔서 감사합니다.

+0

내 생각을보고있는 오류입니다 파이썬 버전 불일치를 설명 할 것 _replace 방법을 가지고 있지 않습니다 tuple의 서브 클래스이었다 생각합니다. 내 2.7 사실'_replace'를 가지고 있지만 그것에 문서를 찾을 수 없습니다. –

답변

1

개발 및 배포 컴퓨터에서 다른 Python 버전이 실행되고있는 것 같습니다. Python docs for SplitResult은 내부의 _replace 메서드에 대해서는 언급하지 않았지만 앞에있는 밑줄은 내부 API임을 암시합니다. 장고 Rest 프레임 워크 버그입니다. 버그 리포트를 제출하는 것이 좋습니다.

호기심이 있다면 은 namedtuple (Python 2.6에서 소개 됨)의 하위 클래스입니다. kwargs가 걸리고 관련 값이 대체 된 새 SplitResult을 반환합니다.

In [16]: sr = urlparse.urlsplit("http:///www.google.com") 

In [17]: sr 
Out[17]: SplitResult(scheme='http', netloc='', path='/www.google.com', query='', fragment='') 

In [18]: sr._replace(scheme='https') 
Out[18]: SplitResult(scheme='https', netloc='', path='/www.google.com', query='', fragment='') 

는 파이썬 < 2.6 SplitResult의 버전이

+0

물론! 그거 훌륭해, 고마워. 내 생각에 파이썬 버전은 namedtuple 때문에 내 마음에 들어갔다.하지만 나는 내 서버가 2.5라고 생각했기 때문에 체크하지 않았다. 물론 실제로 2.4입니다. 많은 감사합니다. 나는 당신의 대답을 +1 하겠지만 나는 아직 명성이 없다. –