3

私は新生児のプログラマーですが、GAE についていくつかのことを理解していません。

別のアプリにルーティングするための app.yaml セットアップがあります

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /unit3.*
  script: unit3.app

- url: /birthday.*
  script: birthday.app

- url: /signup.*
  script: signup.app

- url: /rot13.*
  script: rot13.app

- url: .*
  script: main.app

次に、signup.app 内 - 単純な投稿リクエストの後、WSGI は人々をウェルカム ページにリダイレクトします。

import webapp2
import jinja2
import os
import re

template_dir=os.path.join(os.path.dirname(__file__), 'templates')
jinja_env= jinja2.Environment(loader= jinja2.FileSystemLoader(template_dir), autoescape = True)

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
    return username and USER_RE.match(username)

PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
    return password and PASS_RE.match(password)

EMAIL_RE  = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
def valid_email(email):
    return not email or EMAIL_RE.match(email)

def render_str(template,**parms):
    t = jinja_env.get_template(template)
    return t.render(parms)

class  BaseHandler(webapp2.RequestHandler):
    """ a BaseHandler object to render and write  """
    def render(self, template, **kw):
        self.response.out.write(render_str(template, **kw))

    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)


class SignUpHandler(BaseHandler):

    def get(self):
        self.render('signup.html')

    def post(self):
        have_error=False
        username=self.request.get('username')
        password=self.request.get('password')
        verify=self.request.get('verify')
        email=self.request.get('email')

        params = dict(username = username, 
                      email = email)

        if not valid_username(username):
            params['name_error']='that is not a valid name'
            have_error=True

        if not valid_password(password):
            params['password_error']=('that is not a valid password')
            have_error=True
        elif password != verify:
            params['verify_error']='your passwords dont match'
            have_error=True

        if not valid_email(email):
            params['email_error']='that is not a valid email address'
            have_error=True

        if have_error:
            params['message']=('Please type your info in again ' + username)
            self.render('signup.html', **params)
        else:
            self.redirect('welcome?username=' + str(username))

class WelcomeHandler(BaseHandler):

    def get(self):
        username = self.request.get('username')
        if valid_username(username):
            self.render('welcome.html', username = username)
        else:
            self.redirect('signup')


app = webapp2.WSGIApplication([('/signup',SignUpHandler),
                               ('/welcome',WelcomeHandler)]
                               ,debug=True)

WelcomeHandler はテンプレート化された html ファイルを見つけられませんが、404 が返されます。

基本的に、RequestHandler を介してルーティングされたものに対して、この 404 を取得します。

これは私が見落としていた基本的な誤解であり、Google 検索では簡単に修正できないと確信しています。

.yaml 内のすべてをルーティングする必要がありますか? 一般的な URL ハンドラーしかないのに、これが当てはまらないのはなぜですか?

4

1 に答える 1

4

によって提供されるように、/welcome.*ルートをに追加する必要があります。app.yamlsignup.app

さらに、私が推奨する場合/signup現在、ルートと/welcomeインのみをサポートしていますsignup.app:

app = webapp2.WSGIApplication([('/signup',SignUpHandler),
                               ('/welcome',WelcomeHandler)]
                               ,debug=True)

しかし、あなたはすべてをルーティングしてい/signup.*ますapp.yaml。そのため、if/signup/がこの WSGI ハンドラーに送信され、404 になります。これを行う代わりに、catch-all に明示的なパスapp.yamlと 404 ハンドラーをmain.app追加するか、各サブモジュールに 404 ハンドラー catch-all を追加します。

于 2012-11-27T07:44:28.767 に答える