Python程序在谷歌应用引擎中提交后没有显示正确的页面网址

时间:2013-11-21 07:23:19

标签: python google-app-engine url web

嘿,任何人都可以告诉我为什么这段代码没有在页面顶部返回get方法用户名。当您输入提交按钮时,我希望欢迎传递包含网址中用户名的参数。示例:对于username =“thisisme”,我们应该获取的URL应为“.... \ welcome?username = thisisme”。我在谷歌应用引擎上工作。

import webapp2
import cgi
form="""
form method="post">
    <h2>This is the SignUp Page</h2>
    <br>
    <div><label>&emsp;&emsp;&emsp;Username: <input type="text" name="username" value="%(name)s"></label><span style="color:red">%(error1)s</span></div>
    <div><label>&emsp;&emsp;&emsp;&nbsp;Password: <input type="password" name="password" value="%(pas)s"></label><span style="color:red">%(error2)s</span></div>
    <div><label>&nbsp;&nbsp;Verify Password: <input type="password" name="verify" value="%(vpas)s"></label><span style="color:red">%(error3)s</span></div>
    <div><label>&nbsp;&nbsp;Email (optional): <input type="text" name="email" value="%(email)s"></label><span style="color:red">%(error4)s</span></div>
    <br><br>
    <input type="submit">
</form>"""

def escape_html(s):
    return cgi.escape(s, quote = True)

def valid_name(n):
    valid=set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_")
    if set(n).issubset(valid):
        return n
    else:
        return None

def valid_pas(p):
    if p.__len__()<6:
        return None
    else:
        return p

def valid_vpas(v, p):
    if v==p:
        return v
    else:
        return None

def valid_email(e):
    if '@gmail.com' in e or '@hotmail.com' in e or '@illinois.edu' in e or '@yahoo.com' in e or ''==e:
        return True
    else:
        return None

class MainHandler(webapp2.RequestHandler):
    def write_form(self, error1="", error2="", error3="", error4="", name="", pas="", vpas="", email=""):
        self.response.write(form % {"error1":error1, "error2":error2, "error3":error3, "error4":error4, "name":escape_html(name), "pas":escape_html(pas), "vpas":escape_html(vpas), "email":escape_html(email)})

    def get(self):
        self.write_form()

    def post(self):
        a1=" "
        a2=" "
        a3=" "
        a4=" "
        flag=0
        global user_name
        user_name=self.request.get('username')
        user_pas=self.request.get('password')
        user_vpas=self.request.get('verify')
        user_email=self.request.get('email')
        name=valid_name(user_name)
        pas=valid_pas(user_pas)
        vpas=valid_vpas(user_vpas, user_pas)
        email=valid_email(user_email)
        if not name:
            a1="Please enter no special characters or white spaces in this field"
            flag=1
        if not pas:
            a2="Please enter a valid password six characters long"
            flag=1
        if not email:
            a4="Don't enter it or Enter @gmail.com, @yahoo.com, @hotmail.com or @illinois.edu"
            flag=1
        if not vpas:
            a3="The passwords don't seem to match sir"
            flag=1
        if flag==1:
            self.write_form(a1, a2, a3, a4, user_name, user_pas, user_vpas, user_email)
            flag=0
        else:
            self.redirect("/welcome")

class SignHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Welcome, {}'.format(user_name))

app = webapp2.WSGIApplication([('/', MainHandler), ('/welcome', SignHandler)], debug=True)

2 个答案:

答案 0 :(得分:1)

这实际上似乎不是服务器端问题,而是您为表单设置的客户端代码问题。

而不是

<form method='post'

使用

<form method='get'

编辑: 如果您只想要URL中的用户名,请使用jquery将表单动态提交到

  

YOUR_URL?用户名= 用户名

您可以从这里获得帮助: Submit a form using jQuery

编辑2: 这是您需要在html中插入的内容。在表单标记开始之前粘贴它,以便按照您想要的方式使用jquery。 :

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
    $(document).ready(function(){
        $("form:first").submit(function(){
            un = $("form:first input[name='username']").val();
            $("form:first").attr('action',location.href + "?username=" + un);
        });
    });
</script>

通常,这应该在head标签内,但无论如何..

答案 1 :(得分:0)

缺少角括号

而不是

form>

使用

<form

你不能指望它在URL中有用户名。