PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

PyQメンター相談会9月を開催、Djangoのモデル設計支援とプロジェクトのレビューをしました

id:hirokiky です。

Djangoで開発していて、モデル設計がうまくいかない、Djangoのプロジェクトがちゃんと書けてるか不安、 settings.py があっているか分からないという悩みは多いのではないでしょうか。

今回のPyQ メンタープラン相談会では、そういった自分でDjangoアプリを作るうえでの悩みを解決できました。

pyq.connpass.com

例えばこんな悩みです。

  • 今までのモデル設計ではうまくいかない部分がでてきたけどどうすれば?
  • Djangoで静的ファイルの配信を設定したけど、やり方はあっていそう?
  • 全体的にプロジェクトをレビューして、悪いところありそう?

たしかに単純に質問するには難しい内容も多くありますね。 全体感や設定のレビューというのも、Web上に公開するわけにはいかないので難しいと思います。

ご相談いただいた内容から一般的な内容だけでもご紹介できればと思います。

マスターデータを変更すると、履歴データにも影響してしまうけどどうすれば?

今回は、既存アプリでマスターデータを変更すると、履歴データにも影響してしまうけどどうすれば良いか?というお悩みでした。 履歴データからマスターデータへのリレーションを持って管理していたので、マスターが変わると履歴の情報(例えば商品価格)も変わってしまいます。 履歴の情報なので「その当時の」情報が必要なわけです。

解法としては、履歴側にも履歴を残した当時のマスターの情報を一部、コピーするよう提案しました。 データとしては非正規化されてしまうようですが、「履歴当時の情報」として残しています。 例えば、購入履歴モデルの購入時の商品の価格フィールドに保存しておく、などです。

それに合わせて一緒にプログラムを修正して、相談会の間に問題を解決できました。

また、既存の履歴データに非正規化したデータを入れる方法をお伝えしました。 今回はDjangoでのデータマイグレーションを使ったやり方、データマイグレーションの作り方をご説明しました。

Djangoの設定、プロジェクト全体のレビュー

あとはお客様のDjangoプロジェクトを見て、問題のある部分が無いかをレビューしました

  • レビューしてみて全体的に問題ある実装はなさそうでした
  • 静的ファイル配信に WhiteNoise を使うのも、今のアプリ的には良さそう。使い方も良さそう
    • Nginxなど考慮せず簡単に静的ファイルを配信する場合は WhiteNoise を使うと良いです
    • アクセス頻度の高くないWebアプリだったので、WSGIミドルウェアから静的ファイルを配信しても問題なしと判断しています
    • WSGIサーバーのワーカーを食わないために、Nginxからやるほうが良いです
  • Django内での静的ファイル、CSSの置き場所も良さそう
  • 継承元になるテンプレート base.html でメインになるCSSを読み込むのも良い
  • プログラムはできれば、PEP8は準拠したほうがいいと、細かい話ですが提案
    • PEP8は見た目の良さもありますが、書式を合せることで複数人で開発した際のDiffの衝突が起こりにくい利点もあります
  • myproj/urls.py は、今後大きくなって辛くなってくればアプリごとの urls.py に分割していけます、と提案しました
  • 他settingsレビュー、細かいところを指摘
    • settings.py 内で from local_settings import * として、ローカル用の設定を上書きするのであれば、ファイルの一番下に書かないと意味がありません
    • 似た設定同士はまとめて書かないと色んなとこに書いちゃって混乱してしまう(例えば STATIC_ 系ならそれでまとめて書くこと)
  • 要らないライブラリー、settingsがないか確認
    • いくつか要らないものを削除

まとめ

たしかにDjangoのプロジェクトの設定方法や、セキュリティー上問題ないか?などは疑問が残ったままになる点ですね。 色々な情報を参考にして設定していくと、 settings.pyurls.pyrequirements.txt もゴチャゴチャしてきてしまいます。 PyQのメンタープランではそういった悩みにも応えられます。

また、今の PyQ の学習カリキュラムではこの点はカバーできていないところだと思いました。 settings.py やマイグレーション、セキュリティーやデプロイについても学べるプラットフォームになれればいいなと思います。

pyq.jp

Pythonでの環境構築はどうすべきですか?

こんにちは。PyQ開発チームの清原 id:hirokiky です。

今日も PyQ のメールサポートで何度かいただいた質問の紹介をします。

質問

Pythonのインストール方法としてpyenv + virtualenvでの環境構築が検索上位にきますが、 pyenvは使うべきなのでしょうか? venvが主流なようですがどうするのが良いでしょうか?

回答

Pythonの環境構築に関して回答させていただきます。

ご指摘の通りPythonの環境構築の方法はいくつかございます。 それぞれ利用者によってユースケースが違うため、なかなかベストプラクティスと 一概にお答えするのは難しいですが、参考になりそうな情報をお伝えさせていただきます。

ymotongpoo.hatenablog.com

qiita.com

ymotongpoo.hatenablog.com

qiita.com

