【问题标题】:Pass request to django inherited classes将请求传递给 django 继承的类
【发布时间】:2020-04-26 09:27:50
【问题描述】:

我正在覆盖一个流行包的一些方法,django-activity-stream(我认为这个包与这个问题几乎无关)。

来自app/urls.py 我打电话给TeamJSONActivityFeed

urlpatterns = [
    ...
    url(_(r'^feeds/organization/(?P<organization_id>.+)$'), TeamJSONActivityFeed.as_view(name='organization_stream')),
    ...
]

TeamJSONactivityFeed 然后调用我不太熟悉的“pass”,并继承自另外两个类OrganizationStreamMixinJSONActivityFeed

from rest_framework.authentication import TokenAuthentication

class TeamJSONActivityFeed(OrganizationStreamMixin, JSONActivityFeed):
    """
    JSON feed of Activity for a custom stream. self.name should be the name of the custom stream as defined in the Manager
    and arguments may be passed either in the url or when calling as_view(...)
    """
    authentication_classes = (TokenAuthentication,)
    pass

我的问题是我似乎无法将请求对象访问/传递给这些继承的类。我将如何传递这个?现在,self.request.userrequest.userAnonymousUser 对象。

class OrganizationStreamMixin(object):
    name = None

    def get_object(self,request):
        # this is printing Anonymous User
        pprint(str(self.request.user))
        pprint(str(request.user))
        return

    def get_stream(self):
        return getattr(Action.objects, self.name)

    def items(self, request, *args, **kwargs):
        return self.get_stream()(*args[1:], **kwargs)


class JSONActivityFeed(AbstractActivityStream, View):
    """
    Feed that generates feeds compatible with the v1.0 JSON Activity Stream spec
    """
    def dispatch(self, request, *args, **kwargs):

        for i, v in kwargs.items():
            print ("    ", i, ": ", v)

        return HttpResponse(self.serialize(request, *args, **kwargs),
                            content_type='application/json')

    def serialize(self, request, *args, **kwargs):
        pprint(str(self.request.user))

        items = self.items(request, *args, **kwargs)
        return json.dumps({
            'totalItems': len(items),
            'items': [self.format(action) for action in items]
        })

注意:我是一个 django/python 菜鸟,但我确信我从前端正确地调用了它。类似的请求可以访问请求用户。

【问题讨论】:

    标签: python django django-rest-framework django-activity-stream


    【解决方案1】:

    我认为有些混乱。您确实有权访问请求对象,否则会在尝试访问 None 上的 .user 时引发错误。如果您担心它是 AnonymousUser 实例,请在访问该视图之前进行身份验证。如果您需要阻止 AnonymousUser 实例访问该视图,请使用 login_required 装饰器包装该视图。

    编辑

    您正在重写 dispatch 方法而不调用 super。这可能是问题所在。

    【讨论】:

    • 嘿,抱歉,我现在用代码编辑了问题,但我之前尝试过添加令牌身份验证。我将其添加回来,并传入一个令牌并通过了身份验证(由其他视图验证),并且仍在为该视图获取匿名用户。
    • 可能是因为没有调用super就覆盖了dispatch方法。
    • 非常感谢。我会玩弄它,如果我得到它,就会回到这里。我的猜测是这与我在此之前严格使用专门的通用 DRF 视图有关,并且某些东西被错误地配置为标准视图。
    • 我最终将其包装为 DRF 视图,而不仅仅是 View,然后不得不覆盖 get 而不是 dispatch :)。 stackoverflow.com/questions/42892602/… 的答案也帮助我实现了目标。谢谢@schillingt!
    • @ambe5960 你有没有弄清楚它为什么不起作用?我现在在同一条船上。所有 API 工作正常,但对于与活动流相关的 API,我得到了匿名用户。
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多