获取'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 <WSGIRequest path:/voice/number, GET:<QueryDict: u'id': [u'2083522792']>,
【参考方案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' 错误?