一,Models.py中,ForeignKey記得要有related_name屬性,已實現關聯對象反向引用。
app_name = models.ForeignKey("cmdb.App",related_name='deploy_app', verbose_name="App")
二,Settings.py文件中,加入對Django REST framework的基本設置。
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'PAGINATE_BY': 10
}
三,將變化合並入數據庫。
python manage.py migrate python manage.py makemigrations
四,為數據庫中已有的用戶生成token。
進入python manage.py shell
>>>from django.contrib.auth.models import User
>>>from rest_framework.authtoken.models import Token
>>>for user in User.objects.all():
Token.objects.create(user=user)
# Token.objects.get_or_create(user=user)
五,設置每次新生成用戶時,自動生成token的signals。
Singals.py:
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.conf import settings
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
__init__.py:
from .signals import create_auth_token
六,用戶獲取自己的token。
token_str = Token.objects.get(user=request.user).key
七,用戶更新自己的token。
token_key = hashlib.sha1(os.urandom(24)).hexdigest() Token.objects.filter(user_id=request.user.id).update(key=token_key)
八,序列化操作時,用serializers.ReadOnlyField方法實現外鍵引用的字段顯示,用serializers.HyperlinkedRelatedField方法實現反向關聯引用。
server_ip = serializers.ReadOnlyField(source='server_ip.name') ip_subserver = serializers.HyperlinkedRelatedField(many=True, view_name='api:subserver-detail', read_only=True)
九,在views.py中,用get_queryset中的self.request來獲取請求中的參數和用戶名。
def get_queryset(self):
print(self.request.META.get('HTTP_AUTHORIZATION', ''))
print (self.request.user, '##################')
print(self.request.auth, '##################')
print(self.request.META.get('QUERY_STRING', ''))
queryset = self.queryset.filter(username='kevin')
return queryset
十,在urls.py中,定義好router中各個item的base_name,及獲取token的url。
url(r'^api-token-auth/', rest_views.obtain_auth_token), router = DefaultRouter() router.register(r'subserver', api_views.SubserverViewSet, base_name="subserver")
十一, 用戶Httpie測試
http POST 127.0.0.1:8000/api/api-token-auth/ username="kevin" password="xxx"
{
"token": "108cf518faaf7a8dfed15906659e5a02f8baa612"
}
http GET http://127.0.0.1:8000/api/users/ "Authorization: Token 8d42afbba5cfb18fd3fe108a7df932b4243bf247"

