gpt4 book ai didi

django get_current_user() 中间件 - 如果源代码为 "changed"会消失的奇怪错误消息,这会导致服务器自动重启

转载 作者:行者123 更新时间:2023-12-04 10:58:55 24 4
gpt4 key购买 nike

我正在使用中间件在我的 View 和模型中获取当前登录的用户。例如,这有助于我仅返回创建或分配给登录用户的对象。请关注此 link查看我使用的中间件。

我称这个中间件为:

get_current_user()

到目前为止,这工作得很好。但是现在我遇到了一些奇怪的行为,并且仅针对一个特殊用例。

我在自定义管理器中使用此 get_current_user() 仅返回当前登录用户是其成员的项目。成员资格是通过模型“ProjectMembership”定义的。这个模型看起来像这样:
class ProjectMembership(models.Model):
project = models.ForeignKey(Project)
member = models.ForeignKey(User, related_name='project_membership_member_set')
day_rate = models.PositiveIntegerField(max_length=11)

在项目模型中,我设置了一个名为 user_objects 的自定义管理器。项目模型如下所示(简化):
class Project(models.Model):
name = models.CharField(max_length=100)

#Managers
objects = models.Manager()
user_objects=UserProjectManager()

UserProjectManager() 现在是我的关注点。经理看起来像这样:
class UserProjectManager(models.Manager):
def get_query_set(self):
print "current user is" + str(get_current_user())
return super(UserProjectManager, self).get_query_set().filter(projectmembership__member=get_current_user())

我加了 print "current user is" + str(get_current_user())为了调试它。
这个打印声明总是!打印出当前登录的用户。当我创建这个函数时,服务器 (manage.py runserver) 正在运行,我没有重新启动服务器,并且该方法按我的预期运行。

但是,如果我使用 manage.py runserver 重新启动服务器,则 UserProjectManager() 会因以下错误而崩溃:
caught an exception while rendering: Incorrect integer value: 'AnonymousUser' for column 'member_id' at row 1

我上传了错误页面: link

有趣的是,当我让服务器运行时(在抛出错误之后),然后在我的源代码中更改某些内容(添加一个符号并删除它)并保存它(在我的项目中的某个位置,在哪里都没有关系!! ),再次点击抛出错误的链接,成功了!更有趣的是,
print "current user is" + str(get_current_user())

在抛出错误的行前面,始终正确返回登录用户!

这对我来说没有多大意义。特别是因为如果我只是重新保存(这会导致服务器自动重启!)我的源代码。

我 100% 确定错误是在上面概述的源代码行中创建的,因为我更改了它:
return super(UserProjectManager, self).get_query_set().filter(projectmembership__member=get_current_user())

对此:
return super(UserProjectManager, self).get_query_set())

然后它工作得很好。我只是这样说,因为上面发布的错误可能是出价误导。

可能很难在这里帮助我。将不胜感激任何帮助!

编辑:

以下来自“whrde”的第一个答案表示中间件方法可能是一个坏主意,而另一个线程中的人 link说这个办法很好。

因此,我想再举一个例子,说明这种中间件使用起来非常方便。我在我的应用程序中使用它。如果我真的应该从我的应用程序中删除这个中间件,我只会感兴趣。因为可能我会得到比我发布的错误更多的错误,或者该方法很好。例如覆盖模型的保存方法并设置 current_user 使用这个中间件非常容易。它让我在 save() 之后在每个 View 中编写相同的三行。
class ProjectMembership(models.Model):
project = models.ForeignKey(Project)
member = models.ForeignKey(User, related_name='project_membership_member_set')
day_rate = models.PositiveIntegerField(max_length=11)

created_by = models.ForeignKey(User, editable=False, related_name='project_membership_creator')
created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name='creation date')
modified_by = models.ForeignKey(User, editable=False, related_name='project_membership_modifier')
modified = models.DateTimeField(auto_now=True, editable=False)

#Managers
objects = models.Manager()
user_objects=UserProjectMembershipManager()

class Meta:
unique_together = (("project", "member"),)

def __unicode__(self):
return u'%s in project: %s' % (self.member, self.project)

def save(self):
if not self.id:
self.created_by = get_current_user()
self.modified_by = get_current_user()
super(ProjectMembership, self).save()

编辑:结论:不要使用 get_current_user() 中间件,因为绝对没有必要使用它。将请求对象传递给您的表单、对象管理器、覆盖的对象保存方法等。一切都会好起来的 ;-)

最佳答案

这看起来是一个糟糕的方法:您需要传递请求对象以提供一个可以访问当前用户的函数/类/方法。不要搞乱全局状态。

在您的经理上创建一个将用户作为参数的方法,并从您的 View 中调用它:

# models.py
class ProjectMembership(models.Model):
project = models.ForeignKey(Project)
member = models.ForeignKey(User, related_name='project_membership_member_set')
day_rate = models.PositiveIntegerField(max_length=11)

class ProjectManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(projectmembership__member=user)

class Project(models.Model):
name = models.CharField(max_length=100)
objects = ProjectManager()

# somewhere deep in views.py
if request.user.is_authenticated():
Project.objects.for_user(request.user)

关于django get_current_user() 中间件 - 如果源代码为 "changed"会消失的奇怪错误消息,这会导致服务器自动重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com