2012-04-10 8 views
0

私はDjango Rest Frameworkを使ってAPIを構築し、開発マシンに実装しています。私は今日すぐにそれを展開したいと思っていました。私は依存関係を再インストールし、Djangoを再インストールし、数時間バグを見つけたが、この最新のものは私とGoogleを打ち負かした。Django Rest Frameworkから呼び出されたPython Urbjectの不思議なエラー

フレームワークからビューの1つを呼び出すと、正しい応答が得られます(静的ファイルは除いていますが、後でそれを扱います)。しかし、デプロイメントマシンでは、次のエラーが発生します。

'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 ere。私がDjango 1.2,1.3,1.4のデプロイメントサーバで試してみたが、そのエラーはDjango自身とは無関係のようだ。

はここで完全なトレースバックです:

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

私の推測では、Pythonのバージョンの不一致で見ているエラーを説明するだろう_replace方法を、持っていないtupleのサブクラスでした。私の2.7は本当に '_replace'を持っていますが、私はそこにドキュメントを見つけることができません。 –

答えて

1

あなたの開発マシンと配備マシンが異なるPythonバージョンを実行していると思われます。 Python docs for SplitResultには内部の_replaceメソッドについては何も言及されていませんが、先頭のアンダースコアは内部APIであることを示しています。これはDjango Rest Frameworkのバグです。バグレポートを提出することをお勧めします。

好奇心が強い場合、SplitResultnamedtuple(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='') 

私は、Python <にSplitResultのバージョンを信じ2.6は、あなたが

+0

もちろん!それは素晴らしいです、ありがとうございます。私はPythonのバージョンがnamedtupleのために私の心に入り込んだと思うが、私のサーバは2.5だったのでチェックしていないと思った。もちろん、実際には2.4です。どうもありがとう。私はあなたの答えを+1しますが、私はまだ評判がありません。 –

関連する問題