Vue + Axios | APIでビットコインの値段を取得しよう

準備するもの

・なにかしらのAPI

・Node JS, npm

イントロ

VueではAPIのハンドリングはJavaScriptのライブラリに全て任せており、特にビルトインのメソッド等はありません。理由としてはJavaScriptで既にAPIを扱うライブラリが多く存在しているからです。

Axiosとは

まずは公式サイトを見てみましょう。

https://axios-http.com/

あとGitHubのリポも見てみます。

https://github.com/axios/axios

  1. AxiosはAPIのエンドポイント(URL)にHTTPのリクエストを送る為のライブラリです。
  2. そのリクエストから返ってきたdataプロパティを使えるようになります。
  3. リクエストが成功した場合のステータスは200で、ステータステキストはOKです。
  4. 通常はAxiosがJSONデータに自動で変換されます。
  5. タイムアウト設定やリクエストのキャンセルの設定もできます。

Axiosのインストール

では、VueのアプリにAxiosをインストールしてきます。別にVueでなくてもReactでも要領は同じです。

コマンドライン

npm install axios

基本的なAxiosの使い方

ここではAxiosのベース的なイメージを紹介します。

スクリプト側

new Vue({

  el: '#app',

  data () {

    return {

      info: null

    }

  },

  mounted () {

    axios

      .get('https://api.coindesk.com/v1/bpi/currentprice.json')

      .then(response => (this.info = response))

  }

})

HTML側

<div id="app">

  {{ info }}

</div>

このように、infoという、空のオブジェクトをHTML側に投げておいて、AxiosがAPIで取得したデータをのっけるようなイメージです。

mounted() メソッドはVueのライフサイクルの一部で、Vueアプリが作成されて、id=”app”にマウントされたときに実行されるように指示しています。

おまけ

ライフサイクルの流れ(例はOptionsAPIですが、感覚は同じです)

Axiosの慣習的な使い方

では、コンポーネントごとにAxiosのリクエストのコードを書くと、煩雑になるので、ベースとなるJSファイルを作成し、そこから呼び出すようにしましょう。

まずは、src直下にpluginsというディレクトリを作成しましょう。(フォルダ名は何でもよいです。)その下にEventService.jsファイルを作成します。(これも名前は何でも良いです。)

EventService.js

import axios from 'axios'



const apiClient = axios.create({

  baseURL: 'https://api.coindesk.com/v1/bpi/currentprice.json',

  withCredentials: false,

  headers: {

    Accept: 'application/json',

    'Content-Type': 'application/json'

  }

})



export default {

  getCurrentPrice(){

    return apiClient.get('')

  },

}

では、このEventService.jsをコンポーネントから呼び出してみます。

src/components直下にCoinPrice.vueを作成します。

CoinPrice.vue

<template>

<h1>Coin Price</h1>

  <div>

    {{ coins }}

  </div>

</template>



<script>

import EventService from "../plugins/EventService.js";



export default {

  components: {},

  data() {

    return {

      coins: [],

    };

  },

  created() {

    EventService.getCurrentPrice()

      .then((response) => {

        this.coins = response.data;

      })

      .catch((error) => {

        console.log("There was an error:" + error.response);

      });

  },

};

</script>

では、これをApp.cueからレンダーします。

App.vue

<template>

  <CoinPrice />

</template>



<script>

import CoinPrice from "./components/CoinPrice.vue";

</script>

で、デベサーバーを起動すると。。。

問題なくAPIが使えるようになりました。

なので、今後もAPIのエンドポイントが増えた場合はこのEventService.jsにベースとなるコマンドを記載して、必要なコンポーネントから呼び出していけるようになりますね。

HTMLをキレイに

では、必要な情報だけをフィルターしていきましょう。

<template>

  <a-card size="small" title="ビットコインの値段" class="card" style="width:300px;">

    <div>{{ coins.time.updated }} 現在</div>

    <div>{{ coins.bpi.USD.rate }} USD</div>

    <a-button

      type="primary"

      href="https://api.coindesk.com/v1/bpi/currentprice.json"

      >APIデータを直で見る</a-button

    >

  </a-card>

</template>



<script>

import EventService from "../plugins/EventService.js";



export default {

  components: {},

  data() {

    return {

      coins: [],

    };

  },

  created() {

    EventService.getCurrentPrice()

      .then((response) => {

        this.coins = response.data;

        console.log(this.coins);

      })

      .catch((error) => {

        console.log("There was an error:" + error.response);

      });

  },

};

