2017-06-14 61 views
0

我正在使用Google App Engine和Python开发web应用程序。 我正面临着一个奇怪的问题,我不知道如何解决它以及是什么原因造成的。 当我填写表格时,我会发送数据以检查它们。如果他们没有完成,并且某些字段错过了,服务器就会发送一个“填充所有字段!”的建议。python self.session不能正确保存数据

这工作相当好。

我想要做的是发送表单,填充用户在提交表单前填写的“描述”和“标题”字段,因此他必须填写仅填充未填充的字段(和他不需要从头开始重写所有内容)。

这是代码:

class SaleAnnCheck(BaseHandler): 
    def post(self): 
    title = self.request.POST.get('title') 
    cat = self.request.POST.get('cat') 
    description = self.request.POST.get('description') 
    AcqOpt = self.request.POST.get('AcqOpt') 
    lat = self.request.POST.get('lat') 
    lng = self.request.POST.get('lng') 
    image1 = self.request.POST.get("file1", None) 
    image2 = self.request.POST.get("file2", None) 
    image3 = self.request.POST.get("file3", None) 
    logging.info("info sale announcment") 
    logging.info(title) 
    logging.info(cat) 
    logging.info(description) 
    logging.info(AcqOpt) 
    logging.info(lat) 
    logging.info(lng) 
    logging.info(image1) 
    logging.info(image2) 
    logging.info(image3) 
    self.session["ECommerceUser"]["description"]=description 
    self.session["ECommerceUser"]["title"]=title 
    logging.info('session') 
    logging.info(self.session["ECommerceUser"]) 
    if title == '' or cat == None or description == '' or AcqOpt == None or lat == '' or lng == '': 
     error = 'empty' 
     urlR='/CreateSaleAnn?'+urllib.urlencode({'error':'empty'}) 
     self.redirect(urlR) 


class Create(BaseHandler): 
    def get(self): 
    error = self.request.get('error') 
    if error == 'empty': 
     logging.info('sbagliato') 
     logging.info(self.session["ECommerceUser"]) 
     template = JINJA_ENVIRONMENT.get_template('templates/CreateAnnouncement.html') 
     w = self.response.write 
     w(template.render({'error':'FILL ALL THE MANDATORY FIELDS!', 'description': self.session["ECommerceUser"]["description"], 'title': self.session["ECommerceUser"]["title"]})) 
    else: 
     logging.info('giusto')  
     logging.info(self.session["ECommerceUser"]) 
     template = JINJA_ENVIRONMENT.get_template('templates/CreateAnnouncement.html') 
     w = self.response.write 
     w(template.render({'description': self.session["ECommerceUser"]["description"], 'title': self.session["ECommerceUser"]["title"]})) 

当我提交的内容是通过使一个HTTP POST请求到一定的URL,通过SaleAnnCheck办理托运形式。

描述和标题正确保存在会话中(我通过在日志中打印self.session [“ECommerceUser”]的内容来检查它)。然后,如果未填写字段,则服务器会通过对相关URL的GET请求再次重定向到表单页面。

对该URL的请求由Create处理。但是当我尝试使用描述和标题的以前输入的值呈现窗体的HTML模板(使用jinja2)时,相关文本区域未填充该值。 这是因为self.session [“ECommerceUser”] [“description”]和self.session [“ECommerceUser”] [“title”]是空的,但它们并不是在我之前(在SaleAnnCheck中)检查它们时。

为什么会发生?任何解释?这是一个奇怪的问题,并没有关于互联网上的任何提示或建议

+0

要保存变量的会话,重定向的页面,然后检索该会话的另一功能。这不是传递变量的最佳体系结构。尝试搜索Python HTTP请求和承诺。 –

回答

0

这是因为'self.session'不是一个会话,它只是一个类变量,并不会在课堂以外是可读的。如果你真的想使用持久性会话存储变量,尝试这样的事情:

从文档: http://docs.python-requests.org/en/master/user/advanced/

s = requests.Session() 

s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') 
r = s.get('http://httpbin.org/cookies') 
+0

我从现在开始使用Session的方式在本文档中有描述:http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/sessions.html。除此之外,我没有任何问题。当我进行登录时,应用程序会在会话内存储关于登录的信息(与我为SaleAnnCheck所做的相同),并且它可以正常工作。我可以阅读有关登录到处的所有信息。登录由另一个类在另一个python模块中处理。那么为什么它有效? –