获取'str'对象在Django中没有属性'get'

Posted

技术标签:

【中文标题】获取\'str\'对象在Django中没有属性\'get\'【英文标题】:Getting 'str' object has no attribute 'get' in Django获取'str'对象在Django中没有属性'get' 【发布时间】:2014-05-12 08:38:16 【问题描述】:

views.py

def generate_xml(request, number):
    caller_id = 'x-x-x-x'
    resp = twilio.twiml.Response()

    with resp.dial(callerId=caller_id) as r:
         if number and re.search('[\d\(\)\- \+]+$', number):
            r.number(number)
         else:
             r.client('test')
   return str(resp)

url.py

url(r'^voice/(?P<number>\w+)$', 'django_calling.views.generate_xml', name='generating TwiML'),

每当我请求http://127.0.0.1:8000/voice/number?id=98 时都会出现以下错误:

Request Method:     GET
Request URL:    http://127.0.0.1:8000/voice/number?id=90
Django Version:     1.6.2
Exception Type:     AttributeError
Exception Value:    'str' object has no attribute 'get'

Exception Location:     /usr/local/lib/python2.7/dist-     

完整追溯:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/voice/number?id=90

Django Version: 1.6.2
Python Version: 2.7.5
Installed Applications:
 ('django.contrib.admin',
'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_calling',
'django_twilio',
'twilio')
 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')

我刚刚开始学习Django

【问题讨论】:

你确定,这个视图被调用了吗?在该视图中放置一个 pdb 以确保调用该视图。 请发布完整的回溯。 【参考方案1】:

Django 视图必须始终返回一个 HttpResponse 对象,因此请尝试将该字符串包装在 HttpResponse 中:

from django.http import HttpResponse
return HttpResponse(str(resp))

此外,generate_xml 中的 number 变量将仅包含字符串 'number',而不包含 GET 参数。为此,您可以使用:

request.GET.get('id')

【讨论】:

它可以工作,但打印的是r.clinet('test')而不是r.number(number)?任何想法?如果我直接返回任何整数,则会给出相同的错误 你确定你的正则表达式是正确的吗?请记住,您返回的任何内容都必须包装在 HttpResponse 中,因此如果您要返回整数,则必须返回 HttpResponse(str(the_number))。 @PrashantGaur 实际上这里的逻辑很简单。我只是请求一个调用views.py中编写的方法的url print repr(number), re.search('[\d\(\)\- \+]+$', number)with 行之后的输出是什么? 啊哈!我很抱歉 。你是对的,我用 pdb 进行了检查,它只是给出了一个字符串 number,这是堆栈跟踪:Pdb) request &lt;WSGIRequest path:/voice/number, GET:&lt;QueryDict: u'id': [u'2083522792']&gt;, 【参考方案2】:

您不能直接将 str 作为 django response 传递。 你必须使用

from django.http import HttpResponse

如果您想将字符串数据呈现为 django 视图响应。 看看django.http.HttpResponse

返回 HttpResponse(resp)

【讨论】:

它可以工作,但打印的是 r.clinet('test') 而不是 r.number(number)?任何想法?如果我直接返回任何整数,则会给出相同的错误 可能会有变化,它总是进入 else 语句。我会建议你再次交叉检查你的 re 和你的逻辑以获取手机或客户号码。 return HttpResponse(resp) 而不是return Httpresponse(resp)

以上是关于获取'str'对象在Django中没有属性'get'的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:'str'对象没有属性'regex'django 1.9

Django-channels:AttributeError:'str'对象没有属性'profile'

AttributeError:'unicode'对象没有属性'get' - 在Django Forms中

Django 2.2 + AttributeError:'str'对象没有属性'decode'

django 模板中的 for 循环 - 列表对象没有属性“get”

AttributeError:'Manager' 对象在 Django 中没有属性 'get_by_natural_key' 错误?