2012-11-27 59 views
3

我是一名剛出生的嬰兒程序員,發現我不瞭解GAE的一些內容。請求處理程序和GAE中的app.yaml

我有我的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一個簡單的POST請求

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][email protected][\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路由到任何東西。

我敢肯定,這是一個基本的誤解,我忽略了,不能用谷歌搜索輕鬆修正。

我是否需要路由.yaml中的所有內容?爲什麼不是這種情況,當我只有通用的URL處理程序?

+0

你可以多發佈一下你的'signup.py'文件嗎?一般來說,你使用'webapp2.WSGIApplication'來設置你的應用程序內部的路由(如你所做的那樣),所以很可能在一個(或多個)類中存在一個小錯誤。 – RocketDonkey

+0

@RocketDonkey我更新了包括整個signup.py – underarock

+0

酷的交易 - @ bossylobster的答案看起來像要走的路,所以如果它的工作,點擊他的答案的分數下的複選標記'接受'它(它關閉問題的循環)。祝你一切順利! – RocketDonkey

回答

4

您需要將/welcome.*路線添加到您的app.yaml,因此它的服務範圍是signup.app

IN ADDITION,如果我提出建議。您目前只支持路由/signup/welcomesignup.app

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

,但你正在將所有的/signup.*app.yaml。因此,如果/signup/將被髮送到此WSGI處理程序並將導致404。而不是這樣做,要麼在app.yaml中添加顯式路徑,要麼在main.app中添加一個404處理程序,或者在每個子模塊中添加404處理程序catch-all 。