Python+MySQLの内容をDjangoに入れ込む

Python, プログラミング

PythonとMySQLでいい感じにAmazonAPIを使ってDBにKindle情報を溜め込めるようになったため、Djangoに実装していこうと思います。

別のコンテナにあるMySQLにリンクを貼る方法がdocker-compose.ymlを作る以外で見つからなかったため、致し方なくフォルダを新しくした上でポート3304を使ってもうひとつMySQLを立てることにしました。

立てたはいいものの、”Access denied for user ‘django’@’172.19.0.3′(using password: YES)” と前回出たエラーメッセージが再び出てしまいました。つまりはDBにアクセスするときにユーザ名、もしくはパスワードが違うよ~とのことです。以前はユーザーの初期化がしょぼかったのが原因で、さらに初期ファイルで処理しようとしていたのに元データが残ったままで更新ができなかったので、フォルダごと消して初期化してやりました。

ただ、初期化処理をよく見てみると%がついたユーザーを追加するSQL文が書いてあるだけなので、初期化からやらなくてもいいんじゃなかいと思い、mysql-workbenchで修正を試みました。

結果として、root@%のパスワードを更新(Expire Password→再ログイン→新パスワード設定)したらエラー消えました!

Djangoセットアップおさらい

ということで、上記のエラーが消えたあとにDjangoセットアップ完了させる手順のおさらいです。

$ docker-compose run web ./manage.py makemigrations
$ docker-compose run web ./manage.py migrate

これで、Django用にMySQLを設定します。さきほどのエラーは1行目を実行したときに出ました。

$ docker-compose run web ./manage.py createsuperuser --username admin --email admin@localhost

Django用のadminアカウントを追加します。これを行うことでDjangoの管理画面にログインできるようになります。

$ docker-compose up -d

このコマンドでWebサーバーを稼働させます。ちなみに、このコマンドを実行する前はDBが動いていている状態で部分的にDjangoを動かすサーバーにコマンドを送って事前準備をしている状態でした。

あとはブラウザで「http://localhost:8000/admin」を開いてあげればOKです。設定が無事終わっていれば、ログイン画面が出てくるはず。

Django デモ

Pythonエンジニアの第6章の内容をMySQLベースで実行してみました。

プロジェクトの日本語化

mysite/settings.pyにある言語コードとタイムゾーンの修正です。

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

アプリケーションの作成

KindleUnlimitedのExtenderなのでextenderというアプリケーションを作成します。

$python manage.py startapp extender

これは通常環境で作る場合。docker環境でつくる場合(今回)は次のようにします。

$ docker-compose run web ./manage.py startapp extender

このあとにmysite内にあるsettings.pyに今回作成したアプリケーションを追加します。

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'extender.apps.ExtenderConfig',
]

 

赤字が今回追加した行で、アプリケーション名依存の部分になります。

簡単なDjangoのリクエスト処理

Pythonエンジニアの第6章(p250~)の内容です。まずはルーティングの設定を行います。

from django.conf.urls import url
from . import views

#ルーティング設定
urlpatterns = [
 url(r'^hello/$', views.hello, name='hello')
]

プロジェクト全体のルーティングを設定します。

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
  url(r'^extender/', include('extender.urls')),
  url(r'^admin/', admin.site.urls),
]

あとはビューを作成します。

from django.shortcuts import render
from django.http import HttpResponse</pre>

# Create your views here.
def hello(request):
  return HttpResponse('Hello World')

ここまでできたら「http://localhost:8000/extender/hello」をブラウザで開けばOKです。

ちなみに、今回も編集後にエラー発生でアクセスできなくなりました。ミスったところはurls.pyのimportにincludeを入れなかった点と、urlと書くところをurlsと書いていた点。あとは、mysite/urls.pyでindeclude(‘extender.urls’)と書くところを、extender.urlsと書いてしまっていました。

これにより、ブラウザでアクセスしても何も表示されず状態でした。

最終的には、コードを修正し、動いているdocker-composeを止めて、マイグレした上でdocker-composeを再びupしたら動くようになりました。

DjangoでモデルでDB

Pythonエンジニアの第6章(p267~)の内容です。Djangoでデータを追加/削除/一覧表示するためにモデルを作る方法が解説されているのですが、今回はすでにMySQLにDB作成済みなので作成済みのDBを最大限活用していきたいので、この本は一旦横に置くことに。

既存テーブルからモデル作成

$ python manage.py inspectdb tablename > models.py

tablenameに作成したいモデルのベースとなる既存テーブル名を設定すればOK。

テンプレートから呼び出し

結局、既存DBからモデル作成できたのでPythonエンジニアの第6章(p250~)を参考にして、テンプレートhtmlにDBから引っ張ってきたタイトル情報を送別なしに投げ込んでみました。これはすんなりと表示OK。

あとは、これをベースに表示件数を絞ったり、検索機能をつけたり、どちらかいうとフロントエンドまわりを仕上げていきたいと思います。