A, Models.py in, ForeignKey remember to get related_name attributes associated objects have been achieved back-references.
app_name = models.ForeignKey("cmdb.App",related_name='deploy_app', verbose_name="App")
Two, Settings.py file, add to the basic settings of Django REST framework.
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ), 'PAGINATE_BY': 10 }
Third, the changes will be incorporated into the database.
python manage.py migrate python manage.py makemigrations
Fourth, generate token for the user already in the database.
Enter 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)
Five, arranged to generate each time a new user, the token is automatically generated 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
Sixth, the user gets their own token.
token_str = Token.objects.get(user=request.user).key
Seven users update their token.
token_key = hashlib.sha1(os.urandom(24)).hexdigest() Token.objects.filter(user_id=request.user.id).update(key=token_key)
Eight fields, during a sequence of operation achieved by the foreign key references serializers.ReadOnlyField display method, implemented by serializers.HyperlinkedRelatedField inversely related reference method.
server_ip = serializers.ReadOnlyField(source='server_ip.name') ip_subserver = serializers.HyperlinkedRelatedField(many=True, view_name='api:subserver-detail', read_only=True)
Nine, in views.py, washed with get_queryset self.request to the acquisition parameters and username 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
Ten, in urls.py, the definition of a good router in base_name of each item, and get token of the url.
url(r'^api-token-auth/', rest_views.obtain_auth_token), router = DefaultRouter() router.register(r'subserver', api_views.SubserverViewSet, base_name="subserver")
XI, user Httpie test
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"