【问题标题】:Handle a request header in Django rest framework to get the secret key passed in the header and save it with User table?在Django rest框架中处理一个请求头以获取头中传递的密钥并将其保存在用户表中?
【发布时间】:2018-09-05 14:43:44
【问题描述】:

我有一个移动应用程序的 django 后端。

我正在使用 django rest 框架 (django-rest-auth),但我仍在编写自己的视图和逻辑,因为 API 端点不是基于模型的。

发送给我的请求在标头中有一个密钥,该密钥与注册的各个设备相关联。除此之外,它还有包含设备 ID 和其他详细信息的发布数据。

一旦我使用 request.META 获得该标头,如何将其保存在用户模型中(每次用户登录时都会更新),因此稍后它可以用作获取所有详细信息(如用户和关联设备)的外键。

class CustomLoginView(LoginView):
   def get_response_serializer(self):

    if getattr(settings, 'REST_USE_JWT', False):
        response_serializer = JWTSerializer
    else:
        # print(self.request.data)
        response_serializer = serializers.TokenSerializer
        # response_serializer = {'data':response_serializer}
    return response_serializer
   def get_response(self):

    # raise APIException("There was a problem!")
    serializer_class = self.get_response_serializer()
    # print(serializer_class.data)
    try:
        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': self.user,
                'token': self.token
            }
            serializer = serializer_class(instance=data,
                                        context={'request': self.request})
        else:
            print("hello")
            serializer = serializer_class(instance=self.token,
                                        context={'request': self.request})
            print("BYE")
            print(serializer.data)
            # print(self.request.data)
            try:
                # print(serializer.data)
                if 'email' not in self.request.POST:
                    return Response({'data':'message'})

                return Response({'data':serializer.data,'status':1,'message':'Success'}, status=status.HTTP_200_OK)
            except ValidationError as exc:
                raise ValidationError({
                        'field_val1': exc.detail,
                    })
    except:
            print("in except")
            raise APIException("There was a problem!")


   def post(self, request, *args, **kwargs):
    self.request = request
    self.serializer = self.get_serializer(data=self.request.data,
                                          context={'request': request})
    print(self.request.data)

    if self.serializer.is_valid():
        print(request.META)
        self.login()
        return self.get_response()
    else:
        return Response({"data":[],"message":"Credentials are wrong",'status':0})

我的用户模型

class User(AbstractUser):
"""User model."""

username = None
email = models.EmailField(_('email address'), unique=True)
mobile_token = models.CharField(max_length=20,blank=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = UserManager()

我的 UserManage()

类用户管理器(BaseUserManager): """为没有用户名字段的用户模型定义模型管理器。"""

use_in_migrations = True

def _create_user(self, email, password, **extra_fields):
    """Create and save a User with the given email and password."""
    if not email:
        raise ValueError('The given email must be set')
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, email, password=None, **extra_fields):
    """Create and save a regular User with the given email and password."""
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
    """Create and save a SuperUser with the given email and password."""
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must have is_staff=True.')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(email, password, **extra_fields)

【问题讨论】:

  • 您是否在 User 模型中添加了任何字段?你可以在这里添加这些吗?。
  • 是的,这是我的用户模型:- class User(AbstractUser): """User model.""" username = None email = models.EmailField(_('email address'), unique= True) mobile_token = models.CharField(max_length=20,blank=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] objects = UserManager() 现在来自 mobile_devices 的东西我将从标题中获取 mobile_token,我已经在 My User 模型中更新该令牌,该令牌可用作其他表的外键。
  • 我在你的问题中找不到那个
  • 我已经更新了最后一条评论以及主要问题
  • 给你一个快速的建议,永远不要在comment section中添加巨大的代码sn-p

标签: django rest django-rest-framework django-rest-auth


【解决方案1】:

定义一个instance method 并将其CustomLoginView中的任何位置用作

from rest_framework.exceptions import ValidationError


class CustomLoginView(LoginView):
    def save_header(self):
        headr = self.request.META.get('HTTP_MYHEADER', None)
        if headr is None:
            raise ValidationError('"MYHEADER" is missing in headers"')
        current_user = self.user
        current_user.mobile_token = headr
        current_user.save()

    # your code



更新
如下更改您的视图

from rest_auth.views import LoginView
from rest_framework.exceptions import ValidationError


class CustomLoginView(LoginView):
    def save_header(self):
        headr = self.request.META.get('HTTP_MYHEADER', None)
        if headr is None:
            raise ValidationError('"MYHEADER" is missing in headers"')
        current_user = self.user
        current_user.mobile_token = headr
        current_user.save()

    def post(self, request, *args, **kwargs):
        response = super().post(request, *args, **kwargs)
        if response.status_code == 200:
            self.save_header()
        return response

你的有效载荷应该是

{
    "email":"myemail@email.com",
    "password":"mypassword"
}



截图
1.如何添加HEADER

2.如何在POSTMAN中发送数据

【讨论】:

  • Django 不为 AnonymousUser 提供数据库表示。每当我尝试使用邮递员发布数据时。
  • 你发送到服务器的所有数据是什么?
  • 标题:- 键:值正文:- 电子邮件:值,密码:值
  • 使用self.user 而不是self.request.user。 (我已经更新了答案)
  • 你不认为这会给我带来错误吗?因为用户未在我的 CustomLogin 视图中定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2018-07-31
  • 2020-10-20
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多