在 Django rest 框架中处理请求 header 以获取在 header 中传递的密钥并将其保存在用户 table 中?
Handle a request header in Django rest framework to get the secret key passed in the header and save it with User table?
我有一个用于移动应用程序的 Django 后端。
我正在使用 django rest 框架 (django-rest-auth),但我仍在编写自己的视图和逻辑,因为 API 端点不是基于模型的。
发送给我的请求在 header 中有一个密钥,它与注册的各个设备相关联。它还有 post 数据,包括设备 ID 和其他详细信息。
一旦我使用 request.META 得到 header 如何将它保存在用户模型中(它会在每次用户登录时更新),所以以后它可以用作外键来获取所有用户和关联设备等详细信息。
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})
我的User_Model
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()
我的用户管理器()
class 用户管理器(基础用户管理器):
"""Define a model manager for User model with no username field."""
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)
定义一个 instance method
并在 CustomLoginView
的任何地方使用它作为
from rest_framework.exceptions import ValidationError
class CustomLoginView(LoginView):
<b>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()</b>
# 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 后端。
我正在使用 django rest 框架 (django-rest-auth),但我仍在编写自己的视图和逻辑,因为 API 端点不是基于模型的。
发送给我的请求在 header 中有一个密钥,它与注册的各个设备相关联。它还有 post 数据,包括设备 ID 和其他详细信息。
一旦我使用 request.META 得到 header 如何将它保存在用户模型中(它会在每次用户登录时更新),所以以后它可以用作外键来获取所有用户和关联设备等详细信息。
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})
我的User_Model
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()
我的用户管理器()
class 用户管理器(基础用户管理器): """Define a model manager for User model with no username field."""
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)
定义一个 instance method
并在 CustomLoginView
的任何地方使用它作为
from rest_framework.exceptions import ValidationError
class CustomLoginView(LoginView):
<b>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()</b>
# 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中发送数据