Django¶
python製のWebフレームワーク https://www.djangoproject.com/
環境コピペ用(Ubuntu 18.04向け)¶
sudo apt-get install -y git python3-venv
PROJECT=$(basename ${PWD})
python3 -m venv ~/.virtualenvs/${PROJECT}
ln -s ~/.virtualenvs/${PROJECT}/bin/activate
source activate
Install and initialize¶
pip install django
django-admin startproject project
cd project
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py startapp app
その他Tips¶
- VSCode + Djangoの時lintのエラーを出さない設定: https://qiita.com/RyoMa_0923/items/d0c2613f15dd98280121
認証¶
- https://qiita.com/rarewin/items/c6a70689844eafe8c3a1
-
CSRF_TOKEN https://docs.djangoproject.com/en/2.2/ref/csrf/#how-to-use-it
- DjangoのCSRF周りの設定 https://qiita.com/jp_ibis/items/ab9912f8cb9ad3e49494
-
DjangoでPOSTメッセージにCSRFtokenを含ませる方法まとめ https://own-search-and-study.xyz/2017/11/12/
-
Djangoでrequest.bodyにアクセスできない件について
アプリケーションの分割単位¶
良く分からん。データベース分割が可能な単位にするという意見は分かる。予見できない場合は1アプリにした方が良さそう。
認証・認可・通知・問い合わせ辺りは再利用性が高そうなので別にするといいかも。
特定のサブネットからのアクセスを許可したい場合¶
pip install django-allow-cidr
settings.py に以下を追加
ALLOWED_CIDR_NETS = ['192.168.0.0/16', '172.16.0.0/16']
MIDDLEWARE = [
...
'allow_cidr.middleware.AllowCIDRMiddleware',
]
RESTful APIだけに特化する場合¶
- Django REST Frameworkを使って爆速でAPIを実装する https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
- Django REST Framework でネストされたモデルのAPIを設定する https://qiita.com/suzuesa/items/30bcbe6a7b2b2de1df25
- Django REST framework 実践入門 https://slideship.com/users/@massa142/presentations/2018/05/RjVo67zy1JyQiYqe3GgpLB
- How to Implement Token Authentication using Django REST Framework https://simpleisbetterthancomplex.com/tutorial/2018/11/22/how-to-implement-token-authentication-using-django-rest-framework.html
- Authentication and CSRF Protection in Django Rest Framework https://kylebebak.github.io/post/django-rest-framework-auth-csrf
Setup¶
pip install django djangorestframework
django-admin startproject project
cd project
python manage.py makemigrations
python manage.py migrate
python manage.py startapp probes
probes/models.py¶
from django.db import models
import uuid
class Probe(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=128)
vendor = models.CharField(max_length=128, null=True)
hostname = models.CharField(max_length=128)
port = models.IntegerField(default=22)
username = models.CharField(max_length=128)
password = models.CharField(max_length=128, null=True)
private_key = models.CharField(max_length=2048, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
probes/admin.py¶
from django.contrib import admin
from .models import Probe
@admin.register(Probe)
class ProbeAdmin(admin.ModelAdmin):
pass
probes/serializer.py¶
from rest_framework import serializers
from .models import Probe
class ProbeSerializer(serializers.ModelSerializer):
class Meta:
model = Probe
fields = ('id', 'name', 'vendor', 'hostname', 'port', 'username', 'password', 'private_key', 'created_at', 'updated_at')
probes/urls.py¶
from rest_framework import routers
from .views import ProbeViewSet
router = routers.DefaultRouter()
router.register(r'probes', ProbeViewSet)
probes/views.py¶
from django.shortcuts import render
from rest_framework import viewsets, filters
from .models import Probe
from .serializer import ProbeSerializer
class ProbeViewSet(viewsets.ModelViewSet):
queryset = Probe.objects.all()
serializer_class = ProbeSerializer
project/urls.py¶
from django.contrib import admin
from django.urls import path, include
from probes.urls import router as probe_router
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(probe_router.urls)),
]
project/settings.py¶
INSTALLED_APPS = [
...
'probes',
'rest_framework',
]
確認¶
http://127.0.0.1:8000/api/ にアクセスすると、APIが確認できる。
$ curl -s http://127.0.0.1:8000/api/ | jq
{
"probes": "http://127.0.0.1:8000/api/probes/"
}
$ curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:8000/api/probes/ -d '''{
"name": "example",
"vendor": "linux",
"hostname": "localhost",
"port": 22,
"username": "admin",
"password": "xxxxxxxxxx",
"private_key": null
}'''
$ curl -s http://127.0.0.1:8000/api/probes/ | jq
[
{
"id": "c299e7ab-3c6c-491d-ae1c-2cd069ad78ad",
"name": "example",
"vendor": "linux",
"hostname": "localhost",
"port": 22,
"username": "admin",
"password": "xxxxxxxxxx",
"private_key": null,
"created_at": "2019-04-16T02:34:39.880291Z",
"updated_at": "2019-04-16T02:34:39.880334Z"
}
]
$ curl -s http://127.0.0.1:8000/api/probes/c299e7ab-3c6c-491d-ae1c-2cd069ad78ad/ | jq
{
"id": "c299e7ab-3c6c-491d-ae1c-2cd069ad78ad",
"name": "example",
"vendor": "linux",
"hostname": "localhost",
"port": 22,
"username": "admin",
"password": "xxxxxxxxxx",
"private_key": null,
"created_at": "2019-04-16T02:34:39.880291Z",
"updated_at": "2019-04-16T02:34:39.880334Z"
}
$ curl -X DELETE http://127.0.0.1:8000/api/probes/c299e7ab-3c6c-491d-ae1c-2cd069ad78ad/
$ curl -s http://127.0.0.1:8000/api/probes/ | jq
[]
最終更新日: 2021-05-19 14:16:14