Python Django登录用户信息Outsides Views.py
我一直在研究DRF。我通常更喜欢在另一个python文件上编写业务逻辑,而不是views.py。我尝试使用获取views.py中当前登录的用户Python Django登录用户信息Outsides Views.py,python,django,django-rest-framework,Python,Django,Django Rest Framework,我一直在研究DRF。我通常更喜欢在另一个python文件上编写业务逻辑,而不是views.py。我尝试使用获取views.py中当前登录的用户 self.request.user 但我不知道如何在我的业务逻辑文件中获得相同的用户信息这里是我现在在Views.py中得到的 class AddBusCompanyStaffView(generics.CreateAPIView): serializer_class = AddBusCompanyUserSerializer
self.request.user
但我不知道如何在我的业务逻辑文件中获得相同的用户信息这里是我现在在Views.py中得到的
class AddBusCompanyStaffView(generics.CreateAPIView):
serializer_class = AddBusCompanyUserSerializer
def get_bus_company(self):
return GetBusCompanyUseCase(bus_company_id=self.kwargs.get('bus_company_id')).execute()
def perform_create(self, serializer):
print(self.request.user)
return AddBusCompanyUserUseCase(serializer=serializer,
bus_company=self.get_bus_company()
).execute()
我想在这里的业务逻辑部分-->usecases.py中找到user
User = get_user_model()
class AddBusCompanyUserUseCase(BaseUseCase):
"""
use this to add bus company of specific bus company
"""
def __init__(self,
serializer: bus_company_user_serializers.AddBusCompanyUserSerializer,
bus_company: BusCompany):
self.serializer = serializer
self._data = serializer.validated_data
self._bus_company = bus_company
def execute(self):
self._factory()
def _factory(self):
user_position = self._data.pop('position')
user_password = self._data.pop('password')
user = User(**self._data)
user.set_password(user_password)
user.save()
bus_company_user=BusCompanyStaff(user=user,
position=user_position,
staff_of=self._bus_company,
created_by= #logged in user here
)
如何在创建人中获取self.request.user?
我的基本用例是
class BaseUseCase:
"""
Base Use Case
"""
def execute(self):
raise NotImplementedError("Subclasses should implement this!")
def _factory(self):
raise NotImplementedError("Subclasses should implement this!")
def is_valid(self):
return True
由于无法更改BaseUseCase,因此必须将该属性添加到AddBusCompanyUseCase类中 这里的关键是在创建时将self.request.user传递给AddBusCompanyUserCase,以便以后可以作为self.user属性访问
#usecases.py
类别AddBusCompanyUserCase(基本用例):
"""
用于添加特定公交公司的公交公司
"""
定义初始化(自我,
序列化程序:总线\公司\用户\序列化程序。AddBusCompanyUserSerializer,
巴士公司:巴士公司,
用户:没有,
):
self.serializer=序列化程序
self.\u data=serializer.validated\u数据
自助巴士公司=巴士公司
self.user=用户
def执行(自我):
self._工厂()
def_工厂(自身):
user\u position=self.\u data.pop('position'))
user\u password=self.\u data.pop('password'))
用户=用户(**self.\u数据)
user.set_密码(user_密码)
user.save()
总线\公司\用户=总线公司斯塔夫(用户=用户,
位置=用户位置,
员工=自身公司,
创建人=self.user
)
#views.py
类AddBusCompanyStaffView(generics.CreateAPIView):
serializer_class=AddBusCompanyUserSerializer
def get_bus_公司(自身):
返回GetBusCompanyUseCase(bus\u company\u id=self.kwargs.get('bus\u company\u id')).execute()
def执行_创建(自、序列化程序):
打印(self.request.user)
返回addBusCompanyUserCase(序列化程序=序列化程序,
bus_company=self.get_bus_company(),
user=self.request.user,
).execute()
为什么不将self.request.user
作为参数传递给AddBusCompanyUseCase?AddBusCompanyUseCase已从Baseusecase继承。类似地,执行方法被BaseUseCase覆盖了。我仍然不明白为什么不能在执行方法中使用这样的签名:execute(self,user)
并且在您的views.pyaddBusCompanyUseCase(…).execute(self.request.user)
谢谢!但是获取的方法“AddBusCompanyUseCase.execute()”的签名与类“BaseUseCase”中的基方法的签名不匹配。在BaseUseCase中,执行签名必须是execute(self,*args,**kwargs)
和AddBusCompanyUseCaseexecute(self,user=None,*args,**kwargs)
。在那之后应该可以了。