SlideShare a Scribd company logo
1 of 78
Download to read offline
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
おわり

More Related Content

What's hot

webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリングmlm_kansai
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 

What's hot (20)

webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 

Viewers also liked

ドローンのフライトコントローラを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
 

Viewers also liked (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セキュリティの自動化
 

Similar to プロダクト開発してわかった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
 

Similar to プロダクト開発してわかった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を使おう
 

More from 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
 

More from 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
 
個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダ個人の嗜好を学習し記事を推奨するフィードリーダ
個人の嗜好を学習し記事を推奨するフィードリーダ
 
卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築卒研中間発表資料:個人に最適化したフィードリーダの構築
卒研中間発表資料:個人に最適化したフィードリーダの構築
 

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