如何在重定向时传递模板值?

1 投票
2 回答
2191 浏览
提问于 2025-04-17 00:18

我在使用blobstoreuploadhandler,所以必须返回一个自我重定向,但我需要把一些值传递给我的模板。我该怎么做呢?如果不能使用模板值,那我想我可以用会话变量,我已经包含了beaker会话库,但我不太明白如何在django模板中访问会话变量。你有什么建议吗?

我使用的是默认的django和谷歌应用引擎,我可以通过请求处理器访问会话变量,但我不知道如何在模板中做到这一点:

class Sessiontest(webapp.RequestHandler):
    def get(self):
        # Get the session object from the environ
        self.session = self.request.environ['beaker.session']

        # Check to see if a value is in the session
        if 'counter' in self.session:
            counter = self.session['counter'] + 1
            self.session['counter'] = counter

        else:
            self.session['counter'] = 1
            counter = 1
        self.session.save()
        self.response.out.write('counter: %d' % counter)

谢谢

更新/编辑:我的问题几乎和这个 在Django模板中访问会话变量与谷歌应用引擎(Webapp) - Python 的问题一模一样,只不过我用的是beaker库,而不是gaeutilities。

更新:这是一些代码。我们看到使用HTTP GET来传递值并不是很好,因为有一个反垃圾邮件测试需要隐藏这些值:

def post(self, view):
    message = ''
    challenge = self.request.get('recaptcha_challenge_field').encode('utf-8')
    response  = self.request.get('recaptcha_response_field').encode('utf-8')
    remoteip  = os.environ['REMOTE_ADDR']
    cResponse = captcha.submit(
                 challenge,
                 response,
                 CAPTCHA_PRV_KEY,
                 remoteip)
    if cResponse.is_valid:
        isHuman=True
    else:#failed anti-spam test and can try again
        isHuman=False
        #Reprint the form
        import util
        template_values = {'isHuman':isHuman,'user' : users.get_current_user(),}
        template_values.update(dict(current_user=self.current_user, facebook_app_id=FACEBOOK_APP_ID))
        template_values.update(dict(capture=captcha.displayhtml(public_key = CAPTCHA_PUB_KEY, use_ssl = False, error = None)))
        path = os.path.join(os.path.dirname(__file__), 'market', 'market_insert.html')
        self.redirect("/ai") # Here the values aren't passed on and I must make a redirect

2 个回答

1

你可以让你的类同时继承多个类,比如同时继承请求处理类(requesthandler)和Blob存储上传处理类(blobstoreuploadhandler)。这样的话,你就可以用请求处理类里的函数来渲染模板,同时也能使用Blob存储上传处理类里的函数。

一个有多个父类的类定义大概是这样的:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    ...
    <statement-N>
5

如果你需要进行重定向,可能需要把你想保留的变量也一起重定向到新的地址。这就意味着你要从

/myview/

重定向到

/myview2/?variable1=value

不过,我觉得你应该先想想为什么要进行重定向。我通常是在用户提交表单后进行重定向,如果用户需要登录,我会把他们重定向到登录页面,使用

/authentication/login/?next=/view/they/wanted/to/see

否则,你也可以把信息保存在 cookies 里,但这并不是最好的做法。

撰写回答