LaravelからDjangoに乗り替えてハマったこと5選
カテゴリ:Pythonの話
LaravelとDjangoには多くの共通点があったりします。今回は二つのフレームワークの共通点・違いを見ていきます。
また、弊社ではWebプロモーション成功事例集をまとめた限定資料を無料で配布しています。
Webマーケティングに興味がある方は、下記ページより目を通してみてください。
目次
比較
まず2つのWebフレームワークの比較からみていきましょう。
フレームワーク | Laravel | Django |
概念 | MVC | MTV |
生成コマンド | php artisan *** | python manage.py *** |
モデル | app/[ModelName].php | models.py |
コントローラー | app/Http/Controllers/[ControllerName]Controller.php | views.py |
ビュー | resources/views/ControllerName]/[TemplateName].blade.php | templates/***.html |
ルーティング | routes/web.php | urls.py |
マイグレーション | database/migrations/ | migration |
初期データ | database/seeds/ | fixtures |
API対応 | route/api.php などが対応 | Django REST Framework(外部ライブラリ) |
こちらのサイトを参考にさせていただきました。
見ての通り、フォルダ構成は違えど概念は以外と近かったりします。
1.インデントタブ
例えばECサイトで、送られたパラメーターを元にカートの中の商品をデリートする処理をコントローラーで書くと‥‥
Laravel
Django
お気づきかもしれませんがDjango(Python)には{}で囲むことをしません。Laravelではスコープは{}の範囲内ですがDjangoだと使えまえません。
Pythonではインデント幅がスコープになっています。なので今回のDjangoの処理で、returnの記述を1行でも前にずらすとdeleteの処理は効かなくなります。
2.クエリビルダとクエリセット
名前が似ていることから用途も同じように捉えている方が多いかもしれません。この二つの比較を見てみます。
Laravel
LaravelではDBから情報を取得する方法が大きく分けて2種類あります。
クエリビルダ | モデルを介さずに直接DBの情報を取得する方法。 例)全てのusersテーブルのデータを取得 $users = DB::table(‘users’)->get(); |
エロクアント | モデルを介してDBデータを取得 $users = User::all(); |
これは私の感覚ですが、Laravelでは基本的なCRUD操作はエロクアントを使用(楽だから)。joinなどで関連のないテーブル同士の結合からデータを取得をする場合にだけクエリビルダを使用していました。
Django
Djangoにも2つの方法で取得する方法があります。
Formクラス | モデルをインスタンス化し、フォームの値をバリデーションした後にCRUD操作をする |
クエリセット | モデルを介してCRUD操作する |
ん?この二つ何が違うの?って感じじゃないですか。どちらでもいいのかというとそういう分けでなく、これも私の感覚ですがテンプレートでFormクラスを使う場合にはFormクラスを使う方が楽です。
例えばFormクラスを利用して、テンプレートからPOST通信で送られたデータを保存するとします。
Formクラス
取得方法は以下の様になります。
実はこれ、クエリセットでもできます。
クエリセット
あまり大した違いを感じられないかと思いますが、フィールドに注目してください。
Formクラスではテンプレートで入力された値を手動で入れる必要がありません。しかし、クエリセットではリクエストのデータを一々代入していく必要があります。
なので使い分けの境界線としては、
テンプレートでFormクラスを使う場合はviews.pyでもFormクラスを使用。formから値は何もなく通信が来た場合や複雑なデータ取得、DBから一覧データの取得にはクエリセットを使用する、と考えていただけたらと思います。
結論:クエリビルダもクエリセットも楽できなくなったら使う。
3.Ajaxでcsrfトークンの送り方
例えばあなたがTodoリストで最新順のタスクに並べ替える機能を実装する場合、
Laravel
Django
注目して欲しいのは4行目のURL指定と8行目のトークンの付けかたです。これらがDjango特有の組み込みタグです。
4.JSファイルの分割
Laravel
Django
Djangoだとtemplatesと同階層にstaticフォルダを作成し、その中でcssやjsファイルを呼び出します。
この方法はcssはいいのですが、jsファイルになるとurlなどの呼び出しがうまくできなくなります。
なので以下は私なりのやり方になります。
今回の例の記述だとtemplates/js/hoge_js.htmlを作成し、<script>タグで始めて書くだけです。これであくまでhtmlとしてjsファイルを読み込むことができます。
5.デバッグ
Laravelのデバッグでは特に以下のデバッグ関数が使われます
- var_dump() :指定した式に関してその型や値を含む構造化された情報を 返します。
- dd() :dump and dieの略。処理はここでデータを全て吐き出し、処理は止まる。
- \DB::enableQueryLog(); :直近のエロクアント、クエリビルダの文をSQL文で出力する。dd(DB::getQueryLog());を吐き出したい処理のすぐ下に書くことでそのSQL文のみを出力してくれる。
djangoではデバッグ関数が用意されていません。よく使われるのはprint()文で出力したい変数の中身を取得します。しかし、print()文だと取得できている値を全て確認できなかったりします。その上ターミナル上で確認しにくい。
Djangoには専用のデバッグツールバーが用意されています。
まずはターミナルで以下のコマンド
1 |
pip install django-debug-toolbar |
次に設定
これでブラウザを開いたら右横にデバッガーツールが表示されます。
リクエストで受け取った値や「SQL」をクリックすることで実行したクエリ文を確認することができます。
LaravelからDjangoに乗り替えてハマったこと5選をご紹介させていただいたところで、「Webで集客する方法」も知りたくありませんか?
弊社では別の記事にて「Web集客」について深く解説しています。詳しく知りたい方はぜひこちらもご覧ください。
おわりに
他にもたくさんはまったことがあります。MySQLの設定とか‥‥。
Webフレームワークとしての機能で比較するだけなら他に劣るところが見られますが、機械学習・AIなどのライブラリの導入はPython系のDjangoでしかできません。そこが本来のDjangoの魅力です。
また別の機会に紹介させていただこうと思います。
弊社inglowでは、これから広告の運用を考えている方、あるいはこれから広告代理店に運用をお願いされる方向けに、「業界別Web広告の成功事例」をまとめた資料を無料配布しております。
下記の画像をクリック、または、フォームに入力いただくだけで、無料で資料をダウンロードしていただけます。ぜひご利用下さい。