</script>

今回はUIライブラリのant Desginを使っていますがなくてもOKです。

でhじゃ、お疲れさまでした。

Vite + AntDesign でVue3を始めよう | VueのCSSライブラリ

イントロ

皆さん、CSSライブラリは使ったことがありますか?

もちろん、自身で全てのUIデザインを一から作ることができれば素晴らしいのですが、そんな時間はありません!

CSSライブラリで有名なのはBootstrapとかTailwindがありますね。

今日は、Vueのバージョン3に対応したAnt Designを使ってみます。

Vue3に対応していないCSSライブラリ

ここで2つ注目したいCSSライブラリを紹介しておきます。

これらはまだVue3に対応していないので今後のリリースが待ち遠しいですね。

Ant Designとは

Ant DesignはReactのUIデザインのライブラリを提供していることでも知られているCSSライブラリです。

特にVueに対応したライブラリは通常のBootstrapとかと違い、データの扱いが少し楽になっているので今日、それを試してみたいと思います。

公式サイト

https://www.antdv.com/docs/vue/introduce/

Ant Designのインストール

今日はWebデベロッパーから満足度の高いViteを使って環境を作ります。

ViteはVue Cliに代わるデベロップメントツールのことです。

特にBabelというコンパイラを除いたことでめちゃちゃ早くなりました。

その代わりに古いブラウザでのサポートができなくなるとかのデメリットもありますが、それはいたしかたないでしょう。

まずはVueアプリを作ります。

npm create vite@latest

では初期状態のVueアプリが起動できることを確認しましょう。

それから、Ant Designのライブラリをインストールします。

npm install ant-design-vue@next --save

では、後からエラーが出るのでこれも入れておきましょう。

エラーが見たい人は出たら入れてください。

npm i vite-plugin-components -D
http://localhost:3000/
npm run dev

ライブラリのインポート

ではmain.jsからライブラリをグローバルにインポートします。

コンポーネントからインポートしたい人はそのやり方も可能です。

import { DatePicker } from "ant-design-vue";

app.use(DatePicker);

CSSライブラリもインポートしましょう。

カレンダーをインポートしたい場合。

import DatePicker from "ant-design-vue/lib/date-picker"; // for js

import "ant-design-vue/lib/date-picker/style/css"; // for css

Viteのデベツールのコンフィグファイルを更新して使えるようになります。

import ViteComponents, { AntDesignVueResolver } from 'vite-plugin-components';



export default {

  plugins: [

    /* ... */

    ViteComponents({

      customComponentResolvers: [AntDesignVueResolver()],

    }),

  ],

};


Django API Authってなに?Token Authenticationを使ってみよう

サマリー

APIのエンドポイントを守れ!
 

準備するもの

  • Pythonとpip
  • Django RESTFrameworkのプロジェクト

Authってなに?

Authは認証のことで、Autheniticationの事を意味します。ここで、Authorizationと間違える事が多いですがこの2つは全くの別ものなのでちゃんと理解をしておきましょう。

Authentication(認証)→誰かを証明すること

Authorization(権限を与える)→特定のデータへのアクセスを許可するか

なのでAuth(認証)された人がどのPermissionがあるのかを判断する方法になり、それから、認証された人が特定のデータにアクセスできるかをAuthorizeするわけですね。

例でいうと会社のセキュリティカードを持っていればそのカードのステータスによってアクセスできる場所が決まってくるような感じでしょうか。

Authはなぜ必要か

APIのエンドポイントのURI(URL)にアクセスできる誰もがその情報を手に入れることができます。その情報を守るために認証された人だけにデータのアクセス権限を与えるためです。

特にデータの更新や削除ができる権限は限られた人だけに与えたいですよね。

Authの種類について

Djangoで主流なAuthシステムを紹介します。

  1. Basic Authentication→ログインIDとPWだけの簡単なものです。
  2. Token Authentication→トークンを使ってHTTP認証をします。クライアント・サーバーセットアップのデスクトップアプリやモバイルアプリに最適です。
  3. SessionAuthentication→DjangoについてくるセッションAuthのシステムを使えます。時間が経つとログアウトされる仕組みとかも作れます。
  4. JWT(JSON Web Toekn)→ ここ数年で人気になったJSONウェブトークンでの認証システムです。

BasicAuthenticationを使おう

他にJWTとDjoserのライブラリもお勧めです。

まずは公式ドキュメンテーションを読みましょう。

https://www.django-rest-framework.org/api-guide/authentication/

