0

我在我的 App Engine (Python 2.7) 应用程序上实现了 Alex 的 Simpleauth:https ://github.com/crhym3/simpleauth ,但我不知道为什么会出现 404 错误。

当我在未登录时尝试转到“/profile”时,我会正确重定向到“/”。但是当我(成功)登录并被定向到“/profile”时,我得到一个 404。

我认为这是因为它在“渲染”代码中遇到了“TemplateNotFound”异常。但是“profile.html”文件存在并且正确地位于“模板”目录中。

谁能帮我弄清楚我做错了什么?

以下是相关文件的代码:

应用程序.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

主文件

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('/')
4

1 回答 1

1

上面的问题是我使用了两种不同的方式来实现 Jinja2。这两种不同的方法在一个单独的问题中讨论:在 App Engine 上使用 jinja2 的首选方法是哪种?

是混合和匹配导致了 404 错误。

于 2012-10-24T01:05:55.087 回答