トップページ⇒php
314コメント104KB

【Python】Webフレームワーク Djangoスレ Part2

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/12/15(木) 23:47:02.03ID:???
LL言語「Python」で実装されたWebフレームワーク Django
Web開発する上で必要となる機能がそろっており、
管理サイト画面を自動作成できるなどの特色を持ちます。

前スレ
【Python】Webフレームワーク Djangoスレ Part1
http://kohada.2ch.net/test/read.cgi/php/1156612854/

本家サイト
http://www.djangoproject.com/

日本語ユーザ会「Djangoと日本の仲間たち」
http://www.djangoproject.jp/

日本語解説サイト
ttp://ymasuda.jp/python/django/index.html

解説本(英語) 「Pro Django:」2006年10月30日出版予定
ttp://www.amazon.co.jp/gp/product/1590597257/

あなたがDjangoを利用すべき10の理由(和訳)
ttp://www.everes.net/2006/jan/30/3042306a305fdjango3092522975283059304d10306e74067531/

IT Pro記事
ttp://itpro.nikkeibp.co.jp/article/NEWS/20060410/234868/

IBM developerWork記事
ttp://www-06.ibm.com/jp/developerworks/linux/060802/j_l-django.shtml
0291nobodyさん2014/02/26(水) 22:48:12.48ID:LOhj6Qup
例えば日毎に複数モデルからデータを持ってきて表示するカレンダーを作る場合、
Manager:date等を指定してのクエリ(戻り:QuerySetや集約後のデータ)
View:Calendar.monthdatescalendarのような構造の配列を作る
    それぞれのモデルのManagerを呼んでデータ取得
    配列にはモデルから取得したデータをまとめた辞書を入れる
Template:forループで上の配列を回してhtmlにする

こんな感じで合ってますか?

不安な点:
・クエリを書く場所(View?Manager?)
・View内でコードを書く場所
   今はgetメソッドに直接書いていますが、getは弄らずにメソッドに書いてそれをテンプレートから
   呼んだ方が(view.hoge的な)いいのでしょうか?それとも別ファイルに関数を書くべきですか?
・現在はデータをループしやすいような配列にしてから渡してますが、Template内である程度HTMLにした方がいいのか?
  ※formは軽くタグとか付けられますよね
ネットでサンプルを探してはみたのですが、今一これが正解!的なコードが見つからなくて・・・
あと設計の参考になりそうな良いサイトってありますでしょうか?
0292nobodyさん2014/02/26(水) 22:50:32.75ID:???
>・現在はデータをループしやすいような配列にしてから渡してますが、Template内である程度HTMLにした方がいいのか?
Template内で → View内で
でした
0293nobodyさん2014/02/27(木) 01:08:04.43ID:???
単純なデータ取得、たとえば pkを指定してレコード取得や一覧取得はView
ビジネスロジックと言われるような中枢を成す処理はmodelまたはlogics.pyとか別ファイルにする
Djangoのポリシーではテンプレート内でデータは加工しない
テンプレートはデザイナーが触るものでプログラマーが触るものではない
よってデータの加工はviewでやる
getメソッド?なにそれ
0294nobodyさん2014/02/27(木) 05:14:32.62ID:???
>>291
俺ならインタフェースだけ合わせて、template内で同じように見えるようにしてiteration。
0295nobodyさん2014/02/27(木) 06:00:14.57ID:???
<select><option value="foo">bar</option></select>
のような形を作るにはどのようにすればいいのでしょうか?
class yes(forms.Form):
bar = forms.ChoiceField(
widget = forms.Select()
)
で、セレクトバーは出たんですが、その後の<option>の指定方法がわかりません
自分はHTMLで{{form.bar}}のようにしています
0296nobodyさん2014/02/27(木) 06:01:32.60ID:???
すみません、barじゃなくfooでした
0297nobodyさん2014/02/27(木) 10:04:22.81ID:???
>>296
choices
0298nobodyさん2014/02/27(木) 17:19:30.62ID:???
フォームでPOST値を送信する場合って、
PHPの場合は、送った先が$_POST['foo']とかを処理するけど、
Djangoの場合は、処理するページ(<form>のあるページ)がPOST値を処理してから次のページへリダイレクトって仕組みだよね?
送った先(次のページ)がPOST値を取得したり表示する場合はセッションを使わないといけないんだよね?
0299nobodyさん2014/02/27(木) 20:08:10.07ID:???
>>298
そんなことない。作り方次第。
ただ自然に作ると、
0300nobodyさん2014/02/27(木) 20:09:28.52ID:???
>>299 続き
そうなる。
0301nobodyさん2014/03/01(土) 00:04:24.54ID:???
>>292
getはクラスベース汎用ビューにあるgetのオーバーライドです
ネットの参考サイトがそのような書き方をしていましたので
requestからURLパラメータ欲しいから・・・と思いましたがView.requestでどこからでも取得出来るんですね
となるとコンテキストに追加するのはget_context_dataがいいのかな
あとテーブル操作はカスタムManager、レコード操作はModelと意識してます
>>294
フォームで言う、form.messageみたいなのを作るって事でしょうか?

