Django REST framework 的TokenAuth认证及外键Serializer基本实
一,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" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |