Djangoでのwebアプリの作成[基礎編〜ローカルサーバー構築まで〜]

## Part1 Djangoの説明
Djangoは，Pythonで書かれたWebアプリケーションフレームワークである．この記事では簡単にwebアプリケーションを作成するためのサーバー構築を説明する．この内容を発展させてReactとの連携，MySQL,PostgreSQLへの接続，PaaS上へのデプロイも可能である．

### Djangoでできること
##### Webアプリケーション開発
ブログ，SNS，ECサイトなど，様々なWebアプリケーションを開発できる．
##### API開発
RESTAPIなどのAPIを開発できる．
##### データ管理
データベースとの接続，CRUD操作などが簡単にできる．
##### ユーザー認証
ユーザー登録，ログイン，ログアウトなどの機能を実装できる．
##### 管理画面
開発したWebアプリケーションの管理画面を自動生成できる．

### Djangoの特徴や利点

##### 1.高速な動作
標準でキャッシュ機能が備わっており，大規模サービスにも対応できる．
##### 2.開発効率の高さ
豊富な機能が標準搭載されており，開発時間を短縮できる．
##### 3.使いやすさ
Pythonの構文に基づいており，初心者でも比較的習得しやすい．
#### 4.セキュリティ
CSRF対策やSQLインジェクション対策など、セキュリティ機能が充実している．

#### 5.拡張性
豊富なライブラリやサードパーティ製ツールが存在し，拡張性が高い．

### Djangoの利用例
YouTube
Instagram
Pinterest
Spotify
Dropbox

## Part2 Django環境構築
#### 必要な環境
1\.Python 3.6以上
2\.Django
(3\.仮想環境)
>Dockerを用いて環境構築する方法は以下の記事で紹介している
>https://qiita.com/tarakokko3233/items/39e91cd39a12d1507b06