ネットでもいろんなやり方があって、もう設計に拘らず適当でもいい気がしてきました・・・w
しかし関数ベースとクラスベースの情報があってぐぐり難いですね
0302nobodyさん2014/03/01(土) 02:11:13.60ID:???
>>301
>>294だが違う。
モデルで吸収するってこと。
0303nobodyさん2014/03/02(日) 09:36:50.36ID:???
>>1
オブジェクト指向は愚かな考え。排便メソッドを実装した人間クラスから美少女クラスが作れない。
http://toro.2ch.net/test/read.cgi/tech/1393660194/85
0304nobodyさん2014/04/08(火) 07:57:45.66ID:Gp3QMMMl
request.session['hoge'] = 0
sqlite使用で上のコードを書いただけで 200msくらいブラウザの反応が遅くなるから、
なんとなくmysqlに変えてみたらなぜか早くなりました(300ms→100ms)
※他にも簡単なSQLありますが、上のコードが無い場合は両者反応速度一緒ぐらいです
しかしdebug_toolbarで見るSQLの実行時間は常に変わらず0or1ms

あとtime.clockでもコードの実行時間見てるけど、なんか変です
上のコードがあるメソッドを、clockで囲ってコード有無・DB変更して計測しても、常に30ms未満
なぜでしょうか・・・orz

django1.6.2 python2.7 windows7
0305nobodyさん2014/04/08(火) 19:30:15.43ID:???
計測何回やったんだ
sqliteはファイルだからIOがとかなんとか
mysqlもファイルですよ
0306nobodyさん2014/04/08(火) 23:51:56.94ID:???
>>305
ついでにtimeitとやらで計測してみました
t = timeit.Timer("""s = SessionStore('key')
s.save()""", 'from django.contrib.sessions.backends.db import SessionStore')
logging.debug(t.timeit(10))

[ sqlite3.8.3.1 ] 約2800ms VACUUMすると遅くなって3800ms・・・
QUERY = u'SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date"
FROM "django_session" WHERE ("django_session"."session_key" = %s AND "django_session"."expire_date" > %s )' -
 PARAMS = (u"'z9q43506rahjmcheld9e0m9p4motsbwa'", u"'2014-04-08 13:53:36.183000'")
QUERY = u'BEGIN' - PARAMS = ()
QUERY = u'UPDATE "django_session" SET "session_data" = %s, "expire_date" = %s
  WHERE "django_session"."session_key" = %s ' - PARAMS =  (u"'NDFkMjdiMjI5NWUzYjliZWIzNGQwMGI1YzA1ZDcwMWQ5MjNmZWVlNDp7fQ=='",
  u"'2014-04-22 13:53:36.190000'", u"'z9q43506rahjmcheld9e0m9p4motsbwa'")
UPDATEはdebug_toolbar上では1or2ms。トランザクションの関係で計測上手く出来ないのかも?
UPDATEをSQLiteManagerから直接実行しても300msかかってました

[ mysql5.6.17 ] 約140ms
SELECT ??? FROM `django_session` WHERE (`django_session`.`session_key` = 'z9q43506rahjmcheld9e0m9p4motsbwa'
 AND `django_session`.`expire_date` > '2014-04-08 13:59:03' )
UPDATE `django_session` SET `session_data` = 'NDFkMjdiMjI5NWUzYjliZWIzNGQwMGI1YzA1ZDcwMWQ5MjNmZWVlNDp7fQ==',
 `expire_date` = '2014-04-22 13:59:03' WHERE `django_session`.`session_key` = 'z9q43506rahjmcheld9e0m9p4motsbwa'

しかしsqliteのアダプタって無駄が多いんですね
さすがに差が開きすぎな気もするので、単に私の環境のsqliteがおかしいのかも・・・
03073062014/04/09(水) 06:33:27.18ID:???
すみません、どうやら単純にデータがSSDにあるかどうかの問題でした…
sqliteファイルをSSDへ移したところ、2800ms→230msまで縮まりました
しかしHDDとSSDでここまで違うとは…
0308nobodyさん2014/05/22(木) 16:31:45.79ID:???
馬鹿には無理
0309nobodyさん2014/05/24(土) 02:57:47.14ID:???
nginxで使う場合uwsgiとgunicornでは、どちらがオススメでしょうか?
0310nobodyさん2014/05/24(土) 03:17:53.06ID:???
そんな質問してるようじゃおまえにはまだはやい
0311nobodyさん2014/05/24(土) 12:31:13.12ID:???
uWSGIの方が色々出来て便利だけどドキュメント読めないと詰むかもわからん。
Emperor + Zerg で Graceful reload とか。
0312nobodyさん2014/05/24(土) 13:50:56.96ID:???
バカげた質問である
0313nobodyさん2014/05/24(土) 14:09:01.28ID:???
Djangoに入ってるsimplejsonってUNICODEを期待してるの?
0314nobodyさん2014/05/26(月) 00:49:39.85ID:???
>>313
は?
■ このスレッドは過去ログ倉庫に格納されています