Django on Raspbery pi with Apache mod-wsgi 2

さて、前回全体を見通す為に概要を書きましたが、今回は実際の設定を書いていきます。

前回はこちら。

https://benbenbase.dip.jp/ememory/2019/01/09/1494

前回の記事で全体が見渡せるように書いたのですが、今回載せる手順とは若干順序が違います。ただ、前回の記事の順序のほうが最終的には正しいです。
何かにひっかかったら前回記事を見てみてもらえると、なんらかヒントがあるかもしれません。

Apache以外の設定はDjango Girls tutorialを参考に進めていきます。

はじめに · HonKit

まずは私のPythonの環境
今回とりあえず試しで入れようとしているのでバージョンは低いです。
皆さんはバージョンを最新にすることをお勧めします。
Python3でやりましょうね。

$ python3 –version
Python 3.4.3 :: Continuum Analytics, Inc.

$ python –version

Python 3.4.3 :: Continuum Analytics, Inc.

$ which python

/root/miniconda3/bin/python

$ which python3

/root/miniconda3/bin/python3

ちなみに、一応Python3.5までは入っている。(今回使っていないけど)

$ python3.5 –version
Python 3.5.3
$ which python3.5

/usr/bin/python3.5

コードエディタは「jedi-vim」を導入済み。これは別途書きます。
特に何もいれなくてもDjangoの利用には問題無し。

「virtual env」を設定
この後色々苦戦した経緯があり、私は以下のように作業しました。
Apacheのドキュメントルートに作らなくても大丈夫だと思います。(というか推奨されていない)
苦戦した結果としてこのPath使っています。

$cd /var/www/html
$mkdir django                                       #django用ディレクトリを作成

$cd /var/www/html/django                    #作成したディレクトリに移動

$python3 -m venv myvenv                     #Python仮想環境作成 作成後myvenvフォルダができる

$source myvenv/bin/source/activate         #仮想環境のアクティベート
*ちなみに仮想環境を終わらせるときは「(myvenv) $ deactivate」を打てばよい

プロンプトが変わる

(myvenv) $ python3 -m pip install –upgrade pip        #pipをUpgrade
(myvenv) $ cd /var/www/html/django                       #djangoをインストールするためのファイル作成場所

(myvenv) $ vi requirement.txt                                   #requirementファイルを作成

中身に以下を記載
[/django/requirement.txt]

Django~=2.0.6

pipでDjangoをインストール

(myvenv) $ pip install -r requirement.txt #django
(myvenv) $ pwd

/var/www/html/django                                             #作業ディレクトリ確認

(myvenv) $ django-admin startproject mysite .           #最後の「.」はカレントディレクトリにProject作成のこれで/var/www/html/django/mysite が作成される

(myvenv) $ cd /var/www/html/django/mysite

(myvenv) $ vi settings.py

[/mysite/settings.py]
TIME_ZONE = ‘Asia/Tokyo‘                                                   #’UTCから変更
LANGUAGE_CODE = ‘ja‘                                                         #’en’から’ja’へ変更

ALLOWED_HOSTS = [‘*‘]                                                       #とりあえずどのインターフェースや名前でもアクセスできるように記載

STATIC_URL = ‘/static/’                                                         #この下に以下を追記

STATIC_ROOT = os.path.join(‘/var/www/html/django/mysite’, ‘static’)               #Apacheでstaticにうまくアクセスできず左記でうまく対応できた

ここまでで一段落
djangoには開発用の簡易Webサーバー機能があるのでここまでうまくいったか確認

(myvenv) $ cd /var/www/html/django/
(myvenv) $ python manage.py runserver 0:8000

これで”http://サーバーのLocal IPアドレス:8000/” で初期ページが参照できるはず
Ctlr+CでWebサーバーは終了できる。

次はApacheでdjangoを動かす設定をしていく

  • ApacheとDjangoを連携させる。これにはwsgiを使う
  • pipでインストールするmod-wsgiを使う事を推奨する内容が多いが、私はうまくできずaptでlibapache2-mod-wsgi-py3も入れた
(myvenv) $ apt-get install -y apache2-dev      #wsgiを入れる前にいれておかないとエラーになるらしい
(myvenv) $ pip install mod_wsgi                    #pipでwsgiをインストール

(myvenv) $ mod_wsgi-express install-module #wsgiのApache用モジュールが作られる

LoadModule wsgi_module “/usr/lib/apache2/modules/mod_wsgi-py34.cpython-34m.so”

WSGIPythonHome “/var/www/html/django/myvenv”

最後に投入したコマンドで出力したパスにモジュール(私の場合は上のように表示された)とPythonHomeが主力され、ApacheのConfに記述が必要になる
ということだが、うまく設定できず、私は結局ここでできたモジュールなどをApacheに読み込ませていません。

(myvenv) $ cd /var/www/html/django/
(myvenv) $ python manage.py startapp weight        #weightというアプリを作成