settings.pyの設定

ではプロジェクトディレクトリ内のsettings.pyに下記のラインを追加しましょう。

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.BasicAuthentication',

        'rest_framework.authentication.SessionAuthentication',

    ]

}

Views.pyの設定

ここでAiuthenticationに必要なモジュールをインポートします。

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

from rest_framework.permissions import IsAuthenticated

あとは、クラスを貼り付けるだけ!

from .models import Member

from .serializers import MemberSerializer

from rest_framework import viewsets

#これを追加

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

#これを追加

from rest_framework.permissions import IsAuthenticated




class MemberViewSet(viewsets.ReadOnlyModelViewSet):

    #これを追加

    authentication_classes = [SessionAuthentication, BasicAuthentication]

    #これを追加

    permission_classes = [IsAuthenticated]



    queryset = Member.objects.filter(status="Employed")

    # queryset = Member.objects.all()

    serializer_class = MemberSerializer

APIのエンドポイントの確認

では、DjangoのユーザーでログインしていないブラウザでURIにアクセスしましょう。

このように、APIのデータが出力されなくなりましたね。

ここで重要なのが、APIの発信元がHTTPSでないとログイン情報が盗まれることがあるので必ずHttps://を使うようにしましょう。

しかし、これだとDjangoのアドミンパネルからログインしていないとAPIが見れないのでクライアント側では使えなさそうですね。

(※このログインページはカスタマイズできますが次の方法で試してみましょう。)

TokenAuthを使おう

ではAuthのイメージが沸いたところでTokenAuthの設定をしていきます。

settings.pyの設定

では、REST_FRAMEWORKの項目を下記のように更新しましょう。

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.TokenAuthentication'

    ],

    'DEFAULT_PERMISSION_CLASSES': [

        'rest_framework.permissions.IsAuthenticated'

    ]

}

では、Views.pyのAuthも項目は一旦削除しましょう。

で、APIのエンドポイントに行くとデータが見れなくなったことがわかりましたね。

http://127.0.0.1:8000/api/?format=api

このAPIのルートから全てTokenがないとアクセスが制限されます。

ちなみにこれをなくして、viewごとでauth設定をすることもでき、一部のapiだけにauthをかけられます。

Tokenを取得するURLを作成

まずはsettings.pyに下記のtokenアプリを追加します。

INSTALLED_APPS = [

    ...

    'rest_framework.authtoken'

]

ではurls.pyにTokenを作成するURLを作成します。

from rest_framework.authtoken import views




urlpatterns = [

    path('api-token-auth/', views.obtain_auth_token, name='api-token-auth')

]

URLの名前はなんでもよいです。

アプリを登録した後にDBのマイグレーションを忘れないようにしてください。

これでToeknテーブルがアドミンパネルに表示されました。

これでユーザーがログインしたときに生成されるトークンと照らし合わせてアクセス権限を判断できるようになります。

ログイン情報を作成

もし、ログインする情報がない人は先にスーパーユーザーを作っておきましょう。

python manage.py createsuperuser

テストでリクエストを送ってみる

では下記のURLにアクセスしてみます。

http://127.0.0.1:8000/api-token-auth/

下記のようにGETリクエストが拒否されました。

ではログイン情報と一緒にPOSTメソッドでリクエストを送ってみます。

HttpieでURLにPOSTリクエストを送る

では下記のコマンドでテストツールのhttpieをインストールします。

pip instal httpie

で、先ほど作成したapi-token-authのURLにPOSTリクエストを送ります。

http POST http://127.0.0.1:8000/api-token-auth/ username="admin" password="admin"

これでTokenが作成されればOKです。

トークンを使ってAPIにアクセスする

では先ほど作成されたTokenを使ってAPIにアクセスできるか試してみましょう。

http http://127.0.0.1:8000/api/tickets/ “Authorization: Token 330b6d34c6ac24a3606b14495e9311e0681821c2”

問題なくレスポンスがかえってきましたね。

※同じようにHTTPSを使うようにしましょう。

DjangoをPostgreSQLに接続しよう

DjangoアプリをPostgreSQLに接続しよう

PostgreSQLのインストール

では自分が使っているPCにPostgresをインストールしましょう。

本番環境ではUbuntuとかのLinuxのサーバーにPostgresを入れなおすことになりますが、テスト環境として入れておいたら後からコードも書き直さなくてよいので準備しておきます。

Postgresの公式サイト

https://www.postgresql.org/

インストールはここから

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

