SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
Djangoの深〜いパーミッシ
ョン管理の話
@hirokiky
http://slides.hirokiky.org/pyconjp2017.html
対象の方
Pythonを使う人
Djangoを使う人
チュートリアルやった
自分でアプリ作った
権限管理の悩み
Viewのif文で権限の判定つらい
Templateでも判定必要
自前のデコレーターで管理が破綻
DjangoのPermissionは使わない
Agenda
第1部: Djangoでの権限管理の定石紹介
第2部: 検討したライブラリー
第3部: こんなライブラリー作った
自己紹介
@hirokiky
BeProud Inc でPyQを作っています
PyQという製品作っています
PyQは本気でプログラミングを
学べる
Pythonをブラウザだけで動かして学ぶ
プロフェッショナルになれるレベルで学ぶ
Webや機械学習、データ分析も学べる
PyQリリースと成長
2017年4月にリリースして順調に成長
コンテンツ拡充(機械学習など)
機能拡張
JupyterNotebook対応
他色々な対応
製品の成長と設計
製品の成長と設計
まずは作ることが大切
初期は小さい設計で良い
成長に合わせて設計も成長させる
設計の是正
第一部
Djangoでの権限管理の定石
紹介
Lv1 Viewでif文
def premium_articles(request):
if request.user.plan.code != PREMIUM:
return HttpResponseForbidden(
"プレミアム会員限定です",
)
...
Lv1 プロパティを使う
class User(AbstructUser):
...
@cached_property
def is_premius(self):
return self.plan.code != PREMIUM
Lv1 Viewでif文
def premium_articles(request):
if not request.user.is_premium:
return HttpResponseForbidden(
"プレミアム会員限定です",
)
...
Lv2 デコレーターでやる場合
def premium_required(f):
@wraps(f)
def _wrapped(request, *args, **kwargs):
if not request.user.is_premium:
return HttpResponseForbidden(
"プレミアム会員限定です"
)
return f(request, *args, **kwargs)
return _wrapped
デコレーターを適用
@premium_required
def premium_articles(request):
...
変わる問題
プレミアム会員専用だった機能が、スタンダ
ード会員でも見れるように
# @is_premium もう使えない
def premium_articles(self):
...
Lv2 凝ったデコレータ
def subscription_required(*plan_codes):
def _dec(f):
@wraps(f)
def _wrapped(request, *args, **kwargs):
if request.user.plan.code not in plan_code
return HttpResponseForbidden(...)
return f(request, *args, **kwargs)
return _wrapped
return _dec
Lv2 凝ったデコレータ
@subscription_required(PREMIUM_PLAN, STANDARD_PLAN)
def premium_articles(request):
...
Lv2までの自作の問題
仕様の変更で壊れやすい
デコレーターが肥大化する、増える
結局View、Templateにも処理書いちゃう
「リクエストの情報」と「権限」
が密結合なのが問題
「リクエストの情報」
ユーザー user である
プレミアムプランに契約している
「権限」
プレミアム記事を見れる
チームを管理できる
パーミッション作るお!
「パーミッション」を文字列で
Set[str]
プレミアム記事を読める ==
"view_premius_article"
Lv3 パーミッションでやる
class User(AbstractUser):
def get_permissions():
permissions = set()
if user.is_premium():
permissions.add("view_premium_articles")
permissions.add("view_special_feature")
return permissions
def has_permission(permission):
return permission in self.get_permissions()
Lv3 パーミッションでやる場合
@user_permission_required("view_premium_articles")
def premium_articles(request):
...
Lv3 オブジェクトは?
記事 Articleがあるとき
Article.premium: プレミアム会員用
not .premium: スタンダード、プレミアム
会員用
無料会員はすべて読めない
Lv3 許可設定
class Article(models.Model):
def has_permission(self, user, permission):
permissions = set()
if self.premium and user.is_premium:
permissions.add("view")
if not self.premium:
if user.is_premium or user.is_standard:
permissions.add("view")
return permission in permissions
Lv3 View内で使う
def premium_article_detail(request, id):
article = get_object_or_404(Article, id=id)
if not article.has_permission(user, "view"):
return HttpResponseForbidden(...)
パーミッションで扱う利点
仕様の変更に強くなる
「お試しユーザー」ができた
「キャンペーン利用ユーザー」ができた
「未ログインも読める記事」ができた
Modelだけ変える
def get_permissions(user):
...
if user.during_campain:
permissions.remove("...")
...
自作パーミッション問題
独自パーミッション管理部分の仕様が複
雑になる
おさらい
Lv1: Viewでif文
Lv2: デコレータを作って使う
Lv3: パーミッション管理する仕組み
でも複雑なまま。。。
うまいことやってくれるライブラ
リーはよ。。。
第2部
ライブラリーでやろう
検討したライブラリー
DjangoのPermission
django-guardian
django-rules
https://djangopackages.org/grids/g/perms/
DjangoのPermission
content_type = ContentType.objects.get_for_model(BlogP
permission = Permission.objects.get(
codename='change_blogpost',
content_type=content_type,
)
user.user_permissions.add(permission)
DjangoのPermission
@permission_required('myapp.change_blogpost')
def change_blog_post(request, blog_id):
...
DjangoのPermissionがあわ
なかった点
DBで管理したくない
User <-> Modelのパーミッションだけ
パーミッションを持つ条件変えたら??
django-guardian
一番人気らしい。
DjangoのPermissionベース。
django-guardian
from guardian.shortcuts import assign_perm
assign_perm('view_task', joe, task)
joe.has_perm('view_task', task) # True
django-guardian良さそうな
点
シンプルに書けそう
イケてる機能
Modelが持てるパーミッション一覧
権限持ってるデータだけfilter
guardian合わなかった点
イケてる版DjangoのPermissionだったこと
DBで管理したくない
User <-> Modelのパーミッションだけ
パーミッションを持つ条件変えたら??
django-rules
>>> @rules.predicate
>>> def is_book_author(user, book):
... return book.author == user
...
>>> rules.add_rule('can_edit_book', is_book_author)
>>> rules.add_rule('can_delete_book', is_book_author)
<Predicate:is_book_author object at 0x10eeaa490>
django-rulesで権限チェック
>>> adrian = User.objects.get(username='adrian')
>>> rules.test_rule('can_edit_book', adrian, guidetodj
django-rules良さそうな点
DB使わずにできる
デコレータ、Templateもある
predicate & predicateなどで新しい
predicateを作れる
django-rulesは良さそう
かなり良さそう。
権限の一覧性が悪そう? (あんまりちゃんと
試せていない)
でももっとうまくできそう
ライブラリー作ろう!
良いアイディアがあったのでライブラリーも作
ってみた。
PyQ向けに色々設計考える => ライブラリー
だこれ
第3部
ライブラリー作った
求めていたもの
「リクエストの情報」と「権限」分離
DBで管理しない
User<->Model以外のグローバルな権限
View、Templateどこでも使える
作ったもの
django-keeper
例えば記事の著者しか編集で
きないView
from keeper.security import Allow
from keeper.operators import Everyone
from keeper.operators import IsUser
class Article:
author = models.ForeginKey("myapp.User")
def __acl__(self):
return [
(Allow, Everyone, 'view'),
(Allow, IsUser(self.author), 'edit'),
]
keeperを使った解法
from keeper.views import keeper
@keeper(
'edit'
Article,
lambda request, article_id: {'id': article_id}
)
def article_edit(request, article_id):
article = request.k_context
...
keeperを使った解法
ACLを設定する
アクション・誰に・どの権限
Viewには @keeper をつけるだけ
オブジェクトの取得もできる
OperatorsとPermissions
「リクエストの情報」と「権限」の分離
Operatorって?
Callable[[HttpRequest], bool] です。
Permissionって?
str です。
デフォルトのOperators
keeper.operators.Everyone
keeper.operators.Authenticated
keeper.operators.IsUser
keeper.operators.Staff
デフォルトのOperatros
return [
(Allow, Everyone, "view"),
(Allow, Authenticated, "comment"),
(Allow, IsUser(self.author), ("edit", "delete")),
(Allow, IsStaff, ("edit", "delete")),
]
追加のOperatorを作る
class IsPlan(Authenticated):
def __init__(self, plan_code):
self.plan_code = plan_code
def __call__(self, request):
if not super().__call__(request):
return False
return (
request.user.plan.code ==
self.plan_code
)
追加のOperatorを使う
from myapp.operators import IsPlan
class Article(models.Model):
def __acl__(self):
return [
(Allow, IsPlan(PLAN_PREMIUM), 'view'),
(Allow, IsPlan(PLAN_STANDARD), 'view'),
]
from myapp.operators import IsPlan
class Article(models.Model):
premium = models.BooleanField()
def __acl__(self):
if self.premium:
return [
(Allow, IsPlan(PLAN_PREMIUM), 'view'
]
else:
return [
(Allow, IsPlan(PLAN_PREMIUM), 'view'
(Allow, IsPlan(PLAN_STANDARD), 'view'
]
ACLの利点
権限をもつ場合を俯瞰しやすい
「リクエストの情報」判定のロジックは
Operator
「権限」はPermission
テンプレートでの利用方法
{% load keeper %}
{% has_permission article 'edit' as can_edit %}
{% if can_edit %}
<a href="{% url ... %}">編集</a>
{% endif %}
<h1>{{ article.title }}</h1>
<p>{{ article.body }}</p>
グローバルのACL設定
class Root:
def __acl__(self):
return [
(Allow, Authenticated, 'post_article'),
]
グローバル権限を使う
@keeper('post_article')
def article_post(request):
pass
デモアプリ紹介
ユーザー、契約、チームなど含むアプリで
django-keeperを使ったデモ。
https://github.com/hirokiky/django-
keeper/tree/master/demo/
django-keeperの良い所
DBを使わない
ACLを使うので見通しが良い
User<->Modelに依存しないこと
「リクエストの情報」「権限」を分離する
django-keeperの悪い所
まだまだベータ感があります。。
全体のまとめ
Djangoでの権限管理の定石
検討したライブラリー
作ったライブラリー
PyQブース出展中です
CC BY 2.0 PyConJP
おわり

Weitere ähnliche Inhalte

Was ist angesagt?

世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込むYoshiki Hayama
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Shinya Okano
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWayTakayuki Shimizukawa
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 

Was ist angesagt? (20)

世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証Djangoフレームワークのユーザーモデルと認証
Djangoフレームワークのユーザーモデルと認証
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay【修正版】Django + SQLAlchemy: シンプルWay
【修正版】Django + SQLAlchemy: シンプルWay
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 

Andere mochten auch

ドローンのフライトコントローラをPythonで制御してみた話
ドローンのフライトコントローラをPythonで制御してみた話ドローンのフライトコントローラをPythonで制御してみた話
ドローンのフライトコントローラをPythonで制御してみた話Lina Katayose
 
Pycon jp2017 20170908_ota
Pycon jp2017 20170908_otaPycon jp2017 20170908_ota
Pycon jp2017 20170908_ota博三 太田
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私Atsushi Odagiri
 
Introducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LTIntroducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LTYusuke Miyazaki
 
Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Yusuke Muraoka
 
OpenAPIを利用したPythonWebアプリケーション開発
OpenAPIを利用したPythonWebアプリケーション開発OpenAPIを利用したPythonWebアプリケーション開発
OpenAPIを利用したPythonWebアプリケーション開発Takuro Wada
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Yoshiaki Shibutani
 
PyCon JP 2017Yuta Kitagami
PyCon JP 2017Yuta KitagamiPyCon JP 2017Yuta Kitagami
PyCon JP 2017Yuta KitagamiYuta Kitagami
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
PyconJP2017 Kivyによるアプリケーション開発のすすめ
PyconJP2017 Kivyによるアプリケーション開発のすすめPyconJP2017 Kivyによるアプリケーション開発のすすめ
PyconJP2017 Kivyによるアプリケーション開発のすすめJun Okazaki
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
 
Pythonと機械学習によるWebセキュリティの自動化
Pythonと機械学習によるWebセキュリティの自動化Pythonと機械学習によるWebセキュリティの自動化
Pythonと機械学習によるWebセキュリティの自動化Isao Takaesu
 

Andere mochten auch (13)

ドローンのフライトコントローラをPythonで制御してみた話
ドローンのフライトコントローラをPythonで制御してみた話ドローンのフライトコントローラをPythonで制御してみた話
ドローンのフライトコントローラをPythonで制御してみた話
 
Pycon jp2017 20170908_ota
Pycon jp2017 20170908_otaPycon jp2017 20170908_ota
Pycon jp2017 20170908_ota
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
Introducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LTIntroducing wsgi_lineprof / PyCon JP 2017 LT
Introducing wsgi_lineprof / PyCon JP 2017 LT
 
Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発Pythonistaで始めるiOSプロトタイプ開発
Pythonistaで始めるiOSプロトタイプ開発
 
OpenAPIを利用したPythonWebアプリケーション開発
OpenAPIを利用したPythonWebアプリケーション開発OpenAPIを利用したPythonWebアプリケーション開発
OpenAPIを利用したPythonWebアプリケーション開発
 
Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)Pythonが動く仕組み(の概要)
Pythonが動く仕組み(の概要)
 
PyCon JP 2017Yuta Kitagami
PyCon JP 2017Yuta KitagamiPyCon JP 2017Yuta Kitagami
PyCon JP 2017Yuta Kitagami
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
PyconJP2017 Kivyによるアプリケーション開発のすすめ
PyconJP2017 Kivyによるアプリケーション開発のすすめPyconJP2017 Kivyによるアプリケーション開発のすすめ
PyconJP2017 Kivyによるアプリケーション開発のすすめ
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
Pycon2017
Pycon2017Pycon2017
Pycon2017
 
Pythonと機械学習によるWebセキュリティの自動化
Pythonと機械学習によるWebセキュリティの自動化Pythonと機械学習によるWebセキュリティの自動化
Pythonと機械学習によるWebセキュリティの自動化
 

Ähnlich wie プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017

jp IT Django project jp.pptx
jp IT Django project jp.pptxjp IT Django project jp.pptx
jp IT Django project jp.pptxssuser5caf4d
 
Django最速デバッグ指南 PyConAPAC 2013
Django最速デバッグ指南 PyConAPAC 2013Django最速デバッグ指南 PyConAPAC 2013
Django最速デバッグ指南 PyConAPAC 2013hirokiky
 
Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門kashew_nuts
 
Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Ryoji Kurosawa
 
Django 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppYikei Lu
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話Nakazawa Yuichi
 
はじめての Rails アプリ開発
はじめての Rails アプリ開発はじめての Rails アプリ開発
はじめての Rails アプリ開発n-fukidome
 
Redash pythonで業務分析
Redash pythonで業務分析Redash pythonで業務分析
Redash pythonで業務分析創史 花村
 
deviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirbdeviseを利用した認証について@Minamirb
deviseを利用した認証について@MinamirbJun Fukaya
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎真哉 杉野
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜Ryo Sasaki
 
第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料Masanori Kobayashi
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2Yasukazu Kawasaki
 
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)pinmarch_t Tada
 
Bracketsを使おう
Bracketsを使おうBracketsを使おう
Bracketsを使おうYossy Taka
 

Ähnlich wie プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017 (20)

jp IT Django project jp.pptx
jp IT Django project jp.pptxjp IT Django project jp.pptx
jp IT Django project jp.pptx
 
Django最速デバッグ指南 PyConAPAC 2013
Django最速デバッグ指南 PyConAPAC 2013Django最速デバッグ指南 PyConAPAC 2013
Django最速デバッグ指南 PyConAPAC 2013
 
Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門
 
Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方Elasticsearch 変わり種プラグインの作り方
Elasticsearch 変わり種プラグインの作り方
 
Django 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブAppDjango 1.5 における効果的な MTV 設計 & ネイティブApp
Django 1.5 における効果的な MTV 設計 & ネイティブApp
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話DjangoでさくっとWeb アプリケーション開発をする話
DjangoでさくっとWeb アプリケーション開発をする話
 
はじめての Rails アプリ開発
はじめての Rails アプリ開発はじめての Rails アプリ開発
はじめての Rails アプリ開発
 
Redash pythonで業務分析
Redash pythonで業務分析Redash pythonで業務分析
Redash pythonで業務分析
 
deviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirbdeviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirb
 
210630 python
210630 python210630 python
210630 python
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
恋するJenkins
恋するJenkins恋するJenkins
恋するJenkins
 
第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料第39回日本基礎心理学会シンポジウム発表資料
第39回日本基礎心理学会シンポジウム発表資料
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
 
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
 
Bracketsを使おう
Bracketsを使おうBracketsを使おう
Bracketsを使おう
 

Mehr von hirokiky

簡単な算数でできる文章校正
簡単な算数でできる文章校正簡単な算数でできる文章校正
簡単な算数でできる文章校正hirokiky
 
エンジニアが起業のアイディアを見つける方法
エンジニアが起業のアイディアを見つける方法エンジニアが起業のアイディアを見つける方法
エンジニアが起業のアイディアを見つける方法hirokiky
 
それ、公開しちゃおうよ - みんなのPython勉強会63登壇
それ、公開しちゃおうよ - みんなのPython勉強会63登壇それ、公開しちゃおうよ - みんなのPython勉強会63登壇
それ、公開しちゃおうよ - みんなのPython勉強会63登壇hirokiky
 
営業も広報もいない僕たちが11年間やってきたこと
営業も広報もいない僕たちが11年間やってきたこと営業も広報もいない僕たちが11年間やってきたこと
営業も広報もいない僕たちが11年間やってきたことhirokiky
 
LLoT ランゲージアップデート Python
LLoT ランゲージアップデート PythonLLoT ランゲージアップデート Python
LLoT ランゲージアップデート Pythonhirokiky
 
How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015hirokiky
 
価値を届ける技術 #bpstudy 96
価値を届ける技術 #bpstudy 96価値を届ける技術 #bpstudy 96
価値を届ける技術 #bpstudy 96hirokiky
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performancehirokiky
 
gargant.dispatch, a flexible dispatcher for WSGI
gargant.dispatch, a flexible dispatcher for WSGIgargant.dispatch, a flexible dispatcher for WSGI
gargant.dispatch, a flexible dispatcher for WSGIhirokiky
 
軽量のススメ
軽量のススメ軽量のススメ
軽量のススメhirokiky
 
django-websettingsの紹介
django-websettingsの紹介django-websettingsの紹介
django-websettingsの紹介hirokiky
 
pyramid_layoutと僕と、ときどきzope.interface
pyramid_layoutと僕と、ときどきzope.interfacepyramid_layoutと僕と、ときどきzope.interface
pyramid_layoutと僕と、ときどきzope.interfacehirokiky
 
My pyhack 1301
My pyhack 1301My pyhack 1301
My pyhack 1301hirokiky
 
Useful Django 1.4
Useful Django 1.4Useful Django 1.4
Useful Django 1.4hirokiky
 
使えるDjango1.4
使えるDjango1.4使えるDjango1.4
使えるDjango1.4hirokiky
 
個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダ個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダhirokiky
 
卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築hirokiky
 

Mehr von hirokiky (17)

簡単な算数でできる文章校正
簡単な算数でできる文章校正簡単な算数でできる文章校正
簡単な算数でできる文章校正
 
エンジニアが起業のアイディアを見つける方法
エンジニアが起業のアイディアを見つける方法エンジニアが起業のアイディアを見つける方法
エンジニアが起業のアイディアを見つける方法
 
それ、公開しちゃおうよ - みんなのPython勉強会63登壇
それ、公開しちゃおうよ - みんなのPython勉強会63登壇それ、公開しちゃおうよ - みんなのPython勉強会63登壇
それ、公開しちゃおうよ - みんなのPython勉強会63登壇
 
営業も広報もいない僕たちが11年間やってきたこと
営業も広報もいない僕たちが11年間やってきたこと営業も広報もいない僕たちが11年間やってきたこと
営業も広報もいない僕たちが11年間やってきたこと
 
LLoT ランゲージアップデート Python
LLoT ランゲージアップデート PythonLLoT ランゲージアップデート Python
LLoT ランゲージアップデート Python
 
How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015How we realized SOA by Python at PyCon JP 2015
How we realized SOA by Python at PyCon JP 2015
 
価値を届ける技術 #bpstudy 96
価値を届ける技術 #bpstudy 96価値を届ける技術 #bpstudy 96
価値を届ける技術 #bpstudy 96
 
Pycon2014 django performance
Pycon2014 django performancePycon2014 django performance
Pycon2014 django performance
 
gargant.dispatch, a flexible dispatcher for WSGI
gargant.dispatch, a flexible dispatcher for WSGIgargant.dispatch, a flexible dispatcher for WSGI
gargant.dispatch, a flexible dispatcher for WSGI
 
軽量のススメ
軽量のススメ軽量のススメ
軽量のススメ
 
django-websettingsの紹介
django-websettingsの紹介django-websettingsの紹介
django-websettingsの紹介
 
pyramid_layoutと僕と、ときどきzope.interface
pyramid_layoutと僕と、ときどきzope.interfacepyramid_layoutと僕と、ときどきzope.interface
pyramid_layoutと僕と、ときどきzope.interface
 
My pyhack 1301
My pyhack 1301My pyhack 1301
My pyhack 1301
 
Useful Django 1.4
Useful Django 1.4Useful Django 1.4
Useful Django 1.4
 
使えるDjango1.4
使えるDjango1.4使えるDjango1.4
使えるDjango1.4
 
個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダ個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダ
 
卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築
 

Kürzlich hochgeladen

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 

Kürzlich hochgeladen (8)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 

プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017