【问题标题】:Django: Get request in base classDjango:在基类中获取请求
【发布时间】:2016-05-01 04:49:37
【问题描述】:

我有一个基类扩展对象,我试图访问 self.request.session 但它抛出一个错误,说请求不存在。

class BaseTemplateView(object):

def __init__(self,  *args, **kwargs):

    try:

        if self.request.session.get('sessionToken', None) == None:
            raise ValueError("User Not Logged In")


        register(APPLICATION_ID, REST_API_KEY, session_token=token)
        self.user = User.current_user()
        self.LoggedIn = True
        print("SUCCESS")
    except:
        print("FAILED")
        self.user = None
        self.LoggedIn = False
    print("CALLED INIT")

class IndexView(BaseTemplateView, TemplateView):
      template_name = "dashboard.html"

请帮忙

【问题讨论】:

  • 接受解决问题的答案,否则人们认为问题仍未解决

标签: python django django-sessions


【解决方案1】:

不,此时请求不存在 这个逻辑应该放在dispatch 方法中。

【讨论】:

  • dispatch函数去哪了?是在 IndexView 还是 BaseTemplateView
  • 我不明白你的问题。你在你的基类上定义函数,不管是什么。
  • 我所有的通用函数都在我的 basetemplateview 类中。 init 函数验证用户是否使用存储在我的会话中的 sessionToken 登录。如果用户未登录,他将被重定向到登录页面,否则继续。希望澄清
  • 并非如此。我的回答是:调用__init__ 方法时用户不存在;这个逻辑在 dispatch 方法中。
  • 现在我想了想,我可以使用 super init 将会话令牌从调度传递到 IndexView 到 BaseTemplateView。我不太确定如何在 args 或 kwargs 中传递值
【解决方案2】:
class IndexView(TemplateView):
    template_name = "dashboard.html"

    def dispatch(self, request, *args, **kwargs):
        try:
            if self.request.session.get('sessionToken', None) == None:
                raise ValueError("User Not Logged In")
            register(APPLICATION_ID, REST_API_KEY, session_token=token)
            self.user = User.current_user()
            self.LoggedIn = True
            print("SUCCESS")
        except:
            print("FAILED")
            self.user = None
            self.LoggedIn = False
            print("CALLED INIT")
        return super(IndexView, self).dispatch(request, *args, **kwargs)

【讨论】:

  • 这确实违背了拥有基类的目的。使用此解决方案,我将不得不对其他所有视图执行相同的操作。
【解决方案3】:

我最终通过基类的 init 中的 kwargs 传递了 sessionToken,并做了我打算做的任何事情。

class BaseTemplateView(object):

    def __init__(self,  *args, **kwargs):


        try:

            if 'sessionToken' in kwargs:
                token = kwargs['sessionToken']
            else: 
                raise ValueError('Missing Token')

            register(APPLICATION_ID, REST_API_KEY, session_token=token)
            self.user = User.current_user()
            self.LoggedIn = True
            print("SUCCESS")
        except:
            print("FAILED")
            self.user = None
            self.LoggedIn = False
        print("CALLED INIT")

class IndexView(BaseTemplateView, TemplateView):
    template_name = "dashboard.html"

    def dispatch(self, request, *args, **kwargs):
        token = self.request.session.get('sessionToken', None)
        if  token != None:
            print("Token : {0}".format(token))
            super(IndexView, self).__init__( *args, sessionToken=token)

        if not self.isLoggedIn:
            HttpResponseRedirect('/')

        return super(IndexView, self).dispatch(request, *args, **kwargs)

希望这对像我这样的 django 新手有所帮助,而不是花一天时间试图找出一个非常简单的解决方案

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2013-10-01
    • 2018-08-17
    • 2018-05-30
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多