App Engine (Python 2.7) アプリ ( https://github.com/crhym3/simpleauth ) に Alex による Simpleauth を実装していますが、404 エラーが発生する理由がわかりません。
ログインしていないときに「/profile」に移動しようとすると、適切に「/」にリダイレクトされます。しかし、(正常に) ログインして「/profile」にリダイレクトされると、404 が返されます。
これは、「レンダリング」コードで「TemplateNotFound」例外にヒットしたためだと思います。ただし、「profile.html」ファイルは存在し、「templates」ディレクトリに適切に配置されています。
誰かが私が間違っていることを理解するのを手伝ってもらえますか?
関連ファイルのコードは次のとおりです。
app.yaml
handlers:
- url: /auth/*
script: main.app
- url: /profile
script: main.app
- url: /logout/*
script: main.app
- url: /.*
script: main.app
libraries:
- name: jinja2
version: latest
main.py
import webapp2
import jinja2
from secrets import SESSION_KEY
template_env = jinja2.Environment(loader=jinja2.FileSystemLoader(os.getcwd()))
class MainHandler(webapp2.RequestHandler):
def get(self):
template = template_env.get_template('templates/home.html')
context = {
}
self.response.out.write(template.render(context))
app_config = {
'webapp2_extras.sessions': {
'cookie_name': '_simpleauth_sess',
'secret_key': SESSION_KEY
},
'webapp2_extras.auth': {
'user_attributes': []
}
}
app = webapp2.WSGIApplication([('/', MainHandler),
webapp2.Route('/profile', handler='handlers.ProfileHandler', name='profile'),
webapp2.Route('/auth/<provider>', handler='handlers.AuthHandler:_simple_auth', name='auth_login'),
webapp2.Route('/auth/<provider>/callback', handler='handlers.AuthHandler:_auth_callback', name='auth_callback'),
webapp2.Route('/logout', handler='handlers.AuthHandler:logout', name='logout')], config=app_config, debug=True)
handlers.py (Alex の Simpleauth コードから変更なし!)
import webapp2
from webapp2_extras import auth, sessions, jinja2
from jinja2.runtime import TemplateNotFound
from simpleauth import SimpleAuthHandler
class BaseRequestHandler(webapp2.RequestHandler):
def dispatch(self):
# Get a session store for this request.
self.session_store = sessions.get_store(request=self.request)
try:
# Dispatch the request.
webapp2.RequestHandler.dispatch(self)
finally:
# Save all sessions.
self.session_store.save_sessions(self.response)
@webapp2.cached_property
def jinja2(self):
"""Returns a Jinja2 renderer cached in the app registry"""
return jinja2.get_jinja2(app=self.app)
@webapp2.cached_property
def session(self):
"""Returns a session using the default cookie key"""
return self.session_store.get_session()
@webapp2.cached_property
def auth(self):
return auth.get_auth()
@webapp2.cached_property
def current_user(self):
"""Returns currently logged in user"""
user_dict = self.auth.get_user_by_session()
return self.auth.store.user_model.get_by_id(user_dict['user_id'])
@webapp2.cached_property
def logged_in(self):
"""Returns true if a user is currently logged in, false otherwise"""
return self.auth.get_user_by_session() is not None
def render(self, template_name, template_vars={}):
# Preset values for the template
values = {
'url_for' : self.uri_for,
'logged_in' : self.logged_in
}
# Add manually supplied template values
values.update(template_vars)
# read the template or 404.html
try:
self.response.write(self.jinja2.render_template(template_name, **values))
except TemplateNotFound:
self.abort(404)
def head(self, *args):
"""Head is used by Twitter. If not there the tweet button shows 0"""
pass
class ProfileHandler(BaseRequestHandler):
def get(self):
"""Handles GET /profile"""
if self.logged_in:
self.render('profile.html', {
'user': self.current_user,
'session': self.auth.get_user_by_session()
})
else:
self.redirect('/')