この際にDB名とユーザー名、そのPWを保管しておきましょう。

 psycopg2のインストール

ではDjangoがPostgreSQLのデータベースとコミュニケーションを取るためのアダプターをインストールします。

pip install psycopg2

https://github.com/psycopg/psycopg2

Settings.pyの設定

ではSSQLiteの設定をコメントアウトして下記の用に設定していきます。

DATABASES = {

   'default': {

       'ENGINE': 'django.db.backends.postgresql',

       'NAME': '<database_name>',

       'USER': '<database_username>',

       'PASSWORD': '<password>',

       'HOST': '<database_hostname_or_ip>',

       'PORT': '<database_port>',

   }

}

あとはいつも通りにDBのマイグレーションを行います。

python manage.py makemigrations

python manage.py migrate

python manage.py createsuperuser

http://127.0.0.1:8000/admin/

Django REST API COR Headersの使い方

Django CORSとは

Django CORSはホスト側のAPIリソースを取り扱う、そしてセキュリティのメカニズムのことです。

このCORSが設定されていないと、アプリからDjangoAPIとコミュニケーションをしようとしてもエラーになってしまいます。

CORSをインストール

python -m pip install django-cors-headers

Settings,.pyの更新

INSTALLED_APPS = [

...

'corsheaders',

...

]

ミドルウェアの更新

ここで注意したいのはCORSのラインが他のミドルウェアよりも先(上)に来るようにします。

MIDDLEWARE = [

...,

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',

...,

]

Allowed Originの設定

CORS_ALLOWED_ORIGINS = [

"https://domain.com",

"https://api.domain.com",

"http://localhost:8080",

"http://127.0.0.1:9000"

]

CORS_ALLOW_METHODS

必要に応じてHTTPのリクエストのメソッドも制限できます。

CORS_ALLOW_METHODS = [

'DELETE',

'GET',

'OPTIONS',

'PATCH',

'POST',

'PUT',

]

CORS_ALLOW_HEADERS

これも必要に応じてHTTPリクエストのヘッダーを制限できます。

CORS_ALLOW_HEADERS = [

'accept',

'accept-encoding',

'authorization',

'content-type',

'dnt',

'origin',

'user-agent',

'x-csrftoken',

'x-requested-with',

]

Django API ViewsetとForeginKeyの使い方

必要な環境

・Python 3

・pip

・git(※無くても良い)

イントロ

前回はPythonのフレームワークDjangoとDjango Rest Frameworkを使ってクラスベースとファンクションベースのView(views.py)でAPIを作りました。

前回カバーしたのはHTTPのGETリクエストに対してのレスポンスとしてデータを出力しただけです。

まずは、主なHTTPのリクエストを簡単に紹介します。

GETリクエスト➡データ取得

POSTリクエスト➡フォームのサブミット、ログイン、記事の投稿など

PUT➡データの更新、書き換え

DELETE➡既存のデータの削除

詳しくはこちらを参考にしてください。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

では、前回やったAPIViewでも同じようにそれぞれのHTTPでリクエストが来たときにどうやってDjango側がリクエストを扱うかコードで指示できます。

詳しくはこちらを参照。

https://www.django-rest-framework.org/api-guide/views/

しかし、DjangoのREST Frameworkでviewsetという全部のリクエストをカバーしたメソッドがあるのでそれを今日紹介していきます。

環境の設定

まずは下記のGitHubリポジトリからコードをダウンロードしてください。

https://github.com/TraitOtaku/djangoAPI.git

Gitを使ったことがない人はZIPファイルでもダンロードできます。

ではGitのコマンドです。

cdでファイルを作成したい所に行き、

git clone -b 2_Viewset https://github.com/TraitOtaku/djangoAPI.git

で、virtualenvが入っていない人はグローバルに入れます。

pip install virtualenv
virutalenv ENV

ENV\Scripts\activate.bat

(ENV)でアクティベートされていることを確認して、requirements.txtnのパッケージを全部インストールします。

pip install -r requirements.txt

pip list
python manage.py makemigrations

python manage.py migrate

​​​​​​​python manage.py createsuperuser

VSCodeを使っている人はこれでテキストエディタを開きましょう。

code .

python manage.py runserver

コンセプトの紹介

まずは、今日使用するアプリの例を紹介します。例として、コールセンターをイメージしましょう。

この画像のように、Djangoで3つアプリを別々に作成しました。

1.会社で従業員を管理するmembers app

2.顧客を管理するcustomers app

