我需要将字典从python脚本传递到Django应用程序。因此我使用以下内容:
def sendDataToApp(rssi_readings):
url = 'http://localhost:8000/world/rssi_import'
data = urllib.urlencode(rssi_readings)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
rssi_readings是实际的字典。现在在我的Django应用程序中,我设置了一个URL,并且确实具有如下定义的视图:
def rssi_import(request, rssi_readings):
print "Test"
cache.set('rssi_angle_reading', rssi_readings)
return HttpResponse("Data submitted")
我甚至没有看到打印,所以我认为服务器无法处理数据。之后我想将数据存储在缓存中,这应该不是问题。
我的开发服务器启动并运行,但是当我运行脚本时,我得到一个HTTP ERROR 500,其中包含以下内容:
File "autoorientation.py", line 245, in <module>
main()
File "autoorientation.py", line 241, in main
sendDataToApp(rssi_readings)
File "autoorientation.py", line 199, in sendDataToApp
response = urllib2.urlopen(req)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 444, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: INTERNAL SERVER ERROR
我希望有人能告诉我这是什么问题?即使尝试发布一个简单的字符串也行不通。谢谢!!!
编辑:
这是我的url.py.我将它拆分为2个文件,但这应该是重要的文件:
from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('world.views',
url(r'^$', 'index'),
url(r'^setup/$', 'setup'),
url(r'^redoscan/$', 'redoScan'),
url(r'^rssi_import/$', 'rssi_import'),
)
EDIT2:
好的,我刚刚尝试不在脚本的请求中发送数据,现在我真的得到了一些东西。开发服务器说:
[02/May/2012 15:32:46] "GET /world/rssi_import HTTP/1.1" 301 0
[02/May/2012 15:32:46] "GET /world/rssi_import/ HTTP/1.1" 200 14
所以我非常确定脚本是否有效以及我的网址,但不知何故,愚蠢的事情不知道如何处理数据。
答案 0 :(得分:3)
我不确定为什么你这样定义了你的视图函数:
def rssi_import(request, rssi_readings):
我认为可能会在你的urls.py定义中使用一些棘手的魔法。
但我认为更直接的方法是:只需从请求中读取POST数据:
def rssi_import(request):
rssi_readings = request.POST
# do something with rssi_readings here
return HttpResponse("Data submitted")
也许您应该检查这是否是一个POST,如果您的后续功能对返回的字典产生副作用,您可能至少需要一个浅的副本:
def rssi_import(request):
if request.method == 'POST':
rssi_readings = dict(request.POST)
# do something with rssi_readings here
return HttpResponse("Data submitted")
if request.method == 'GET':
return HttpResponse("rssi_import() reached. Now POST some RSSI data to me...")
这接近你所需要的吗?
EDIT / UPDATE:
别忘了,视图功能仍然需要返回有效的响应!我在上面添加了你的“返回”行。另外:一个GET处理程序,这样你就可以通过简单的浏览器调试服务器问题(可能在你的urls.py中)。
答案 1 :(得分:0)
好的,我终于明白了。
@Dan H你是正确的尾随斜线,它实际上使它有很大的不同。一旦删除我实际上有403错误。
在我收到403错误后,我发现了一些关于CSRF的事情,就像@Aleksej Vasinov在他的一条评论中已经提到的那样。我实际上甚至不知道我正在使用它,但它似乎几乎是设置文件中的标准方式。我现在有一个CSRF豁免这个特定的视图,一切正常。
我现在可以发布数据,非常高兴。谢谢你所有的好主意。我将回到stackoverflow。 :)