zoukankan      html  css  js  c++  java
  • 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"
    

  • 相关阅读:
    Benchmarking Apache Kafka, Apache Pulsar, and RabbitMQ: Which is the Fastest?
    Kafka实战:集群SSL加密认证和配置(最新版kafka-2.7.0)
    Postgresql 编译安装教程
    CentOS在线和离线安装PostgreSQL
    ubuntu apt-get update连不上dl.google.com解决方法
    ubuntu E: Sub-process /usr/bin/dpkg returned an error code (1)解决办法
    ubuntu apt-get更新出现W: GPG error: http://repo.mysql.com trusty InRelease
    hadoop3.2.2 ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes
    Hudi on flink v0.7.0 使用遇到的问题及解决办法
    RocksDB in Flink官方答疑:Using RocksDB State Backend in Apache Flink: When and How
  • 原文地址:https://www.cnblogs.com/navysummer/p/11568547.html
Copyright © 2011-2022 走看看