3.顧客からの問い合わせを管理するTicket app

Djangoの良いところはこのアプリを連携されてスケーリングが簡単にできることです。

ではこのアプリがどのように連携されるかデータベースのモデルを見てみましょう。

モデルの理解

members.models.py

従業員のデータモデルです。

Customers.models.py

顧客情報のモデルです。

Tickets.models.py

チケットのモデルです。

ForeignKeyで他のモデルのデータを参照していることに注目してください。

アドミンパネルでサンプルデータを作成

ではアドミンパネルで適当にデータを作成します。

データベースの中身を見る

では、DB Browserという無料のソフトウェアを使ってデータベースの中身を見てみましょう。

TicketのテーブルのForeignKeyで他のテーブルのIDを参照していることに注目してください。

ツールはここからダウンロードできます。

https://sqlitebrowser.org/

Serializerを見る

特に重要なのがこのForeingKeyをどうやってAPIで出力するかです。

もし、Readオンリーであればソース源をそのまま出力できますが、

CRUDオペレーションをしたい場合、(データの作成、読み込み、更新、削除)ちょっとした工夫が必要になりそうです。

Views.pyを見る

ここで今日の本題のviewsetの紹介に入ります。ViewsetはこのCRUDで使うAPIを全部セットで使えるようになった便利なメソッドの事です。これを使うことでいちいちGET、PUT、DELETE、POSTのコードを書かなくても良いようにあります。

もちろん、カスタマイズが必要な場日は、コードを上書きすることもできます。

では、viewsetを見てみます。

今回のアプリでは、membersとcustomersは会社のマネージャーがDjangoのアドミンパネル(サーバー側)から編集すると考えます。

それで、従業員がブラウザ上でチケットを管理するような流れです。

なので、membersとcustomersのデーターはReadOnlyModelViewSetはGETメソッドだけ用に絞ってクライアント側ではリードオンリーのデータした提供されません。

Router.pyを見る

今までのDjangoアプリはurls.pyでURLをそれぞれのアプリから提供していました。APIもこのやり方でも良いのですが、どんどなプリが増えてくるとどのURL(URI)がAPI化されているか煩雑になります。

そこで、プロジェクト側のディレクトリにrouter.pyファイルを作成してAPIのエンドポイントを一つにまとめます。このファイルはプロジェクト側のurls.pyから呼び出されていることを忘れずに。

APIを見てみよう。

では実際に提供されたAPIでCRUD操作ができるか試してみましょう。

次回

では、これで、従業員がAPIを使ってブラウザ側からDjangoアプリにデータをやり取りすることができました。しかし、このままだとAPIが垂れ流しでURL(URI)にアクセスで切る人が誰でもデータをみたり編集できてしましますね。

ですので次回はAuthentication(認証、ログイン)システムを使ってAPIのセキュリティ強化をしてみたいと思います。

ではお疲れさまでした。

Vue JSを始めよう!

準備しておくこと

・NodeJS Version 10~

今回使用するもの

・VueJS バージョン3

公式ドキュメンテーション

https://vuejs.org/guide/introduction.html

イントロ

VueJSはフロントエンドのJavaScriptフレームワークでユーザーインターフェースを作ることができます。

通常のHTML、CSS、JavaScriptに合わせてビルドでき、コンポーネントという概念で開発をより効率よくできます。

他の主要概念として、Declarative Rendering(宣言的レンダリング)やReactivity(反応性)などがありますが、まずは実際にVueJSを触りながら理解していきましょう。

ここでVueJSを開発するうえで2種類のAPIのスタイルがあることを簡単に説明します。この2つはOptionsAPIとCompositionAPIになりますが、CompositionAPIはOptionsAPIの上にできたものなので、まずはOptionsAPIから学ぶことをお勧めします。

ビルドツール

では、早速vueのアプリケーションを作成していきましょう。

Npmでもできますが、今日はvue cliというツールを使っていきます。他にvite(ヴィート)というビルドツールも人気が出てきましたね。色々選択肢が多くてほんと追いつけないっすね。

npmでインストールする方法

このコマンドです。

npm init vue@latest

Vue cliのインストール

npm install -g @vue/cli

# OR

yarn global add @vue/cli


Vue cliのバージョンを確認する

vue --version

Vue cliのバージョンを更新する

npm update -g @vue/cli
# OR

yarn global upgrade --latest @vue/cli

Vue CliでVueプロジェクトを作成する

vue create hello-world

#Helloe-worldの所は自分のプロジェクト名