qiita.com

上記URL群はそれぞれのツールの説明、環境構築方法等の 内容がまとまっておりますので参考にしていただければ幸いです。

あくまで私見ですが、pyenvやAnacondaを使った環境構築はデータ分析/機械学習を 主目的にした方が利用されることが多いようです。

一方、Pythonが標準で用意しているvenvとpipによる環境構築は、それ以外の より幅広い活用を念頭に置いた方が利用されてるイメージがあります。

PyQに関してましては、データ分析/機械学習の分野は今後は注力してまいりますが、 それ以外の幅広い領域も扱って行きますため、現状ではpyenvやAnacondaの利用を 積極的に推奨するということはありません。

pyq.jp

Pythonの関数(オブジェクト) と オブジェクト.関数() の違いは何ですか?

こんにちは。

Python、ひいてはプログラミング言語全般な悩みではないかと思います。 何人かの方にご質問いただいたのでブログでも回答いたします。

Pythonの関数(オブジェクト) と オブジェクト.関数() の違いは何ですか?

これは少しヤヤコシイ問題ですね。

例えば len("文 字 列")"文 字 列" の長さを取得する関数なのに、 "文 字 列".split() は文字を空白文字で分割する メソッド (オブジェクト.関数) ですね。

基本的にはメソッドの場合は、そのオブジェクト固有の処理が多いです。 例えば "文字列".split"文字列".startswith などです。これは文字列固有です。

ですが len は文字列にも、リストにも使えます。 len("文字列") len([0, 1, 2]) なのです。こういった場合は、Pythonでは関数で用意されています。

また、printなどのように特定のオブジェクトの型に関係しない場合も関数で用意されます。


PyCon JP 2017で清水川氏の発表がこの質問と近い内容でした。あわせてご紹介します。

清水川氏の発表のスライドです。

goo.gl

動画もあります。

www.youtube.com

詳しくは、PyCon JP 2017 1日目 参加ログ #pyconjp — 清水川Webを参照ください。

PyCon JP 2017 トークの沢山の動画がYoutubeで公開されています。興味があるタイトルなどを探してみるのも秋の連休の長い夜の楽しみになりそうですね。

www.youtube.com

PyCon JP 2017カンファレンスにブースを出展しました

先日のブログでお知らせしました、2017年9月8、9日に開催されたPyCon JP 2017 カンファレンスにブースを出展しました。 沢山の皆様にお越しいただきましてありがとうございました。 ブースでは、9月7日にリリースいたしました機械学習・データ分析・Web API・スクレイピングなどの問題を実際に体験いただきました。 ブースにお越しいただけなかった方のために、ブースで流していた動画をこちらに掲載します。

blog.pyq.jp

shacho.beproud.jp

www.beproud.jp

動画

ロジスティック回帰

youtu.be

pandas

youtu.be

スクレイピング

youtu.be

Django製ゲストブック

youtu.be

皆様にお会い出来て楽しかったです。(*^_^*)ノ

f:id:kamekokamekame:20170911185516p:plain:w200

『いちばんやさしいPythonの教本』こぼれ話 - コミュニティに参加する意味は?

今日(2017-09-07)からいよいよPyCon JP 2017がはじまりました。ワクワクしますね。株式会社ビープラウドは本日のチュートリアルにも参加しています。

blog.pyq.jp

PyCon JP 2017の明日(2017-09-08)から2日間ブースを出展します。こちらも是非、お越しください。

blog.pyq.jp

今回は先日出版されました『いちばんやさしいPythonの教本』の10章Lesson62. で紹介されているコミュニティの部分についてSlackで議論している時に、コミュニティに何故参加するのか話した内容です。とても良かったので紹介させていただきます。

(Slackの内容をそのまま掲載)

f:id:kamekokamekame:20170904160147p:plain

f:id:kamekokamekame:20170904160151p:plain

f:id:kamekokamekame:20170904160154p:plain

f:id:kamekokamekame:20170904160157p:plain

f:id:kamekokamekame:20170904160602p:plain

(登場人物)

  • Yuichiro Ohtsu: 『いちばんやさしいPythonの教本』の編集者、株式会社リブロワークス 大津様
  • takanory: 『いちばんやさしいPythonの教本』の著者、株式会社ビープラウド すずきたかのり(@takanory
  • hirokiky: 『いちばんやさしいPythonの教本』のコラムの一部を担当、株式会社ビープラウド PyQチーム 清原 id:hirokiky@hirokiky
  • shimizukawa: 『いちばんやさしいPythonの教本』のレビューアー、株式会社ビープラウド 清水川貴之(@shimizukawa

大津様は2017-09-08(金)にPyCon JP 2017内で開催されるメディア会議に参加されます。

pycon.jp

blog.pyq.jp

PyCon JP 2017以外にも毎日沢山のコミュニティイベントが開催されています。勉強の秋に新しいコミュニティを見つけるのも楽しいですね。

勉強会を探すにはconnpassが便利です。

connpass.com