码迷,mamicode.com
首页 > 其他好文 > 详细

Django REST framework 的TokenAuth认证及外键Serializer基本实现

时间:2017-02-21 15:52:56      阅读:518      评论:0      收藏:0      [点我收藏+]

标签:patch   author   httpie   属性   ssi   合并   instance   and   .sh   

 

一,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(rsubserver, 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"

技术分享

 

Django REST framework 的TokenAuth认证及外键Serializer基本实现

标签:patch   author   httpie   属性   ssi   合并   instance   and   .sh   

原文地址:http://www.cnblogs.com/aguncn/p/6424158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!