ここでマニュアルで何をインストールしたいか選択できます。

また、これをプリセットとして保存して再度使う事もできるので便利ですね。

ファイル構成を見る

.gitはバージョンコントロールのGITファイルがあります。

Node_moduleにインストールしたパッケージが格納されます。

例えばBootstrapとか、ChartJSとかですね。

publicにはfav-iconとindex.htmlがあり、vueJSがこの中のid=”app”の部分にアプリをマウントすることになります。

Scrはソースフォルダです。

ここにコンポーネント、ルーティング、ビューのファイルが格納されます。

assetsはグローバルのCSSとか画像を保管するときに使います。

で、App.jsがVueの親のアプリのようなものです。

Main.jsがこの親アプリをどうするか指示するためのファイルになります。

では詳しいファイルの内容は動画で見てくださいね。

お疲れ様です。

Let’s EncryptとCertbotでSSL取得

AsameshiCode

今日の課題 今日は、Let’s EncryptとCertbotを使ってTLS/SSL Certificationを無料で取得します。 今回はウェブサーバーはnginxで行いますが、apacheでも同じことができます。 ちなみに、nginxではデフォルトファイルとは別のサーバーブロックを作成します。ドメイン毎にサーバーブロックをそれぞれ作成することでドメインごとの設定ができます。 準備するもの ・Ubuntuサーバー(20.04) ・root 権限(もしくはsudo権限のユーザー) ・ドメイン(なんとか.com) ・すでにnginxがインストールされていることを前提です。 ・/etc/nginx/sites-available/example.comでアプリがデプロイされていることが前提です。 ・SSHでサーバーに接続できる状態。 ・コマンドラインを使ったことがない人には理解をすることが難しい内容です。 Certbotのインストール では、SSHでサーバーに接続します。私はMobaXtermという無料ツールを2年くらい使っています。詳しいMobaXtermの使い方はこちらの記事を読んでください。 では、Certbotを入れます。 毎回、何を入れているのか公式サイトから確認する癖をつけましょう。 https://certbot.eff.org/ で、下記のコマンドからインストールします。 これでCertBotの準備ができましたが、nginxの方で設定が必要なのでこれからやっていきます。 Nginxの設定 CertBotに自動でSSLを取得するために、正しいサーバーブロックを探すように指示してあげなければいけません。 この記事で説明しているように下記のファイルを先に設定しましょう。 このファイルの中に下記のラインがあることを確認してください。 Nginxのテストをします。 エラーが出た場合はコンフィグを修正してnginxをリロードしましょう。 HTTPSをファイアウォールで許可する Ubuntuサーバーで使われているファイヤーウォールの設定は下記のコマンドで確認できます。 Inactive の場合はsudo ufw enableでアクティブにします。この時にSSHのポートを許可しておきましょう。 では、nginxのポートを許可します。 ここまでできたらCertBotを使ってSSLを取得します。 SSL Certificateを取得 では下記のコマンドでSSLを取得しましょう。 ここで、色々聞かれるので答えていきます。 root@localhost:/etc/nginx/sites-available# sudo certbot –nginx -d ドメイン.com -d www.ドメイン.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: … Read more

DjangoでAPIをつくろう

知っておくべきこと

・Djangoの基本は説明しませんので別の動画/記事で先に理解しておくこと

・Pythonの基本

・APIの意味

今回使用するもの

・Windows10(OSはあまり関係ありません)

・Python3

・pip

・Django REST framework

Django REST Frameworkってなに?

Django自体はバックエンドのフレームワークの中でもスピーディに開発でき、セキュリティも設定されてるいてくる優れモノです。

他にはPHPのLaravelとか、nodeJSのExpressJSとかが近いもので存在します。

詳しくはDjangoの公式ドキュメンテーションを見てください。

https://www.djangoproject.com/

しかし!実際の開発の現場では、Djangoだけの仕事っていうのはあまりありません。DjangoにAPIを組み込んでマルチプラットフォーム(Web、モバイルアプリ、exeファイル)からデータにアクセスさせるというやり方の方が良いです。

これでDjangoの良さを活かしつつ、ユーザー側にはreact、vue、Anguler等のJSフレームワークでフルスタックにする方がスケールもしやすく、デバッグも楽になります。

では、前置きはこれくらいにして早速Django RESTFramework(DRF)を触っていきましょう。

DRFが提供するAPIの種類

APIでは、JSONファイルのデータを公開したり、アプリのデータを発信、受け取る際に使います。例えば天気の情報をAPIで受け取り、自分のサイトに表示するとかですね。

