Django REST framework 的TokenAuth认证及外键Serializer基本实现
2024-08-28 22:46:51
一,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"
最新文章
- ABAP 生产订单的创建与修改函数
- Oracle:ORA-00955: name is already used by an existing object
- PostgreSQL的时间/日期函数使用 转
- umbraco之DocumentType
- 用c++处理文件流
- PowerPivot安装完成后创建网站或网站集报错解决办法
- JSON序列化和反序列化
- Pox组件
- windows下回车与换行符
- Learning WCF Chapter1 Summary
- PHP学习路径
- C++类型转换[转]
- 内容提供者 DocumentProvider Uri工具类
- C语音--static变量
- VS2008查看dll导出函数
- CSS常用属性计算原理
- web测试之功能测试总结
- Php的基本语法学习
- vivo手机,自带世界之窗浏览器,sessionStorage设置的值为null
- order by 字段自动填写脚本
热门文章
- numpy学习(一)
- MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins
- Robot Framework user guide
- PHP获取文件夹内所有文件包括子目录文件的名称或路径
- python之自定义排序函数sorted()
- 在linux下安装并运行scrapyd
- UVA - 11054 Wine trading in Gergovia 扫描法
- String的getBytes()方法
- Flash中国地图 开放源码
- Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding'