Django
Apache
Python3

pyenv+anaconda+Mac+Apache+postgre+vscodeでDjango Girls Tutorial

More than 1 year has passed since last update.

はじめに

こちらの記事で紹介されていたDjango Girls Tutorialを最後までやってみたのでメモっぽいの残します。

環境構築の詳細は他記事にもあるので
簡単な手順とハマったところ等思い出しながら書いていきます。
ちなみに割りと忘れてます。

環境

$ python --version
Python 3.6.1 :: Anaconda 4.4.0 (x86_64)

$ conda info -e
djApp ~/.pyenv/versions/anaconda3-4.4.0/envs/djApp

$ httpd -v
Server version: Apache/2.4.25 (Unix)

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.6

$ psql --version
psql (PostgreSQL) 9.6.5

手順

python環境構築

pyenvで3.6をインストール済みって前提で、
conda createでDjangoを動かす環境を作成。
今回は名前をdjApp(命名規則とか知らない)としてDjangoパッケージをインストール。
djAppをアクティブにしてからpipでいれたっぽい。
activateは省略したら怒られたのでフルパスで
$ source ~/.pyenv/versions/anaconda3-4.4.0/bin/activate djApp
確認
$ conda list
Django 1.11.5 <pip>

ここからDjango Girls Tutorialを始めて
プロジェクトフォルダ作成した辺りでvscodeの設定

vsCodeの設定

当初無料版のpycharmでやりかけてたが、
web開発となるとデバッグの設定周りがアレらしいので
デフォルト?でDjangoのデバッグ設定の雛形のあるvscodeを選択。
pycharmのほうだとなかなかdjangoのモジュールをロードしてくれなくて設定に手こずったけど、
(pipでインストールし直したらいけたとかいけなかったとか。後述のpostgreで使うモジュールだったかな..)
vscodeのほうはすんなりいった気がしなくもない。
とりあえずlaunch.json内の"name": "Django"のセクションを確認。
たぶんあんまり修正してない。
 {
"name": "Django",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"pythonPath": "${config:python.pythonPath}",
"program": "${workspaceRoot}/manage.py",
"cwd": "${workspaceRoot}",
"args": [
"runserver",
"--no-color",
"--noreload",
"--nothreading"
],
"env": {},
"envFile": "${workspaceRoot}/.env",
"debugOptions": [
"WaitOnAbnormalExit",
"WaitOnNormalExit",
"RedirectOutput",
"DjangoDebugging"
]
},

anacondaで環境作ってるのでそれを見るように設定変更。
Code→基本設定→設定→ワークスペースの設定から1行追記
"python.pythonPath": "~/.pyenv/versions/anaconda3-4.4.0/envs/salesforce/bin/python"
後から気づいたけど今回はanacondaのルートディレクトリのほうにインストールしちゃってた。
activateしたからpip installしたのにおかしいなぁ。
pip -Vで確認したらdjAppのほうのsite-packagesを見るようになってるんだがなー。

postgreと連携

デフォルトだとsqliteらしい。
今後プロジェクトで使ってくらしいpostgreを練習がてら使いたかったのでこちらの記事を参考に設定。
postgre自体はpgAdminってGUIツール使いたかったので公式サイトから落としてきた気もする。
brew services list
brew services postgresql start

apacheの設定

チュートリアルではrunserverコマンドでやってたが、とりあえず連携しかった。
既存のphpプログラムと競合しちゃうとまずいのでdjapp.comでアクセスされたときにDjangoを使うように設定。
たぶんここが一番ハマった。

mod-wsgiというモジュールをpip install
httpd.confでロード。
virtual hostした場合httpd.confとhttpd-vhosts.confどっちに書けばいいの??ってのは
公式の各ConfigurationにContext:server config,virtual hostといったふうに書いているのでそれ参照。