serializerを理解する

Djangoは通常PostgreSQLなどのデータベースと接続されています。デフォルトでは、SQLiteというポータブルのDB(データベース)がついてきますが、セキュリティのこともあり、デプロイする際には使いません。

DRFのSerializerはこのデータベースのデータをシリアル化することによってDjangoアプリからデータをAPIとして公開する役目を持ちます。

views.pyを理解する

ではこのシリアル化されたデータをDjangoのViews.pyというファイルの中でどのように扱うか指示をしてあげます。ここでフィルターをしたり、順番を変えたりもできます。

urls.pyを理解する

最後にどのURLでクライアント(ユーザー側)がアクセスできるかを指示します。

セットアップ

Pythonが入っていることを確認してください。

python –version

python3 —version

仮想環境を使ってホストターミナル(つまりは私のWIndowsPC)から独立した環境を作ります。必要ない人は飛ばしてください。(OSによってコマンドが異なります。)

環境を作りたいファイルパスで下記のコマンド

ENVは私がつけた名前なのでなんでもいいです。

pip install virtualenv

Virtualenv ENV

ENV\Scripts\activate.bat

Djangoのインストール

pip install django
pip list

プロジェクトの作成

Djangoがインストールできたら下記のコマンドでdjangoのプロジェクトを作成します。

django-admin startproject djangoapi

#djangoapiの部分は自分で分かりやすいものにしてください。

で、新しいプロジェクト名のディレクトリができました。

次にDjangoのRESTフレームワークをインストールします。

pip install djangorestframework

pip list

アプリの追加

今できたプロジェクトファイルとは別にアプリケーションごとのディレクトリを作成します。

まずはmasnage.pyのある場所に移動します。

cd djangoapi

python manage.py startapp apiapp

settings.pyを設定

ではテキストエディタでメインのプロジェクトファイルのsettings.pyを開き、

INSTALLED_APPS にrest_frameworkを追加します。

あとさっき作ったapiappも登録します。

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'rest_framework',

    'apiapp',

]

プロジェクトのurls.pyを設定

これもdjangoの設定なので詳しくは説明しません。

apiappのurls.pyに転送します。

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('apiapp.urls'))
]

アプリの方にurls.pyを作成しておく。

from django.urls import path

urlpatterns = [
]

アプリ側のviews.pyの設定

データベースに接続する前に簡単なテキストデータが出力できるか試します。

ここでapiの設定の仕方でファンクションベースとクラスベースの設定の仕方があります。

ファンクションベースは細かい設定がしやすいですが、行が長くなりがちで、クラスベースはコードの数が少ないと違いと考えておいて問題ないと思います。

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view



@api_view(['GET'])
def getData(request):
  person = {'name':'Shiro', 'age':31}
  return Response(person)

さっきのurls.pyにエンドポイントを作成

from django.urls import path
from .views import getData

urlpatterns = [
    path('api/', ('apiapp.urls')),
    path('', getData),
]

テストラン

python manage.py makemigrations

Python manage.py migrate

python manage.py runserver

http://127.0.0.1:8000/をブラウザで開く。

これでAPIのエンドポイントが設定できましたね。

では、実際のデータを参照するように設定します。l

メンバーアプリを作成する。

では、同じ要領でメンバーのデータを参照するAPIを作成していきます。

python manage.py startapp members

settings.pyにアプリを登録

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    # Installed app
    'apiapp',
    'members'
]

モデルの登録

モデルはデータベースの方のようなもので、Django側でデータベースで受け入れるデータの種類やデータの長さを規制しておくことができます。

では、models.pyで下記のように例としてモデルを登録します。

from django.db import models

class Members(models.Model):
  name = models.CharField(max_length=30)
  email = models.EmailField(max_length=60)
  phone = models.IntegerField()
  date = models.DateTimeField(auto_now_add=True)

  #auto_now_addはレコードの作成した日と時間のみ記録する

モデルをシリアル化する

では、このmembersモデルをAPIにするための作業を行います。

Membersディレクトリ内にserializers.pyを作成します。

from rest_framework import serializers
from .models import Members




class MembersSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=30)
    email = serializers.EmailField(max_length=60)
    phone = serializers.IntegerField()
    date = serializers.DateTimeField()



    class Meta:
        model = Members
        # fields = ['name', 'email', 'phone', 'date']
        fields = '__all__'

Viewsの登録

