SlideShare uma empresa Scribd logo
1 de 24
Django Rest Frameworkで
お手軽にREST APIを作る
自己紹介
• 名前(年齢)
松尾 敬太(36歳)長崎県出身
• 家族
嫁、子供×2(女)
• 仕事
株式会社TechJIN
b→dashという
マーケティングプラットフォームで
分析に使うデータの前処理・加工・抽出
• 最近の出来事
ミニスーファミを買いました
自己紹介
目次
• Djangoって?
• REST APIができるまで(スライドで)
• 公式サイトのご紹介
• 【告知】fukuoka.exのご紹介
Django(Rest Framework)とは
• Django(ジャンゴ)
Pythonで実装されたWebアプリケーションフレームワーク(フルスタック)
MVCではなく、MTVで構成
Instagram、Pinterest等、多くの実績を持つ
参考:https://www.slideshare.net/tokibito/django-77900308
• Django Rest Framework
DjangoでRESTfulなAPIを作るための Framework
シンプルで強力な機能が一通り揃っている
REST APIの参考:http://wp.tech-style.info/archives/683#REST_API
REST APIができるまで
前提や準備
• 必要なライブラリのインストール
pip install Django==1.11
pip install django-filter==1.0.4
pip install djangorestframework==3.6.3
pip install PyMySQL==0.7.11
• データベースの作成
今回はMySQLを使います。
「blog」というDBを作っておきます。今回作成するテーブルは以下の通り。
article
title char タイトル
content text 記事内容
status int 状態
member_id int 作成者
created_at datetime 作成日時
updated_at
datetime
更新日時
member
name char 名前
email char メール
birthday date 誕生日
created_at datetime 作成日時
updated_at
datetime
更新日時
プロジェクトとアプリケーション
• Djangoプロジェクトを作成
django-admin startproject mysite
• Djangoアプリケーションの作成
cd mysite
python manage.py startapp blog
• MySQLを使えるようにします
import pymysql
pymysql.install_as_MySQLdb()
mysite/manage.pyに以下を追加
設定ファイルの変更
• mysite/mysite/settings.pyを変更
INSTALLED_APPS = (
...
'blog',
'rest_framework',
'django_filters',
)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
LANGUAGE_CODE = 'ja-JP'
TIME_ZONE = 'Asia/Tokyo'
モデルの定義
• mysite/blog/models.pyに下記を記述
class Member(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
birthday = models.DateField(null=True, default=None)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Article(models.Model):
STATUS_TYPE = (
(0, '下書き'),
(1, '公開中'),
)
title = models.CharField(max_length=255)
content = models.TextField()
status = models.IntegerField(choices=STATUS_TYPE)
member = models.ForeignKey(Member, related_name='articles')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
マイグレーションとスーパーユーザー
• マイグレーションの実行
python manage.py migrate
• Djangoのスーパーユーザーの作成
python manage.py createsuperuser
• マイグレーションファイルの作成
cd mysite ←プロジェクトトップ
python manage.py makemigrations
UsernameとPasswordを設定する
Djangoのadmin画面にログインするときに必要。
シリアライザーの定義
• mysite/blog/serializers.pyを作成し、下記を記述
from rest_framework import serializers
from .models import *
class MemberSerializer(serializers.ModelSerializer):
class Meta:
model = Member
fields = ('id', 'name', 'email', 'birthday')
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ('title', 'content', 'status')
• モデルから取得したデータをどういった項目で、どのような形式で
JSONに変換するかを定義する。
• POSTされてきた登録データをモデルに変換を行う。バリデーション
や登録を行う。
シリアライザーの定義(設定例)
class MemberSerializer(serializers.ModelSerializer):
birthday = serializers.DateField(format='%Y年%m月%d日')
class Meta:
model = Member
fields = ('id', 'name', 'email', 'birthday')
class ArticleSerializer(serializers.ModelSerializer):
member_id = serializers.IntegerField(write_only=True)
member = MemberSerializer(read_only=True)
class Meta:
model = Article
fields = ('title', 'content', 'status', 'member_id', 'member')
例1:リレーション先のデータもシリアライズ
例2:日付を年月日で
シリアライザーの定義(設定例)
class ArticleSerializer(serializers.ModelSerializer):
status_name = serializers.SerializerMethodField()
class Meta:
model = Article
fields = ('id', 'title', 'content', 'status', 'status_name')
def get_status_name(self, obj):
return obj.get_status_display()
例3:区分(状態)を名前で返す
class MemberSerializer(serializers.ModelSerializer):
birthday = serializers.DateField(input_formats=['%Y-%m-%d', '%Y/%m/%d'])
class Meta:
model = Member
fields = ('id', 'name', 'email', 'birthday')
例4:日付のバリデーションチェック(スラッシュ区切りかハイフン区切り)
class ArticleViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
def partial_update(self, request, *args, **kwargs):
serializer = self.get_serializer(self.get_object(), data=request.data, partial=True)
if not serializer.is_valid():
return Response(serializer.errors, 400)
serializer.save()
Member.objects.update_xx(serializer.data) # なんらかメンバー情報をカスタマイズ更新する
article = Article.objects.select_related('member').get(pk=serializer.data['id'])
ret_serializer = self.get_serializer(article)
return Response(ret_serializer.data, 200)
例5:カスタマイズなどで登録処理を手動で記述
シリアライザーの定義(設定例)
ビューセットの定義
• mysite/blog/views.pyに下記を記述
from rest_framework import viewsets
from .serializers import *
class MemberViewSet(viewsets.ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
• ルーティングによって、振り分けられたリクエストをどう処理する
か定義する。
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
permission_classes = (permissions.IsAuthenticated, )
filter_backends = (filters.DjangoFilterBackend, )
filter_fields = ('status',)
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_backends = (filters.DjangoFilterBackend, )
filter_fields = ('status',)
例1:ある項目で検索したい場合(http://****/articles?status=1)
例2:Basic認証したい
※上記2例はsettings.pyの設定が必要です
ビューセットの定義(設定例)
class ArticleViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
def partial_update(self, request, *args, **kwargs):
serializer = self.get_serializer(self.get_object(), data=request.data, partial=True)
if not serializer.is_valid():
return Response(serializer.errors, 400)
serializer.save()
Member.objects.update_xx(serializer.data) # なんらかメンバー情報をカスタマイズ更新する
article = Article.objects.select_related('member').get(pk=serializer.data['id'])
ret_serializer = self.get_serializer(article)
return Response(ret_serializer.data, 200)
例3:部分更新APIのカスタマイズ
リストやIDでのデータ取得はデフォルト
機能を使い、それ以外はカスタマイズで
。
ビューセットの定義(設定例)
ルーティングの定義
• mysite/blog/urls.pyを作成し、下記を記述
from rest_framework import routers
from .views import *
router = routers.DefaultRouter()
router.register(r'members', MemberViewSet)
router.register(r'articles', ArticleViewSet)
• mysite/mysite/urls.pyに下記を記述
from django.conf.urls import url, include ← includeを追加
from django.contrib import admin
from blog.urls import router ← ここを追加
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include(router.urls)) ← ここを追加
]
サーバー起動とアクセス
• Webサーバーを起動
cd mysite ←プロジェクトトップ
python manage.py runserver
• URLにアクセスして動いているのを確認
http://127.0.0.1:8000/blog/
各APIにアクセスしてみる
• Memberに対するCRUDを確認
実演します
http://127.0.0.1:8000/blog/members/
• Articleで登録し、Memberまで取得できるのを確認
実演します
http://127.0.0.1:8000/blog/articles/
公式サイトのご紹介
まだまだいろんな機能がありますので、ぜひ公式を見てください
http://www.django-rest-framework.org/
福岡Elixirコミュ「fukuoka.ex」主催→採用企業増加
告知から17時間で満席、隔月定期開催 (偶数月)
次回は明後日開
催
ご静聴ありがとうございました

Mais conteúdo relacionado

Semelhante a Django Rest Frameworkでお手軽にREST APIを作る

20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
良太 増子
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Akira Inoue
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
 

Semelhante a Django Rest Frameworkでお手軽にREST APIを作る (20)

20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門
 
Springでdao 20070413
Springでdao 20070413Springでdao 20070413
Springでdao 20070413
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)Parse.comと始めるBackbone.js入門(jscafe7)
Parse.comと始めるBackbone.js入門(jscafe7)
 
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピングpi-15. カプセル化, MVCモデル, オブジェクトのマッピング
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
JavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData APIJavaScriptテンプレートエンジンで活かすData API
JavaScriptテンプレートエンジンで活かすData API
 
どこどこJP×Googleアナリティクスで企業アクセスを解析
どこどこJP×Googleアナリティクスで企業アクセスを解析どこどこJP×Googleアナリティクスで企業アクセスを解析
どこどこJP×Googleアナリティクスで企業アクセスを解析
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?Azure でサーバーレス、 Infrastructure as Code どうしてますか?
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
 
20120118 titanium
20120118 titanium20120118 titanium
20120118 titanium
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Django 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブApp
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 

Django Rest Frameworkでお手軽にREST APIを作る