如何将字典从python脚本发布到django url?

如何将字典从python脚本发布到django url?,python,django,httpresponse,Python,Django,Httpresponse,我需要将一个字典从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.ur

我需要将一个字典从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)
  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
rssi_读数是实际的字典。现在,在我的Django应用程序中,我设置了一个url,并定义了一个视图,如下所示:

def rssi_import(request, rssi_readings):
    print "Test"
    cache.set('rssi_angle_reading', rssi_readings)
    return HttpResponse("Data submitted")
我甚至没有看到打印,所以我认为服务器无法处理数据。之后,我想将数据存储在缓存中,这应该不是问题

我的dev服务器已启动并正在运行,但当我运行脚本时,会出现HTTP错误500,如下所示:

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)
  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
编辑2:

好的,我刚刚试着不从脚本发送请求中的数据,现在我实际得到了一些东西。开发服务器说:

[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

因此,我非常确定脚本可以正常工作,我的URL可以指向,但不知何故,这个愚蠢的家伙不知道如何处理数据。

我不知道为什么您会这样定义视图函数:

def rssi_import(request, rssi_readings):
我想这可能与URL.py定义中的一些棘手的魔法有关

但我认为更直接的方法是:从请求中读取POST数据:

def rssi_import(request):
    rssi_readings = request.POST
    # do something with rssi_readings here
    return HttpResponse("Data submitted")    
也许您应该检查这是否是一篇文章,如果您的后续函数对返回的词典有副作用,您可能至少需要一份浅拷贝:

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...")
这接近你需要的吗

编辑/更新:


别忘了,view函数仍然必须返回一个有效的响应!我在上面用你的“返回”行加了这个。另外:一个GET处理程序,您可以通过一个简单的浏览器调用调试服务器问题(可能在您的url.py中)。

好的,我终于找到了答案

@Dan H你对尾随斜杠的理解是对的,它实际上使它有了很大的不同。一旦删除,我实际上得到了一个403错误

在与我核对后,我发现了一个403错误,我发现了一些关于CSRF的信息,正如@Aleksej Vasinov在他的评论中已经提到的那样。实际上我甚至不知道我在使用它,但它似乎几乎是设置文件中的标准方式。我现在有一个CSRF豁免这个特定的观点,一切都很好


我现在可以发布数据了,我非常高兴。谢谢你所有的好主意。我马上就回来。:)

发布数据时是否使用CSRF?Django应用程序的日志会说什么?而且,可以肯定的是,发布脚本可能没有在同一个Django开发服务器上运行?@AleksejVasinov不,我认为我没有使用CSRF,因为我不知道它是什么@masterlampe rssi_读数不会作为变量传递给函数,它将在
请求中。POST
中。这个错误看起来你甚至可以提出请求,这就是为什么你看不到印刷品的原因。嗯,我只是试着把它放进去,但没有任何运气。仍然是相同的错误。您确定正在调用rssi_import()吗?也可能是你的URL.py中的错误。当然,我仍然在那里返回。我非常确定它被调用,因为我的django开发服务器显示[02/May/2012 15:11:16]“POST/world/rssi_import HTTP/1.1”500 63689。我想我的URL.py是正确的。这并不意味着您的视图函数被正确调用,或者根本没有被调用。请注意,您的urls.py使用尾随斜杠定义URL,但您的客户端没有。(这实际上很重要。)您的服务器正在执行“重定向”(301行)。。。但我不确定客户是否在301之后重新发布了原始尸体。您是否尝试过:a)在客户端中,打印出URL编码的数据(以确保没有异常,b)在视图代码中,打印出request.POST的内容?