Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@shu1124

Railsしか触ったことないけどPython・Djangoに挑戦してみた 〜環境構築・hello world編〜

背景

話題のPython/Djangoに興味を持ったので勉強をはじめました。
ruby on railsを独学で勉強したので、ある程度の動的言語の仕組みは理解しています。

本記事の目標

Djangoでhello worldさせる。またDjangoのファイル構成や基本を理解する。

【参考】
・本記事はudemyの講座『【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!(Django2版 / 3版を同時公開中です)』で学んだ内容のアウトプットです。なのでコード等は講座の内容がベースとなっております。
・pythonの基礎文法はprogateとpyqで学びました。

目次

  1. 環境構築(mac)
  2. アプリとプロジェクトについて
  3. Djangoのファイル構成
  4. hello worldを記述する
  5. まとめ

では早速いきましょう!

1.環境構築(mac)

調べたところによると、rubyのrbenvのようにpyenvというパッケージを使う方法とvirtualenvを使って仮想環境を用いるやり方がありました。
今回はvirtualenvを使った環境構築をします。

(参考URL)
pyenvでの環境構築:『Python3+Djangoで初心者がMac内に環境構築した手順
virtualenvでの環境構築:『macローカル仮想環境にDjangoの開発環境を設定する

※他にもdockerやpycharmを使う方法もありました。むしろdockerやpycharmを使う方法が現場ではスタンダードかもしれませんが、今回はわかりやすさを重視しました。

■Homebrewのインストール

Homebrewはmacのパッケージマネージャーです。PCに言語をインストールするときに、パッケージの依存関係を解決してくれます。
自分はrubyで開発したことあるので、すでにインストールしてありますが、念の為書きます。

ターミナル
# インストール
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 確認
$ brew -v
Homebrew 3.0.0

■python3のインストール

Homebrewを使ってpython3をインストールします。pythonは現状3のバージョンを使っていることがほとんどだと想います。

ターミナル
# インストール
$ brew install python

# 確認
$ python3 -V
Python 3.9.1

■pip3のインストール・virtualenvのインストール

pipはpythonのパーッケージ管理ツールです。pipとpip3がありますが、基本的にはpython2とpython3が共存していない限り気にしなくて良いそうです。
virtualenvは一つのシステムの中に分離されたPythonの仮想環境を作ることができるものです。仮想環境ごとにパッケージを管理するので、バージョンによるパッケージ依存を気にしなくて良くなります。

ターミナル
# pip3のインストールとアップデート
$ sudo -H pip3 install --upgrade pip

# virtualenvのインストール
$ sudo -H pip3 install virtualenv

# virtualenvを起動させるファイルの作成・移動
$ mkdir django_helloworld
$ cd django_helloworld

# virutualenvのファイルの作成
$ virtualenv venv

■仮想環境の立ち上げ

virutualenvのファイルを作成した場所でコマンドを入力することで仮想環境が立ち上がります。仮想環境が起動するとターミナル上に「$(venv)」と表示されます。

ターミナル
#仮想環境を立ち上げる
$source venv/bin/activate

#仮想環境を無効化
$(venv)$ deactivate


2. プロジェクトとアプリケーションについて

Djangoには「プロジェクト」と「アプリケーション」という概念があります。「プロジェクト」に複数の「アプリケーション」がくっついているイメージです。もう少し具体的にいうと、よくあるSNS系のwebアプリではメインの画面にタイムライン・ユーザー一覧・人気投稿ランキングなどが表示されますが、Djangoの世界ではこのタイムライン・ユーザー一覧・人気投稿ランキングがそれぞれ1つの「アプリケーション」で、それを束ねているのが「プロジェクト」になります。
『プロジェクト」と「アプリケーション」は作成方法が似通っており混同しやすいですので、しっかり理解して進めて行く必要があります。


3. Djangoのファイル構成

■プロジェクトの作成

startprojectコマンドによってプロジェクトを作成することができます。「helloworldproject」は任意のプロジェクト名です。またプロジェクトの作成時に「manage.py」にされますが、ここにはサーバーの起動に関する記述もあり、それをもとに「runserver」コマンドを入力することでローカルサーバーが起動します。

ターミナル
$ django-admin startproject helloworldproject
$ pthon manage.py runserver

■アプリケーションの作成

manage.pyはプロジェクト作成した際に生成されるファイルです。そのファイルの情報をもとにアプリケーションが作成されます。「helloworldapp」は任意の名前です。

ターミナル
$ python manage.py startapp helloworldapp

■生成されたファイルの説明

django_helloworld
    ├ venv/
    ├ helloworldproject/
        └ helloworldproject/
            └ pychache/
            ├ init.py
            ├ asgi.py
            ├ setting.py
            ├ urls.py
            ├ views.py(手動で作成)
            ├ wsgi.py
        └ helloworldapp/
            └ migrations/
            ├ init.py
            ├ admin.py
            ├ apps.py
            ├ models.py
            ├ tests.py
            ├ views.py
        ├ templates(手動で作成)/
            └ hello.html(手動で作成)
         ├ db.sqlite3
         └ manage.py

■venv
・ venvは先程作成した仮想環境構築のためのフォルダです