#### 1.Pythonのインストール
Python公式サイトから，OSに合ったインストーラーをダウンロードする．
[Python公式サイト](https://www.python.org/)

ダウンロードしたインストーラーを開いてPythonをインストールする．


#### 2.仮想環境を作成する(推奨)
仮想環境は，開発環境と本番環境を分離するために使用される．

**仮想環境の作成**
```
$ python -m venv venv
```
>`python -m venv venv`で`command not found: python`が出るならば`python`を`python3`と書き換えて実行すること．

カレントディレクトリにvenvファイルが作成される．(venvファイルはPython仮想環境を構築するためのフォルダと思ってください)

**仮想環境のアクティベート**

Mac用
```
$ source venv/bin/activate
```
Windows用
```
$ venv\Scripts\activate
```


#### 3.pipのインストール
pipは，Pythonパッケージをインストールするためのツール．
仮想環境が有効化されている状態で，以下のコマンドを実行してpipをインストールする．
```
$ python -m ensurepip --upgrade
```
#### 4.Djangoのインストール
仮想環境が有効化されている状態で，以下のコマンドを実行してDjangoをインストールする．
```
$ pip install django
```
>`python3`で実行した人は`pip`でエラーが起きる場合があるので`pip3`で実行すること

## Part3 Djangoプロジェクトの作成
#### 1.Djangoプロジェクトを作成する
プロジェクトを作成したい任意のディレクトリに移動する.(デバイスのルートディレクトリに作成するならば不要)
`your/project/directry`に任意のディレクトリを指定する.
```
$ cd your/project/directry
```
Djangoプロジェクトを作成する.
`yourprojectname`は任意のプロジェクト名
```
$ django-admin startproject yourprojectname
```

#### 2.Djangoアプリケーションを作成する
カレントディレクトリが`yourprojectname`になっていることを確認する．
もし`yourprojectname`でないならば以下のコマンドを実行．
```
$ cd yourprojectname
```
Djangoアプリケーションを作成．
`yourappname`は任意のプロジェクト名
```
$ python manage.py startapp yourappname
```

#### 3.設定ファイルの編集
`yourprojectname/yourprojectname/settings.py`を開き，
`INSTALLED_APPS`の中に
```yourprojectname/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'yourappname', #これを追加
]
```
を追加する．これはDjangoにアプリケーションyourappnameを認識させるために必要である．

さらに
`ALLOWED_HOSTS`の中に
```yourprojectname/settings.py
ALLOWED_HOSTS = [
    'localhost',
    '127.0.0.1',
]
```
を追加する．これは後ほどローカルのIPアドレス(開発環境のホスト名)でローカルサーバを立ち上げることを許可するために必要である．

#### 4.ローカルで開発用サーバーが立ち上がるか確認

Djangoプロジェクトがうまく動作するかを確認する．　
カレントディレクトリが`yourprojectname`であることを確認．
```
$ python manage.py runserver
```
コマンドライン上でこのように出力されるかを確認．
```
Performing system checks... 

System check identified no issues (0 silenced).  

You have unapplied migrations; your app may not work properly until they are applied. 
Run 'python manage.py migrate' to apply them.  

1月 01, 2000 - 00:00:00 
Django version 4.0, using settings 'yourprojectname.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C.
```
Edge ,Chrome ,Safari,Firefoxなどで

http://127.0.0.1:8000/ 

にアクセスして以下の画面になるかを確認する．

![ad62a72f-9820-710b-48d8-3732916e5d02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3757442/ff658f0b-5c2c-8f72-bcf8-3d57bc00028f.png)

以上でプロジェクト作成完了である．
開発用サーバーを閉じたいならばコマンドライン上で`ctrl+C`を入力すれば閉じられる．

これでDjangoプロジェクトを作成可能である．
## `補足` Djangoプロジェクトの階層構造
```
yourprojectname/
    manage.py
    
    yourprojectname/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
        
    yourappname/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py


```

**manage.py**
Djangoプロジェクトに対する操作を行うための様々なコマンドラインが定義されているファイル．

**yourprojectname/_ _ init _ _.py** 
このディレクトリがPythonのパッケージであること知らせるための空のファイル．

**yourprojectname/settings.py**
Djangoプロジェクトの設定ファイル．

**yourprojectname/urls.py**
Djangoプロジェクト全体のURLの定義(エンドポイント定義)

**yourprojectname/asgi.py**
プロジェクトを提供するASGI互換のWebサーバーのエントリポイント

**yourprojectname/wsgi.py**
プロジェクトをサーブするためのWSGI互換のWebサーバーとのエントリーポイント

**yourappname/_ _ init _ _.py** 
このディレクトリがPythonのパッケージであること知らせるための空のファイル．

**yourappname/admin.py**
Django管理画面でアプリケーションのモデルを管理するための設定ファイル.モデルの登録,一覧表示,編集画面の設定などを記述.

**yourappname/apps.py**
このアプリケーションの設定ファイル.
アプリケーションの名前,モデル,管理画面の設定などを記述する．

**yourappname/migrations/_ _ init _ _.py** 
このディレクトリがPythonのパッケージであること知らせるための空のファイル．
` migrations` ディレクトリはデータベースマイグレーションのためのディレクトリ.
モデル`(models.py)`の変更に伴い，データベースのスキーマを変更するためのファイルが格納される．

**yourappname/models.py**
アプリケーションで使用するモデルを定義するファイル．
データベースのテーブルと関連するフィールドを定義する．

**yourappname/tests.py**
このアプリケーションのテストコードを記述するファイル.
モデルやビューの動作を検証するためのテストコードを記述する．

**yourappname/views.py**
URLと処理を関連付けるビューを定義するファイル.
ユーザーからのリクエストを受け取り,処理結果を返すコードを記述する．

上記は基本的なファイル構成であり、必要に応じて追加のファイルを作成することができる．

**各ファイルの詳しい説明や使用法は以下の記事を参照**

https://qiita.com/tarakokko3233/items/8787692aaf9b1d943205

>`引用`Djando公式ドキュメント
>https://docs.djangoproject.com/ja/4.0/intro/tutorial01/