Kuroyagi飼育日誌

学んだことの備忘録

Djangoの基礎練習~その1~

Pythonでwebアプリを作りたいのですが、なかなか【記事1】のようなサンプルを真似してもそこからオリジナルに変更するのは周辺知識が無さ過ぎてどうにも上手くいきません。

 

【記事1】
qiita.com

 

 

どうにかカスタマイズしやすい例があればいいのですが…と探していたところ【記事2】を見つけてやろうとしましたが、URLconfをつくるところでurlの部分のlでsyntaxerrorになってしまい、調べてみても分かりませんでした。恐らくurl()が原因だとないとか細かいところの正規表現がおかしくてurl()自体が正しくても読み込みが上手くいっていないとかだと思うのですが…分かる人が見たら一発なのでしょうけれど!


 

【記事2】
プロジェクトを作成しよう · workshop_tutorialJP




ということで、【記事3】をやっていきます。
 



【記事3】
qiita.com




 

まずは仮想環境を作ります。詳細は以下の記事をご参照下さい。
kuroyagi.hatenablog.com

 

 

Python3.6の仮想環境を作り、pipでDjangoをインストールします。





ここまではOK。ただし、【記事3】だとpolls直下におくurls.pyの内容が特に書いていないので初心者では実行できません。





ということで誰か助けて!という状態でしたが【記事4】に分からなかった点も含め書いてありました。





【記事4】
仕事でPython使うことになったので、0から勉強してみた(Django 入門編) | Ardito Tech Blog




やったことを一旦まとめると以下の通りです。後々参照サイトが閉鎖されていると面倒なので、ソースコードコマンドプロンプト上でのコマンドも書いておきます。


1. 仮想環境を作る

py -3 -m venv python36


2. 仮想環境アクティベート


3. Djangoをインストールする

pip install django


4. Djangoインストール確認

python -m django --version


5. プロジェクトを作る

django-admin startproject mysite


6. プロジェクト動作確認
mysiteディレクトリに移動後

python manage.py runserver

webブラウザでlocalhostにアクセス
ポートはコマンドプロンプトに表示されているもの


7. アプリを作る

python manage.py startapp polls


8. アプリのviewを作る
mysite/polss/view.pyを以下の中身にする

from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello!')


9. mysiteのURLマッピングを整える
mysite/urls.pyを以下の中身にする

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

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


10. pollsアプリのURLマッピングを整える

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
]


以上でひとまずwebブラウザでlocalhost:8000/pollsにアクセスするとHello!と表示されます。




【記事3】の内容は一応出来たので、改めて【記事3】に続く【記事4】にチャレンジしてみます。




【記事4】
qiita.com




データベースサーバーを設置して接続してみましょうとのこと。例に倣ってやっていくと上手くいかないところが…


Error loading MySQLdb module: No module named 'MySQLdb'


と出ます。pipでpymysqlをインストールしてpip listでもきちんと表示されています。



Django (1.11.4)
pip (9.0.1)
PyMySQL (0.7.11)
pytz (2017.2)
setuptools (28.8.0)
wheel (0.29.0)


はてさて、何が原因なのか。



色々調べた結果答えは簡単で、import宣言の位置でした。



【mysite/manage.pyの追記間違いver.】

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)


import pymysql
pymysql.install_as_MySQLdb()


【mysite/manage.pyの追記正解ver.】

#!/usr/bin/env python
import os
import sys

import pymysql
pymysql.install_as_MySQLdb()

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)


これでとりあえず一歩前進ですが、また新たな問題が発生しました。



django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'loca
lhost' ([WinError 10061] 対象のコンピューターによって拒否されたため、接続できま
せんでした。)")

さて、どこから手をつけるか…。【記事5】を参考に原因究明してみます。




【記事5】
MySQL :: MySQL 5.6 リファレンスマニュアル :: B.5.2.2 [ローカルの] MySQL サーバーに接続できません





先ずはタスクマネージャーを確認してみます。




タスクマネージャーにmySQL的な名前のものがありませんでした。ということはサーバーが立ち上がっていないのでしょうか。【記事5】にSQLサーバーの起動に関して関連記事の【記事6】があるので読んでみます。





【記事6】
MySQL :: MySQL 5.6 リファレンスマニュアル :: 2.3.6 Microsoft Windows MySQL Server インストールのトラブルシューティング




これでは分からなかったです。




…ん?




pymysqlってただのインターフェースみたいなものだから、もしかしてMySQLは別途必要なのでしょうか!?このあたりは全く触ったことがないのでわかりません。




MySQLをインストールしていないので、もしそうだとしたら初歩的すぎて他の記事には書かれていない可能性が…




ということで試しに【記事7】を参考にMySQLをインストールします。




【記事7】
webkaru.net





動作確認以下のコマンドをMYSQL Command Line Clientにて実行。



show databases;


コマンドなのに最後にセミコロンが必要なことに注意して下さい。私は最初何度も失敗しました。




結果は以下の通りです。



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 rows in set (0.00 sec)


お次はMySQLにDatabaseを作ります。コマンドは以下の通り。



create database データベース名;


ただし、セミコロンのせいか分からないのですが、インストール直後に色々とコマンドを試してcreateが通らなかったです。次の日に試したら通ったので、もしかしたらPCの再起動が必要だったのかもしれません。上手くいかない方は再起動を試してみるとよいかも。




試しにtestというデータベースを作って,showで確認してみると



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| test               |
| world              |
+--------------------+
7 rows in set (0.00 sec)

出来ました!さて、MySQLのインストールが終わったところで仕切りなおしてpythonのほうを見直していきます。




ひっかかっていたのは、そもそもmysql.exeの稼動がタスクマネージャーで確認出来ていないところに端を発していました。




それも当然、MySQLをインストールしていなかったのですものね(笑)




ということで、MySQLのインストール&動作チェック後にタスクマネージャーを見てみるとmysql.exeが稼動していたので、先のエラーで停止していたmanage.pyをrunserverして見ましょう。ちなみにsetting.pyで使うDatabaseの名前は既にMySQL側で作ったデータベース名を使います。パスワードはMySQLのパスワードを入力してあります。




おお!動きました!



You have 13 unapplied migration(s). Your project may not work properly until you
 apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 11, 2017 - 20:04:53
Django version 1.11.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.


ただ、migrationのエラーが13個発生しているので以下のコマンドを実行します。



python manage.py migrate


すると




System check identified no issues (0 silenced).
October 11, 2017 - 20:18:59
Django version 1.11.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

というように、上手く動きました。ただ、migrationってなに?という状態です(笑)後で調べなくてはと思ったのですが、調べるのをスルーしそうなので今調べます。




www.transnet.ne.jp





言語は違えど、意味合いは同じでしょう。イメージはつかめましたが、実感は使っていくことで確認していきます。





この後は【記事4】の通りに進めていけば何の問題もありません。





というとで【記事4】まででひとまず記事を区切っておきます。