发布时间:2019/09/02 11:35:20   更新时间:2020/07/31 19:50:07
在django中,已经有一个user的模型定义。如果开发用户模型,在这个模型上补充就好了。
原来的模型定义在:
\python3.5\site-packages\django\contrib\auth\models.py
建立一个user的应用app,在model.py文件补充。
方法如下:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
#username在AbstractUser中也是唯一的
# 这里定义拓展的字段
nickname = models.CharField('昵称', max_length=32, blank=True, null=True)
tel = models.CharField(max_length=16, unique=True)
class Meta:
verbose_name="用户"
verbose_name_plural=verbose_name
# 方便admin中展示。
def __str__(self):
return self.username
建立一个drf的应用app,在serializers.py文件补充。
from rest_framework import serializers
from xxx.models import User
#超链接是一种很好的RESTful设计,但是有bug用不出来。
class UserSerializer(serializers.ModelSerializer):
class Meta:
#指定要序列化的模型。
model = User
#指定要序列化的字段。
fields = ('id', 'username', 'password', 'nickname', 'email', 'tel')
#全部展示
#fields = "__all__"
#指定不展示的字段
#exclude = ('is_staff')
class Login(APIView):
#权限:任意用户。
permission_classes = (permissions.AllowAny,)
def post(self, request):
try:
username = request.data.get('username', -1)
password = request.data.get('password', -1)
tel = request.data.get('tel', -1)
'''
对于封装的结构,可把他们打印出来,就知道怎么用了。
logger.info(request)
logger.info(type(request))
logger.info(dir(request))
logger.info(request.POST)
logger.info(request.content_type)
logger.info(request.data)
'''
#参数校验
xxxx
#用户名和密码验证——这是django的标准功能
user_obj = auth.authenticate(username=username, password=password)
if not user_obj:
return Response(set_return_data(-1, "用户名或密码错误。", {}))
if not user_obj.is_active:
return Response(set_return_data(-1, "用户没有激活。", {}))
#token产生——这是Django OAuth Toolkit的功能
#获取应用
application_obj = Application.objects.get(name='your_app')
result_list = create_token(username, password, application_obj.client_id, application_obj.client_secret)
#logger.info(result_list)
if (result_list[2]!=200):
return Response(set_return_data(-1, "令牌创建错误。", {}))
#auth.login主要是实现session的。这里不用session。
#组织返回数据。
user_data = {"id": user_obj.id,
"username": user_obj.username,
"nickname": user_obj.nickname,
"email": user_obj.email,
"tel": user_obj.tel}
token_data = common_obj.json_to_dict(result_list[1])
data = {'token': token_data, 'user': user_data}
return Response(data)
except Exception as err_instance:
return Response(set_return_data(-1, traceback.format_exc(), 'exception'))
在drf的应用app,在views.py文件补充。
class RetrieveUser(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
#这里oath2负责认证,token给了READ_SCOPE 和 WRITE_SCOPE。get方法连TokenHasReadWriteScope都不需要。
#permission_classes = [permissions.DjangoModelPermissionsOrAnonReadOnly, TokenHasReadWriteScope]