2012-04-10 13 views
0

Ich verwende die Django Rest Framework, um eine API zu erstellen, und eine Implementierung auf meinem Entwicklungscomputer. Ich wollte es heute schnell bereitstellen und es erweist sich als weitaus fehleranfälliger als erwartet. Ich habe Dependancen neu installiert, Django neu installiert, Stunden damit verbracht, Bugs zu jagen, aber diese letzte hat mich und Google besiegt.Mysteriöse Fehler in Python Urlobject von Django Rest Framework aufgerufen

Auf dem Entwicklungscomputer, wenn ich eine der Ansichten aus dem Framework aufrufen, bekomme ich die richtige Antwort (minus die statischen Dateien, aber ich werde später damit umgehen.) Auf der Deployment-Maschine bekomme ich diesen Fehler:

'SplitResult' object has no attribute '_replace' 

die Zurückverfolgungs gehen durch einen Template-Tag in dem anderen Rahmen, aber der Fehler scheint in diesem Verfahren in urlobject geworfen werden:

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

ich das auf meiner Entwicklung Maschine nicht wiedergeben kann, und ich finde keine Hinweise auf diesen Fehler anywh ehe. Nur für den Fall, dass ich es auf dem Deployment Server mit Django 1.2, 1.3 und 1.4 versucht habe, aber der Fehler scheint nichts mit Django zu tun zu haben. Hier

ist die vollständige Rückverfolgung:

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' 

Dies ist mein erstes Mal auf Stack-Überlauf - danke für die Hilfe.

+0

Meine Vermutung sehen ist Mismatch Python-Version. Mein 2.7 hat zwar einen '_replace', aber ich kann keine Dokumente darüber finden. –

Antwort

1

Ich vermute, dass Ihre Entwicklungs- und Deployment-Maschinen verschiedene Python-Versionen ausführen. Die Python docs for SplitResult erwähnen nichts über die interne Methode _replace, aber der führende Unterstrich schlägt vor, dass es eine interne API ist. Dies ist ein Django Rest Framework Bug, ich schlage vor, einen Fehlerbericht mit ihnen einzureichen. Wenn Sie neugierig sind, SplitResult ist eine Unterklasse von namedtuple (in Python 2.6 eingeführt). Es dauert Kwargs und gibt eine neue SplitResult mit den relevanten Werten ersetzt.

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='') 

Ich glaube, die Version von SplitResult in Python < 2.6 eine Unterklasse von tuple war, die keine _replace Methode hat, die den Fehler erklären würde, die Sie

+0

Natürlich! Das ist großartig, danke. Ich denke, die Python-Version kam mir aufgrund des Nametuple in den Sinn, aber ich dachte, mein Server hätte 2.5, also habe ich nicht nachgesehen. Es ist natürlich 2.4. Danke vielmals. Ich würde deine Antwort +1 geben, aber ich habe den Ruf noch nicht. –