【Python】Webフレームワーク Djangoスレ Part2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/12/15(木) 23:47:02.03ID:???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
0262nobodyさん
2014/01/19(日) 01:49:06.58ID:???0263nobodyさん
2014/01/21(火) 05:07:03.69ID:???それともprintが出力するはずだった情報をloggingが受け取る?ことでエラーが発生しないというなんでしょうか
あと、もし500を返すような致命的エラーが出たらメールで管理者に送る機能しか無くて、ファイルにlogとして残せないですよね?
メール送るところを自分で改変してログに残せそうな気もするんですがちょっと敷居が高過ぎます
http://www.18th-technote.com/post/5352244742/django-process-exception
今は上記を参考にviewで発生したエラーはprocess_exceptionで補足できてるんですが、
templateでもしエラーが起きたら補足できません
これデフォルトでなぜ付けないんだろうといつも疑問に思ってます
0264nobodyさん
2014/01/21(火) 09:23:00.68ID:???uWSGI だとまず >>261 の状況が発生しないのだけど
使ってる環境(サーバ)はなあに?
ちなみに、printで標準出力に出したものは uWSGIのログにも出力されるよ
0265nobodyさん
2014/01/22(水) 21:52:13.79ID:???gunicornです
gunicornでログを生成するようにしたらprintの内容が出力されてエラーが出なくなりました!
Django本体のログのことしか頭に無かったです
ヒントありがとうございます 大変助かりました
0266nobodyさん
2014/01/25(土) 07:08:02.10ID:HM5WIj95Djangoと言えばnginx+gunicornの組み合わせしか知らないんですが最近気になってます
0267nobodyさん
2014/01/28(火) 23:39:54.41ID:???どの辺が嬉しいんでしょう?
0268nobodyさん
2014/01/29(水) 17:12:34.45ID:???潤沢なメモリがあるサーバならApacheでも良い
枯れているし対応する拡張も多い
でも兎に角メモリイータでリソースに厳しい
uWSGI
馬鹿っ速い・先進的な機能がテンコ盛り・省リソースで動く
0269nobodyさん
2014/02/07(金) 23:56:26.65ID:NNxPDh1r0270nobodyさん
2014/02/13(木) 04:25:53.66ID:???を含む関数を
manage.py shellから呼んでも通るんですが、
本番環境だとApacheがsegmentation fault(11)を吐きます
上記関数を含まない他のviewは問題なく表示できます。
どこらへん調べたらいいですか?
Apacheでmod_wsgiをdaemonモードで使っててDjango1.6です
0271nobodyさん
2014/02/23(日) 22:30:46.68ID:???RoRに比べて日本語の情報も少ないし、Django弄ってる日本人少ない?
RoRに浮気したいけど、初心者に厳しいとも聞くし
0273nobodyさん
2014/02/24(月) 12:07:32.49ID:???0274nobodyさん
2014/02/24(月) 14:39:31.70ID:Grf2Q2cg英語圏は楽でいいよな
0275nobodyさん
2014/02/24(月) 20:18:43.30ID:???0276nobodyさん
2014/02/24(月) 21:38:54.89ID:???0278nobodyさん
2014/02/25(火) 06:29:04.41ID:???そもそもDjangoに限らずViewの部分なんて難しい処理とかないじゃん
0279nobodyさん
2014/02/25(火) 16:06:21.05ID:???PHPでいう、if(isset($var)){}のような事をしたいのですが
0280nobodyさん
2014/02/25(火) 16:10:25.31ID:???0281nobodyさん
2014/02/25(火) 16:37:36.90ID:???Viewってmysite/mysite/urls.pyに毎回わざわざurlpatternsを書かないといけないの?
(r'^myapp/$', 'myapp.views.index')とか
また、アプリケーションとしてmyappを追加した場合、mysite/myapp/views.pyに毎回def index(request):context="" return HttpResponse(render())みたいな長ったらしいのを書かないといけないんでしょ?
で、テンプレートはmysite/template/myapp/以下にindex.htmlとして入れると
Smartyみたいに$view->assign();や$view->display()だけでいけるように設定できれば楽なんだけど
0282nobodyさん
2014/02/25(火) 21:06:50.68ID:???とは言えドキュメントにこのあたりは纏まって書いてないので
ひと通りやらないと分からないのはちょっと不親切だったりする
まず"Djangoアプリ 再利用" とかでググってみておくれ
urls.pyにまとめてurlを書く利点はページのURL配置に自由度を持たせる為
viewの指定については、django.shortcuts.render でも使えばいい
それか同じように毎回書くのが面倒ならそのラッパを好きに自分で作る。
テンプレートの場所も設定で変更できる。
開発時の問題ならシンボリックリンクでも貼っておけば良い。
0283nobodyさん
2014/02/25(火) 21:56:01.64ID:???それともう一つ質問あるんだけど、
例えばHTMLのフォーム(form.html)からanalyze.pyへ移動し、
そこでフォームのバリデーションなんかしたりしてから別のHTMLページに飛ばしたい場合は、
<form action="./analyze.py">でどのように指定すればいいの?
例えテンプレートform.htmlがanalyze.pyと同じディレクトリにあっても相対パスが適用されないよね?
CSSやJSの外部ファイルの読み込みの際にワケが分からなくてハマったんだけど
コレは/static/ディレクトリを作成し、その中に入れてなんとかなった
Djangoではマニュアルとか読んでてもModelがDBからみの事をいうような書かれ方してるけど、
自分は外部ライブラリなどもModelだと認識してる
analyze.pyのような関数やクラス群はどこに置いて、どのように指定すればいいの?
0284nobodyさん
2014/02/25(火) 22:34:11.12ID:???まずこれを綺麗サッパリ忘れてくれ。
Djangoでは まずURLを登録し、そのURLで実行する処理を指定する。
例えば urls.py に /hoge/ へのアクセスは myapp/views.py の hoge(request) で処理せよという感じで指定する。
換言すれば、urls.py に登録ないURLへはアクセスできない。
Formの処理については 日本語のドキュメントにサンプルがある。
それをまず真似て作ってみる。いきなりDjangoの流儀と違うやり方で実装しようとしないでまずはサンプルの理解から。
別のページに飛ばすのは redirect を使えばよいし、
analyze.pyに書いた処理でバリデーションしたければ、Formのバリデート処理に、analyze.py を import して使えばよい。
また、<form action="xxx">にForm表示とは違うURLを指定することも可能だが、そのURLは当然 urls.py に登録済みでなければ駄目だよ。
>自分は外部ライブラリなどもModelだと認識してる
違う
0285nobodyさん
2014/02/25(火) 23:39:29.25ID:???analyze.pyを{{STATIC_URL}}内に入れてaction部にanalyze.pyを記述しフォームを実行したらanalyze.pyのダウンロードが始まったw
なるほど、Djangoって結構ガチッとしたFWなのかな
FWはZendFrameworkくらいしか使ったことないんだけど、アレは最初のコントローラー部で迷った以外はライブラリ感覚で使えたし、フォームなんかも無視して自分で実装しても問題なかった
対してcakePHPはガチッとしてると聞いた
ライブラリ感覚ならTurboGearの方がいいとか数年前読んだけど
自分としては、PythonはApache連携やら、フォームを作成後ブラウザからスクリプトを起動させるのが面倒くさいから、Django使おうって位の軽いユーザーのつもりだったんだけど、思った以上にブラウジングが面倒くさいなぁと
もうちょっと頑張って学習してみる
><form action="xxx">にForm表示とは
>違うURLを指定することも可能だが、
>そのURLは当然 urls.py に登録済みでなければ駄目だよ。
ココがちょっと分かんないんだけど、
mysite/libs内にanalyze.pyを入れたとして、
それらのディレクトリ、ファイルなど外部ファイルにアクセスするのにわざわざURL登録しないといけないの?
HTML,つまりViewを必要としないpythonファイルをディスパッチ、レンダリングするというなら、その方法が見当も付かないんだけど...
混乱してるなぁ...うぅむ...
0286nobodyさん
2014/02/26(水) 00:25:11.85ID:???{{MEDIA_URL}} ユーザがアップロードしたファイルを置く場所
上記にプログラムファイルを置いても駄目。
既に経験済みの様だが、プログラムファイルは実行されずダウンロードされてしまう。
>HTML,つまりViewを必要としないpythonファイルをディスパッチ、レンダリングする・・・
urls.pyには正規表現が使える。
たとえば url(r'^hoge/(?P<pagename>[a-zA-Z0-9]+).html$', 'mysite.views.nonview', name='nonview')
と定義すれば /hoge/foo.html や /hoge/bar.html といったURLを mysite/viers.py の nonview関数で処理できる
nonview関数ではpagename引数に入ったHTMLファイル名を 任意のディレクトリから呼び出し
HttpResponse 等で出力すればよい (もちろん任意のテンプレートでラップしてもよい)
または 静的HTMLの表示に全くDjangoを通さないくて良ければ {{STATIC_URL}} 以下にHTMLファイルを配置し
表示処理は HTTPServer にまかせてしまう
0287nobodyさん
2014/02/26(水) 00:48:09.44ID:???View部分の面倒くさい記述は教えてもらったので検索したりして何とかなった
慣れないとDjangoって難しいんだね
今んとこディスパッチャの部分が特に
皆自分で学んでいったんだろうけど、凄いなぁ
自分としては、
foo.htmlフォームの実行
-> analyze.pyよりフォームで送られてきたデータのバリデーションとデータベース接続、登録
-> リダイレクト
-> bar.html
というごく一般的なフォームの挙動を行おうとしただけでこれだけ悩んでる
{{STATIC_URL}} 静的なファイルを置く場所 JavaScript cssファイル 画像ファイル etc
{{MEDIA_URL}} ユーザがアップロードしたファイルを置く場所
上記にプログラムファイルを置いても駄目。
既に経験済みの様だが、プログラムファイルは実行されずダウンロードされてしまう。
>nonview関数ではpagename引数に入ったHTMLファイル名を 任意のディレクトリから呼び出し
>HttpResponse 等で出力すればよい (もちろん任意のテンプレートでラップしてもよい)
と言う事は、Djangoでは/lib/などの外部ファイル(admin.pyやsetting.pyなどではなく、myfunctions.pyのようなもの)は使えず、処理を行いたい挙動はnonview関数内にPythonスクリプトを書いていくということになるんだね?
なるほど
0288nobodyさん
2014/02/26(水) 07:45:04.05ID:???0289nobodyさん
2014/02/26(水) 08:06:17.61ID:???http://d.hatena.ne.jp/shuji_w6e/20090514/1242227504
まずこのあたりに目を通してはどうだろうか
0290nobodyさん
2014/02/26(水) 21:53:50.81ID:???0291nobodyさん
2014/02/26(水) 22:48:12.48ID:LOhj6QupManager: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内で → View内で
でした
0293nobodyさん
2014/02/27(木) 01:08:04.43ID:???ビジネスロジックと言われるような中枢を成す処理はmodelまたはlogics.pyとか別ファイルにする
Djangoのポリシーではテンプレート内でデータは加工しない
テンプレートはデザイナーが触るものでプログラマーが触るものではない
よってデータの加工はviewでやる
getメソッド?なにそれ
0294nobodyさん
2014/02/27(木) 05:14:32.62ID:???俺ならインタフェースだけ合わせて、template内で同じように見えるようにしてiteration。
0295nobodyさん
2014/02/27(木) 06:00:14.57ID:???のような形を作るにはどのようにすればいいのでしょうか?
class yes(forms.Form):
bar = forms.ChoiceField(
widget = forms.Select()
)
で、セレクトバーは出たんですが、その後の<option>の指定方法がわかりません
自分はHTMLで{{form.bar}}のようにしています
0296nobodyさん
2014/02/27(木) 06:01:32.60ID:???0298nobodyさん
2014/02/27(木) 17:19:30.62ID:???PHPの場合は、送った先が$_POST['foo']とかを処理するけど、
Djangoの場合は、処理するページ(<form>のあるページ)がPOST値を処理してから次のページへリダイレクトって仕組みだよね?
送った先(次のページ)がPOST値を取得したり表示する場合はセッションを使わないといけないんだよね?
0301nobodyさん
2014/03/01(土) 00:04:24.54ID:???getはクラスベース汎用ビューにあるgetのオーバーライドです
ネットの参考サイトがそのような書き方をしていましたので
requestからURLパラメータ欲しいから・・・と思いましたがView.requestでどこからでも取得出来るんですね
となるとコンテキストに追加するのはget_context_dataがいいのかな
あとテーブル操作はカスタムManager、レコード操作はModelと意識してます
>>294
フォームで言う、form.messageみたいなのを作るって事でしょうか?
ネットでもいろんなやり方があって、もう設計に拘らず適当でもいい気がしてきました・・・w
しかし関数ベースとクラスベースの情報があってぐぐり難いですね
0303nobodyさん
2014/03/02(日) 09:36:50.36ID:???オブジェクト指向は愚かな考え。排便メソッドを実装した人間クラスから美少女クラスが作れない。
http://toro.2ch.net/test/read.cgi/tech/1393660194/85
0304nobodyさん
2014/04/08(火) 07:57:45.66ID:Gp3QMMMlsqlite使用で上のコードを書いただけで 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:???ついでに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がおかしいのかも・・・
0307306
2014/04/09(水) 06:33:27.18ID:???sqliteファイルをSSDへ移したところ、2800ms→230msまで縮まりました
しかしHDDとSSDでここまで違うとは…
0308nobodyさん
2014/05/22(木) 16:31:45.79ID:???0309nobodyさん
2014/05/24(土) 02:57:47.14ID:???0310nobodyさん
2014/05/24(土) 03:17:53.06ID:???0311nobodyさん
2014/05/24(土) 12:31:13.12ID:???Emperor + Zerg で Graceful reload とか。
0312nobodyさん
2014/05/24(土) 13:50:56.96ID:???0313nobodyさん
2014/05/24(土) 14:09:01.28ID:???■ このスレッドは過去ログ倉庫に格納されています