[解決済み】DjangoアプリケーションにAjaxを統合するには?
質問
私はDjangoの初心者であり、Ajaxのかなり初心者です。私は、この2つを統合する必要があるプロジェクトに取り組んでいます。この2つの背後にある原理は理解しているつもりですが、この2つを一緒に説明する良い方法を見つけられませんでした。
この2つを統合することで、コードベースがどのように変化しなければならないか、どなたか簡単に説明していただけませんか?
例えば
HttpResponse
それとも、Ajaxを使用することによって、レスポンスが変わらなければならないのでしょうか?その場合、リクエストに対するレスポンスがどのように変わらなければならないか、例を挙げて教えていただけませんか?もし違いがあるのなら、私が返しているデータはJSONです。
どのように解決するのですか?
完全にSOの精神に則っているわけではないにせよ、この質問は大好きです!私も始めた頃は同じように困っていたので、簡単にご案内します。明らかにあなたはそれらの背後にある原理を理解していません(悪気はないのですが、理解していれば質問することはないでしょう)。
Djangoは
サーバーサイド
. つまり、クライアントがあるURLにアクセスしたとすると、そのURLの中にある関数
views
をレンダリングし、HTMLでレスポンスを返す。例題に分けましょう。
views.py。
def hello(request):
return HttpResponse('Hello World!')
def home(request):
return render_to_response('index.html', {'variable': 'world'})
index.htmlです。
<h1>Hello {{ variable }}, welcome to my awesome site</h1>
urls.py。
url(r'^hello/', 'myapp.views.hello'),
url(r'^home/', 'myapp.views.home'),
これは最もシンプルな使い方の例です。に行く。
127.0.0.1:8000/hello
へのリクエストを意味します。
hello()
関数に移動し
127.0.0.1:8000/home
が返されます。
index.html
を実行し、要求されたとおりにすべての変数を置き換えます (もうすべてご存知でしょう)。
では、次に AJAX . AJAXの呼び出しは、非同期リクエストを行うクライアント側のコードです。複雑に聞こえますが、簡単に言うと、バックグラウンドでリクエストを行い、レスポンスを処理するのです。つまり、あるURLに対してAJAXコールを行うと、その場所に行くユーザーと同じデータを得ることができるのです。
例えば、AJAXコールで
127.0.0.1:8000/hello
は、あなたがそれを訪れたときと同じものを返します。このときだけ、あなたはそれをJavaScriptの関数の中に持っており、好きなようにそれを扱うことができます。簡単な使用例を見てみましょう。
$.ajax({
url: '127.0.0.1:8000/hello',
type: 'get', // This is the default though, you don't actually need to always mention it
success: function(data) {
alert(data);
},
failure: function(data) {
alert('Got an error dude');
}
});
大まかな流れはこうです。
-
呼び出しは、URL
127.0.0.1:8000/hello
を、あたかも新しいタブを開いて自分でやったかのように表示します。 - 成功した場合(ステータスコード200)、受信したデータを警告する成功用の関数を実行します。
- 失敗した場合は、別の関数を実行します。
さて、ここで何が起こるでしょうか?hello world'と書かれたアラートが表示されるでしょう。AJAXでhomeを呼び出すとどうなるでしょうか?同じように、次のような内容のアラートが表示されます。
<h1>Hello world, welcome to my awesome site</h1>
.
つまり、AJAXの呼び出しに目新しさはないのです。ページを離れることなくユーザーにデータや情報を取得させるための手段に過ぎず、それによってウェブサイトのデザインはスムーズでとてもすっきりしたものになるのです。注意すべきガイドラインをいくつか挙げておきます。
- jQueryを学ぶ . 私はこれを十分に強調することはできません。受け取ったデータをどう扱うか、少しは理解する必要があるでしょう。また、JavaScriptの基本的な構文も理解する必要があります(pythonには遠く及びません、慣れるでしょう)。私が強くお勧めするのは EnvatoのjQueryのためのビデオチュートリアル これらは素晴らしいもので、正しい道に導いてくれるでしょう。
- JSONはいつ使うのか? . Django のビューから送られるデータが JSON である例を多く見かけると思います。それについて詳しく説明しなかったのは、それが重要でないからです いかに を行うことであり(説明はいくらでもあります)、より重要なのは いつ . そしてその答えは、「JSONデータはシリアライズされたデータである」ということです。つまり、あなたが操作できるデータです。先ほど述べたように、AJAXの呼び出しは、あたかもユーザーが自分で行ったかのようにレスポンスをフェッチします。ここで、すべてのhtmlを操作するのではなく、データ(おそらくオブジェクトのリスト)を送信したいとします。JSONはこのような場合に適しています。なぜなら、JSONはデータをオブジェクトとして送信し(JSONデータはpythonの辞書のように見えます)、それを反復処理したり、無駄なhtmlを選別する必要がないような他の処理を行うことができるからです。
- 最後に追加する . ウェブアプリを構築してAJAXを実装したい場合、自分自身のためになることをしましょう。まず、アプリ全体を、AJAXをまったく使わずに構築します。すべてが機能していることを確認します。それから、そしてそのときだけ、AJAXの呼び出しを書き始めましょう。これは、あなたが多くのことを学ぶのに役立つ良いプロセスです。
-
クロームのデベロッパーツールを使用する
. AJAXの呼び出しはバックグラウンドで行われるため、デバッグが非常に困難な場合があります。クロームデベロッパーツール(またはfirebugのような類似のツール)を使用する必要があり
console.log
のものを使ってデバッグします。詳しくは説明しませんので、ググって調べてみてください。そうすれば、とても助かると思います。 -
CSRFの認識
. 最後に、Django のポストリクエストには
csrf_token
. AJAXの呼び出しでは、多くの場合、ページを更新することなくデータを送信したいと思うでしょう。を送信するのを忘れていたことに気づくまで、おそらくいくつかの問題に直面するでしょう。csrf_token
. これは AJAX と Django の統合における初心者の障害として知られていますが、うまく機能させる方法を学べば、それはとても簡単なことなのです。
以上、思いつくままに書いてみました。膨大なテーマですが、そうですね、事例が少ないのでしょう。ただ、少しずつ、いずれは理解できるようになるはずです。
関連
-
Python カメの描画コマンドとその例
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] jQueryを使ったAjaxリクエストの中断
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】インポートエラー。モジュール名 urllib2 がない