2012-05-02 10 views
1

PythonスクリプトからDjangoアプリに辞書を渡す必要があります。したがって、私は以下を使用しています:PythonスクリプトからdjangoのURLに辞書をポストする方法は?

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は実際の辞書です。今、私が設定したURLを持っているし、次のように定義されたビューを持っている私のDjangoのアプリで:

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

私もプリントが表示されませんので、私は、サーバーがデータを扱うことができないと思います。その後、データをキャッシュに保存する必要がありますが、これは問題ではありません。

私のdevのサーバーが稼働しているが、私は、スクリプトを実行すると、私は次のようにHTTPエラー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:

[OK]を、私はちょうど今、スクリプトから、要求にデータを送信しないようにしようとしているI実際に何かを得る。 devのサーバーは言う:

[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を、何とか愚かなことは、データをどのように処理するかを知りません。

+1

は、データを投稿したときに、CSRFを使用していますか? –

+0

Djangoアプリのログは何を表していますか? –

+0

そして、ちょうど確かに、投稿スクリプトが同じDjangoデベロッパーサーバーで実行されているのではないでしょうか? –

答えて

0

私はついにそれを理解しました。

@ダン・Hあなたは後ろにスラッシュを置いていて、それは実際に大きな違いをもたらしました。一度削除すると、実際には403エラーが発生しました。

私は403エラーを得たとチェックアウト後、私は@Aleksej Vasinovはすでに彼のコメントの1で述べたのと同様に、CSRFについて何かを発見しました。私は実際に私がそれを使っていることを知らなかったが、それは設定ファイルのほぼ標準的な方法のようだ。私は今、この特定のビューに対して免除されたCSRFを持っており、すべて正常に動作します。

私は今、データをポストし、とても幸せですできます。あなたの素晴らしいアイデアをありがとう。私はstackoverflowに戻ってきます。 :)

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であれば、そしてあなたの後に関数が副作用をpeform場合は、おそらくあなたがチェックする必要があります返される辞書に、あなたは少なくともシャローコピーをお勧めします:

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:

は忘れてはいけないが、ビュー機能は、まだ有効な応答を返すことがあります!私はあなたの "リターン"ラインを使って上記を追加しました。また、簡単なブラウザー呼び出しでサーバーの問題(おそらくurls.py内)をデバッグできるように、GETハンドラー。

+0

まあ、私はちょうどそれを入れてみましたが、運が全くありません。それでも同じエラーです。 – masterlampe

+0

rssi_import()も呼び出されていますか? urls.pyにもエラーがあります。 –

+0

もちろん私はまだそこに戻りました。私はそれが[02 /月/ 2012年午前15時11分16秒]「POST /世界/ rssi_import HTTP/1.1」500 63689.そして、私は私が正しいurls.pyを持っていると思う私のジャンゴのdevのサーバーを表示しているためと呼ばれています非常に確信しています。 – masterlampe

関連する問題