Google app engine 将聊天与(webapp2+;python2.7+;Jinja2)集成
我正在尝试将聊天添加到我的站点,并将一些代码与现有代码集成。当聊天应用程序在原始main.app文件中设置好后,它就可以独立工作了。但是,当我尝试将相同的代码移动到handlers.py文件中,然后在routes.py中设置路由时,会出现错误,说模板变量未定义。这两种不同的代码在呈现模板的方式上是否存在冲突?他们使用webapp2的方式似乎有所不同,即我的代码呈现的模板如下:Google app engine 将聊天与(webapp2+;python2.7+;Jinja2)集成,google-app-engine,python-2.7,jinja2,webapp2,Google App Engine,Python 2.7,Jinja2,Webapp2,我正在尝试将聊天添加到我的站点,并将一些代码与现有代码集成。当聊天应用程序在原始main.app文件中设置好后,它就可以独立工作了。但是,当我尝试将相同的代码移动到handlers.py文件中,然后在routes.py中设置路由时,会出现错误,说模板变量未定义。这两种不同的代码在呈现模板的方式上是否存在冲突?他们使用webapp2的方式似乎有所不同,即我的代码呈现的模板如下: self.render_template('secure_zone.html', **params) 聊天应用程序如下
self.render_template('secure_zone.html', **params)
聊天应用程序如下所示:
self.response.out.write(render("main.html",
username=username,
usernameerror=usernameerror,
channel=channelname,
channelerror=channelerror))
两者都可以接受吗
这是我的handlers.py文件:
Routes are setup in routes.py and added in main.py
"""
import httpagentparser
from boilerplate import models
from boilerplate.lib.basehandler import BaseHandler
from boilerplate.lib.basehandler import user_required
class SecureRequestHandler(BaseHandler):
"""
Only accessible to users that are logged in
"""
@user_required
def get(self, **kwargs):
user_session = self.user
user_session_object = self.auth.store.get_session(self.request)
user_info = models.User.get_by_id(long( self.user_id ))
user_info_object = self.auth.store.user_model.get_by_auth_token(
user_session['user_id'], user_session['token'])
try:
params = {
"user_session" : user_session,
"user_session_object" : user_session_object,
"user_info" : user_info,
"user_info_object" : user_info_object,
"userinfo_logout-url" : self.auth_config['logout_url'],
}
return self.render_template('secure_zone.html', **params)
except (AttributeError, KeyError), e:
return "Secure zone error:" + " %s." % e
以下是聊天应用程序的main.py文件:
import os
import hashlib
import urllib
import logging
import re
import json
import webapp2
import jinja2
from google.appengine.api import channel as channel_api # 'channel' is kind of ambiguous in context
from google.appengine.ext import db
from google.appengine.api import memcache
# This section will eventually get moved to a Handler class
template_dir = os.path.join(
os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(
loader = jinja2.FileSystemLoader(template_dir),
autoescape = True)
def render_str(template, **params):
'''Returns a string of the rendered template'''
t = jinja_env.get_template(template)
return t.render(params)
def render(template, **kw):
'''Render using the template and parameters'''
return(render_str(template, **kw))
# End Handler
class Main(webapp2.RequestHandler):
def get(self):
'''Show connection page'''
return self.render_template("main.html", channel="#udacity")
def post(self):
'''Displays chat UI'''
username = self.request.get('username')
channelname = self.request.get('channel')
usernameerror = ""
if not username:
usernameerror="Please enter a username"
elif not re.compile(r'^[a-zA-Z0-9_-]{3,20}$').match(username):
usernameerror = "Username must consist of 3-20 alphanumeric characters."
elif get_user(username):
usernameerror="Username already in use"
channelerror = ""
if channelname and not re.compile(r'^#[\w]{3,20}$').match(channelname):
channelerror="Channel must consist of 3-20 alpha_numeric characters and start with a #"
if len(usernameerror+channelerror) > 0:
self.response.out.write(render("main.html",
username=username,
usernameerror=usernameerror,
channel=channelname,
channelerror=channelerror))
app = webapp2.WSGIApplication([
('/', Main),
('/communication', Communication),
('/_ah/channel/connected/?', Connect),
('/_ah/channel/disconnected/?', Disconnect)
], debug=True)
您在注释“error:'Main'对象没有属性'render_template'”中发布的特定错误是因为在主处理程序中,您试图返回self.render_template。您应该这样调用函数:
render_template("main.html", channel="#udacity")
请注意,我没有检查代码的其余部分,因此如果您遇到任何其他问题,请发布您遇到的具体错误。这是因为您的webapp2.RequestHandler没有相应的函数“render_template” 可以使用添加了render_template函数的BaseHandler来实现模板渲染
from google.appengine.ext.webapp import template
class BaseHandler(webapp2.RequestHandler):
def render_template(self, filename, **template_args):
path = os.path.join(os.path.dirname(__file__), 'templates', filename)
self.response.write(template.render(path, template_args))
class Main(BaseHandler):
def get(self):
'''Show connection page'''
return self.render_template("main.html", channel="#udacity")
参考:
我刚开始使用webapp2+python2.7+Jinja2几天,这和我遇到的问题是一样的。
希望此解决方案能对您有所帮助;) 请发布您看到的错误。@Sologoub感谢您的回复。因此错误是错误:“Main”对象没有属性“render_template”。你怎么认为?