■helloworldproject
・「init.py」は『Pythonディレクトリを表す役割を担う』『モジュールをimportするときの初期化処理を行う』というものらしいです。中規模〜大規模な開発をするときは細かく知らないといけないですが、今はimportするときに必要なファイルと把握しとけば問題ないです。
・「asgi.py」は「wsgi.py」の後継のもので、基本ノータッチで大丈夫です。「wsgi.py」はwebサーバーとアプリケーションサーバーの間を取り持つ設定が書いてあるファイルです。
・「setting.py」はDjangoの一般の設定が書いてあります。例えばパスの設定、ミドルウェアの設定、秘密鍵など、幅広い設定の記述があります。
・「url.py」は」ルーティングのファイルです。どのURLのリクエストが送られた場合、どのアプリケーションに振り分けるかを設定します。
・「views.py」は後述しますが、ルーティングで振り分けられた際のアクションを記述するファイルです。

■helloworldapp
・「init.py」の役割はプロジェクトで説明したものと同じです
・「admin.py」は管理画面に関しての記述です。
・「app.py」はアプリケーションに関しての記述が書いてあります。
・「model.py」はモデル・データベースに関する記述が書いてあります。
・「test.py」はテストを書いていく場所です。
・「views.py」の役割はプロジェクトで説明したものと同じです。

■templates
・こちらは実際に表示するhtmlファイルを保存するファイルです。後ほど説明します。

■manage.py
・こちらはサーバーの起動やアプリケーション作成など、pythonコマンドで使える機能が記述してあります。「python manage.py ~」でコマンドを実行できます。


4. hello worldを記述する

■Djangoの基本構造

Djangoにもrailsでいうルーティング・コントローラ・モデル・ビューにあたるものがあります。ただ大きく異なるのは「プロジェクト」と「アプリケーション」間でのやりとりがあることです。
流れとしては、URLでリクエストが送られる→プロジェクトの「url.py」のページでルーティングして適当なアプリケーションに振り分けられる→アプリケーションの適切なルーティング・アクションが呼び出される→必要によってはmodel.pyを通しデータベース操作をする→呼び出されたアクションをもとにテンプレートが呼び出される→レスポンスを返す、という流れで処理が行われて生きます。

■プロジェクトのみでhello world

基本的にはアプリケーションを通して処理することがほとんどですが、静的なページであればプロジェクト内にコントローラの役割をするviews.pyを用意することで、プロジェクトのみでページを表示することができます。また、プロジェクトからhello worldを記述するやり方はメソッドを呼び出す方法とクラスを呼び出す方法の2種類があります。今はどちらでもよいですが、今後djangoを開発する際には重要になるので覚えておきましょう。「localhost8000/helloworld」でhello worldが表示されていると思います。

hellowoldproject/url.py
from django.contrib import admin
from django.urls import path
from .views import helloworldfunction, HelloWorldClass

urlpatterns = [
    path('admin/', admin.site.urls),
    path('helloworld/', helloworldfunction),#メソッドの呼び出し
    path('helloworld2/',HelloWorldClass.as_view()),#クラスの呼び出し
]
hellowoldproject/views.py(手動作成)
from django.http import HttpResponse #djangoが用意しているパッケージをインポート
from django.views.generic import TemplateView #djangoが用意しているパッケージをインポート

def helloworldfunction(request):#ルーティングからのリクエストを引数で受け取る
  returnedobject = HttpResponse('hello world')
  return returnedobject

class HelloWorldClass(TemplateView):
  template_name = 'hello.html'
templates/helloworld.html(手動作成)
hello world
hellowoldproject/setting.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],#追加
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

■プロジェクトとアプリケーションをつないでhello world

流れを整理すると、プロジェクトのsetting.pyでアプリケーションの読み込み→プロジェクトのurl.pyでアプリケーションの振り分け→アプリケーションのurl.pyでアクションの呼び出し→views.pyに定義されたアクションが実行される、という流れです。ちなみにアプリケーションの方にはデフォルトでurl.pyがないですが、基本的にはあったほうがアプリケーションとプロジェクトのつながりがわかりやすいので、手動で作成しましょう。最後に「localhost8000/app/helloworldapp」にアクセスしたらhello worldが表示されているはずです。

hellowoldproject/setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'hellloworldapp.apps.HelloworldappConfig'#アプリケーションの追加
]
hellowoldproject/url.py
from django.contrib import admin
from django.urls import path, include
from .views import helloworldfunction, HelloWorldClass

urlpatterns = [
    path('admin/', admin.site.urls),
    path('helloworld/', helloworldfunction),
    path('helloworld2/',HelloWorldClass.as_view())
    path('app' include('helloworldapp.urls')#アプリケーションの振り分け
]
hellowoldapp/url.py(手動作成)
from django.urls import path
from .views import helloworldappview

urlpatterns = [
    path('hellowroldapp/', hellowroldappview)#アクションの呼び出し
]
hellowoldapp/views.py
from django.shortcuts import render
from django.http import HttpResponse

def helloworldappview(request):
  return HttpResponse('hello world')


5.まとめ

環境設定やファイルの作成はrailsと異なる部分は多いものの、動的言語の基礎を抑えておけばすんなり理解することができました。ただプロジェクトとアプリケーションという概念になれるのは少し時間がかかりそうなので、どんどんアプリ作成して練習していきたいです。次はDjangoを使ったSNS系アプリケーションを作成し、最終的にはDjango api × react のアプリケーションを作成したいです。

参考

【udemy講座】
『【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!(Django2版 / 3版を同時公開中です)』
『[基礎編]React Hooks + Django REST Framework API でフルスタックWeb開発』

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
shu1124
2021.4~ 都内でバックエンドエンジニアをやっています。rails, AWS, Dockerに関する記事が多いです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?