「Weight」というのは、私が体重記録用のテストアプリを作ろうと思っているのでこの名前にしています。任意の名前で大丈夫です。

同ディレクトリ内の「settings.py」にアプリを追加

[mysite/settings.py]
INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘weight’,
]

同ディレクトリの「urls.py」に設定追加
[mysite/urls.py]

from django.contrib import admin
from django.urls import include, path              # >これを追加urlpatterns = [
path(‘weight/’, include(‘weight.urls’)),              # >これを追加
path(‘admin/’, admin.site.urls),

同ディレクトリの「wsgi.py」に設定追加
*Apacheの設定からこのファイルを読みに来るので重要

[mysite/wsgi.py]
#/usr/bin/pyhton                     #これは試行錯誤中に入れただけ。いらないかも。
#coding:utf-8                          #これは試行錯誤中に入れただけ。いらないかも。
“””
コメント部省略

“””
import os
import sys                                                                #追加

from django.core.wsgi import get_wsgi_application
sys.path.append(‘/var/www/html/django/mysite’)       #追加

sys.path.append(‘/var/www/html/django/’)                 #追加

os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “mysite.settings”)

先ほど作成した「weight」アプリのurls.pyを設定

(myvenv) $ cd /var/www/html/django/weight
[/weight/urls.py]
from django.urls import path
from . import views                           #ここから下の行追加
urlpatterns = [

path(”, views.index, name=’index’),

views.pyにとりあえずhelloを表示するコーディング実施

[weight/views.py]
from django.shortcuts import render

# Create your views here.                         #ここから下の行追加

from django.http import HttpResponse

import datetime

def index(request):

return HttpResponse(“Hello”)       

ここからは仮想環境を終わらせて対応しても良いです。

$ apt-get install -y libapache2-mod-wsgi-py3    #wsgiインストール
$ a2enmod wsgi                                             #wsgiを有効化 多分すでに有効とでる

site-availableに以下のようにconfファイルを作る。
とりあえず実験的に動かすので最低限の設定。
既存のvirtual hostを生かしたかったので、Port8000番で別virtual hostを立ち上げます。
ここでPathなどが合っていないとうまく使えません。

[/etc/apache2/site-available/django.conf]
<VirtualHost *:8000>
    ServerName benbenbase.dip.jp

    WSGIDaemonProcess weight python-path=/var/www/html/django/mysite:/var/www/html/django/myvenv/lib/python3.4/site-packages

    WSGIProcessGroup weight

    WSGIScriptAlias / /var/www/html/django/mysite/wsgi.py    Alias /static/ /var/www/html/django/mysite/static/

    <Directory /var/www/html/django/mysite/static>

    Require all granted

    </Directory>    Alias /sitemap.xml /var/www/html/django/mysite/static/sitemap.xml     #今時点では不要かも

    Alias /media/ /var/www/html/django/mysite/media/                             #今時点では不要かも

    <Directory /var/www/html/django/mysite/media>

        require all granted

    </Directory>    <Directory /var/www/html/django/mysite/>

        AllowOverride All

        Require all granted

        <Files wsgi.py>

            Require all granted

        </Files>

    </Directory>

 </VirtualHost>

 

$ a2ensite django.conf                      #作成したVirtualHostを有効化
$ service apache2 restart                  #Conf等の有効化

これで、例えば私の場合は以下のようなURLで「Hello」という画面が出力するはず。
「http://benbenbase.dip.jp:8000/weight/」

  • 実際は、私はこのあとリバプロの設定などをしているのでこのURLでは表示されません。
  • 記載ミスなんかがあって動かなかったらすいません。
  • Django用のフォルダ以下はApacheが読み書きできるように権限をつけて下さい。
    Read権限だけではだめなファイルがあるので注意してください。

Apacheで表示されるようになったらDjangoGirlsチュートリアル(冒頭のリンク)の「プロジェクトを作成しよう!」あたりからやってみれば簡易Blogアプリは簡単に作れるでしょう。

二点注意があります。
wsgiにはバグのようなものがあるらしく、views.pyなどを変更してhtml出力を変えよう(Pythonを書き変えてそれをApacheに伝えてページを更新しよう)とする時に、wsgiのモジュールを再読み込みしないと、旧htmlがキャシュされた状態になり更新できません。

この設定を使ってDjangoGirlsチュートリアルを進めるとPathに関する問題に遭遇します。
例えばStaticはアプリ(/django/weight)のフォルダではなく、プロジェクトのフォルダ(/django/mysite)を見に行きます。
/staticはプロジェクトのフォルダ配下に作るなどPathの読み替えが必要なことあらかじめ承知下さい。

Apacheのリスタートをしてしまえばモジュールはリロードされるので、開発期間中などは良いと思いますが、きちんと動かすならやり方を詰めたほうが良いです。

それではPython Web App 開発を楽しんでください!

タイトルとURLをコピーしました