httpd.conf
LoadFile ~/.pyenv/versions/anaconda3-4.4.0/envs/djApp/lib/libpython3.6m.dylib
#↓だけだとapachectl configtestで依存パッケージ(↑)を読み込めずエラーになったので↑追記
#権限不足のエラーもあったので#chmod 755もした気が
LoadModule wsgi_module ~/.pyenv/versions/anaconda3-4.4.0/envs/djApp/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
WSGIPythonHome ~/.pyenv/versions/anaconda3-4.4.0
WSGIPythonPath ~/Sites/djApp:~/.pyenv/versions/anaconda3-4.4.0/envs/djApp/lib/python3.6/site-packages

httpd-vhosts.conf
<VirtualHost *:80>
ServerName djapp.com
DocumentRoot ~/Sites/djApp
#↓デバッグの時は問題なかったがapache経由で/static(の下のcssファイル)を呼ぶとwsgi.py(urls.py)さんがそのurlマッチしないぞって怒るので設定
Alias /static "~/Sites/djApp/static"
WSGIScriptAlias / ~/Sites/djApp/mysite/wsgi.py
<Directory ~/Sites/djApp>
Order deny,allow
Allow from all
</Directory>
</VirtualHost>

/private/etc/hosts
127.0.0.1 djApp.com

これでhttp://djapp.comhttp://127.0.0.1:8000/と同じものが見れるはず。
ついでにプロキシ有効にしてiphone実機からも確認。
charles使えばいいんですけど一応。

httpd.conf
LoadModule proxy_html_module libexec/apache2/mod_proxy_html.so
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
Include /private/etc/apache2/extra/proxy-html.conf

proxy-html.conf
<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On
Listen 8080
<Proxy *>
Order deny,allow
Deny from all
Allow from all
</Proxy>
</IfModule>

Macの設定.共有.インターネット共有をON
iphoneでそのwifiのネットワーク設定を変更

HTTPプロキシを設定.手動
サーバ:Mac.設定.ネットワーク.IPアドレス
ポート:8080

うまくいくとMacからと同様にhttp://djapp.comで見れる!...はず!

フォルダ構造

参考までにDocumentRootの構成を。
チュートリアルやっただけだけどそれっぽくなってる感
~/Sites/djApp
├── djangoapp←アプリの実体はこっち
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── admin.cpython-36.pyc
│ │ ├── forms.cpython-36.pyc
│ │ ├── models.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── views.cpython-36.pyc
│ ├── admin.py←管理画面の設定
│ ├── apps.py
│ ├── forms.py←フォームを自作
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ ├── 0001_initial.cpython-36.pyc
│ │ └── __init__.cpython-36.pyc
│ ├── models.py←テーブルの構造を設定
│ ├── templates←htmlを置く
│ │ └── djangoapp
│ │ ├── base.html
│ │ ├── post_detail.html
│ │ ├── post_edit.html
│ │ └── post_list.html
│ ├── tests.py
│ ├── urls.py←リクエストとビューのマッピング
│ └── views.py←リクエストメソッドで分岐したりしてhtml呼ぶ
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── settings.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── wsgi.cpython-36.pyc
│ ├── settings.py←アプリを読み込んだり、言語、DBの設定等
│ ├── urls.py←大元のマッピング。ここから各アプリのurls.pyをインクルードしてる
│ └── wsgi.py
└── static←静的リソースを置く
└── css
└── djangoapp.css

終わりに

Djangoを使ってみて

管理画面が便利だなと。
DBのテーブル構造をpythonで書いてマイグレーションして
管理画面のソースにこのテーブルも扱っていいよって1行追加するだけで
ブラウザから管理画面にログイン→CRUDが標準でできるって凄くない?
調べてみたら世の中にはscaffoldってのもあるんですね。

メモ大事

たぶんきっと自分の頭の中ではトラブルシューティングが出来上がってて、
今後トラブった際には対応出来るんだろう、うん。
でも今回みたいにメモで残す時ようのメモを随時残していかないとなと反省。
また何か思い出したら追記していきます。