1

I need to pass a dictionary from a python script to a Django app. Therefore I'm using the following:

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)

The rssi_readings is the actual dictionary. Now in my Django app I have an url set up and do have a view defined as follows:

def rssi_import(request, rssi_readings):
    print "Test"
    cache.set('rssi_angle_reading', rssi_readings)
    return HttpResponse("Data submitted")

I'm not even seeing the print, so I think the server can't handle the data. After that I want to store the data in a cache, which shouldn't be a problem.

My dev server is up and running, but when I run the script I get an HTTP ERROR 500 with the following:

  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

I was hoping anyone can tell me what the problem is? Even trying to post a simple string didn't work. Thank you!!!

EDIT:

Here is my url.py. I have it split up in 2 files, but this should be the important one:

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:

Ok, I have just tried to not send the data in the request from the script and now I actually get something. The dev server says:

[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

So I'm very sure that the script works and my urls to, but somehow the stupid thing doesn't know what to do with the data.

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」行を使用して、上記を追加しました。また、単純なブラウザー呼び出しでサーバーの問題 (おそらく urls.py 内) をデバッグできるようにする GET ハンドラー。

于 2012-05-02T19:56:42.697 に答える
0

わかりました、私はついにそれを理解しました。

@Dan H末尾のスラッシュは正しかったので、実際には大きな違いがありました。削除すると、実際に403エラーが発生しました。

@Aleksej Vasinovが彼のコメントの1つですでに述べたように、403エラーが発生したことを確認した後、CSRFについて何かを見つけました。実はそれを使っていたことすら知らなかったのですが、設定ファイルではほぼ標準的なやり方のようです。私は今、この特定のビューに対して CSRF を免除しており、すべて正常に動作しています。

データを投稿できるようになり、とても満足しています。素晴らしいアイデアをありがとうございました。スタックオーバーフローに戻ります。:)

于 2012-05-03T16:22:46.033 に答える