1

我需要将字典从 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'),
)

编辑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

所以我非常确定脚本和我的网址可以正常工作,但不知何故,愚蠢的东西不知道如何处理数据。

4

2 回答 2

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...")

这接近你需要的吗?

编辑/更新:

别忘了,视图函数还是要返回一个有效的响应!我在上面添加了这个,使用你的“return”行。另外:一个 GET 处理程序,因此您可以通过简单的浏览器调用来调试服务器问题(可能在您的 urls.py 中)。

于 2012-05-02T19:56:42.697 回答
0

好的,我终于想通了。

@Dan H 你的斜杠是对的,它实际上有很大的不同。删除后,我实际上收到了 403 错误。

签出后我收到了 403 错误,我发现了一些关于 CSRF 的信息,正如 @Aleksej Vasinov 在他的评论中已经提到的那样。实际上我什至不知道我在使用它,但它似乎几乎是设置文件中的标准方式。我现在有一个针对这个特定视图的 CSRF 豁免,并且一切正常。

我现在可以发布数据并且非常高兴。谢谢你所有的好主意。我会回到stackoverflow。:)

于 2012-05-03T16:22:46.033 回答