今回はクラスベースでAPIにしてみましょう。

クラスベースの中でもいくつか方法があります。

まずは基本となるAPIviewを使ったやり方を紹介しますが、Viewsetという.CRUDの全部がセットになったものもあります。(CRUDはクリエイト、リード、アップデート、デリートpの略)

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Members
from .serializers import MembersSerializer




class MemberList(APIView):
    def get(self, request, format=None):
        members = Members.objects.all()
        serializer = MembersSerializer(members, many=True)
        return Response(serializer.data)




Urls.pyの設定

プロジェクト側のurls.pyをアプリ側に転送して、アプリ側のurls.pyでclassのMemberListのエンドポイントを作成します。

#djagoapi/urls.py

from django.contrib import admin
from django.urls import path, include



urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('apiapp.urls')),
    path('members/', include('members.urls')),
]

#members.urls.py

from django.urls import path
from .views import MemberList

urlpatterns = [
    path('', MemberList.as_view()),
]

DBをマイグレーション

では、実際にAPIができたかを確認する前に、models.pyのDBの枠組みを流し込みます。

python manage.py makemigrations

python manage.py migrate

python manage.py runserver

テストデータの作成

ではデータが空っぽなのでテスト用に入れていきます。

python manage.py createsuperuser

アドミンパネルにアクセスする前にDBモデルを登録して表示できるようにします。

#members/admin.py

from django.contrib import admin
from .models import Members
# Register your models here.
admin.site.register(Members)

ウェブサーバーを実行してURLからアドミンパネルにアクセスします。

http://127.0.0.1:8000/admin/

Djangoが勝手にmembersにsをつけたのでmodels.pyで変更します。

from django.db import models


class Members(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField(max_length=60)
    phone = models.IntegerField()
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'Members'


    def __str__(self):
        return self.name

Pluralは複数形のことです。

あと、__str__の所で、どのように表示したいか教えてあげます。この場合はメンバーのnameのデータを返してあげるようにします。

では、データ登録してみましょう。

では、これでAPIのエンドポイントに行ってみるとAPIが出力されていることが分かりますね!

では、次回はこのDjango RESTFrameworkのAPIでPOSTリクエストやDELETEのリクエストを送ってユーザー側から記事の投稿や削除ができるようにします。

お楽しみに。

Gitでサーバーのリポを更新しよう

準備するもの

・Ubuntuサーバー

・root権限

今日の課題

Gitは世界のどこのデベロッパーでも使っておきたいバージョンコントロールシステムのことです。

Gitを使ってコードをブランチに分けたり、前のバージョンに戻ったりできるプログラマーの親友です。

今日はGitを使ってサーバーに上げたリポジトリを更新する作業を行います。

サーバーにSSH接続

まずはサーバーにSSH接続しましょう。

私のお気に入りのSSHクライアントはmobaXtermです。他に自分で使っているのがあればそれで構いません。

では、サーバーには入れたらgitをインストールしましょう。

sudo apt install git-all

y/nで聞かれたらyesのy、でエンター。

ではgitをinit(イニシャライズ)したいファイルパスに行き、下記のコマンドを実行します。

.git前の名前は何でもいいです。

git init --bare github-hook.git

post-receive Hookを追加

Initした後に作成されたファイルを見てみましょう。

ではこの中のhooksに移動します。

ここではpost-receiveファイルを作成します。

nano post-receive
git --work-tree=/home/djangoboy/backendAPI/ --git-dir=/home/github-hook.git/ checkout -f

git –work-tree=/pushしたいディレクトリ/ –git-dir=/Gitの場所/ checkout -f

post-receiveを実行ファイルにする

さっき作成したpost-receieveファイルをexcecutableのファイルにします。

これがないとうまくいきません。

chmod +x post-receive

権限をみたい場合は
ls -all

ローカルサーバーでpushの行先を設定

git remote のコマンドでどこにpushするか教えてあげます。

これでローカルのPCで更新したコードをサーバーにpushできるようにします。

git remote add live ssh://root@104.248.231.241/var/repo/myproject.git

例2:git remote add live ssh://root@172.104.81.42/home/dan/ticketapi/github-hook.git

Liveの部分は名称なのでdeoployとかprod(プロダクションの略)とかに変えてもOKです。

でsshの次にサーバーのIPから、pushするパスまでを書きます。

git remote add live ssh://root@172.105.192.111/home/github-hook.git

Push!

git push live master

git push live

おまけ

現在の接続先をみたい場合

git remote -v