博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django REST framework 的TokenAuth认证及外键Serializer基本实现
阅读量:6273 次
发布时间:2019-06-22

本文共 2518 字,大约阅读时间需要 8 分钟。

 

一,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 migratepython 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_savefrom django.dispatch import receiverfrom rest_framework.authtoken.models import Tokenfrom 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"

 

转载地址:http://pvmpa.baihongyu.com/

你可能感兴趣的文章
关于ovirt主机即做存储又兼虚拟机主机的官方文档说明
查看>>
grep匹配结尾字符串的特殊情况
查看>>
第三方农资电商平台大丰收获华创资本数亿元C轮融资
查看>>
“虎鲸跳跃” 完成300万美元Pre-A轮融资,投资方为蓝湖资本及险峰长青
查看>>
JSON简介
查看>>
深圳安泰创新完成数千万新一轮融资,贝森资本领投
查看>>
当 Kubernetes 遇到阿里云
查看>>
MongoDB与Java 经典面试题、课程,好资源值得收藏
查看>>
标普全球获准进入中国市场,本土评级机构压力山大!
查看>>
阿里云基础产品技术月刊 2019年1月
查看>>
Go 语言的垃圾回收演化历程:垃圾回收和运行时问题
查看>>
苹果收购硅谷创业公司 Silk Labs,将继续布局 AI 和 IoT
查看>>
Idea开发Tomcat应用的热部署配置
查看>>
docker安装mysql
查看>>
GNOME 3.34 发布计划敲定,正式版将于9月11日推出
查看>>
使用Data Lake Analytics快速分析OSS上的日志文件
查看>>
《图解服务器端网络架构》笔记
查看>>
《叶问》第2期
查看>>
各业务Object概念(VO、 PO、DO、DTO、 BO、 QO、DAO、POJO)
查看>>
JavaScript对象继承方式
查看>>