Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django登录用户信息Outsides Views.py_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django登录用户信息Outsides 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

我一直在研究DRF。我通常更喜欢在另一个python文件上编写业务逻辑,而不是views.py。我尝试使用获取views.py中当前登录的用户

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.py
addBusCompanyUseCase(…).execute(self.request.user)
谢谢!但是获取的方法“AddBusCompanyUseCase.execute()”的签名与类“BaseUseCase”中的基方法的签名不匹配。在BaseUseCase中,执行签名必须是
execute(self,*args,**kwargs)
和AddBusCompanyUseCase
execute(self,user=None,*args,**kwargs)
。在那之后应该可以了。