python - 新手,对原始的网络表单感到困惑

标签 python http google-app-engine

在做 Udacity 作业时,我发现自己完全糊涂了。这是我的代码的简化版本:

import webapp2
form = '''
<h1>Signup</h1>
<form method='post'>
    Username <input type='text' name='username'>%(usr)s<br>
    <br>
    <input type='submit'>
</form>
'''

class MainPage(webapp2.RequestHandler):
    def write_form(self, usr=''):
        self.response.write(form % {'usr':usr})

    def get(self):
        self.write_form()

    def post(self):
        user = self.request.get('username')
        if user:
            self.redirect('/welcome')
        else:
            self.get()

class WelcomePage(webapp2.RequestHandler):
    def get(self):
        user = self.request.get('username')
        self.response.out.write('Welcome, %s' % user)

app = webapp2.WSGIApplication([('/', MainPage), ('/welcome', WelcomePage)], debug=True)

当我提交用户名时,只显示“欢迎”。我错过了什么?

最佳答案

关于 self.redirect('/welcome')你的self.request.get('username')数据丢失且未传递给:

class WelcomePage(webapp2.RequestHandler):
    def get(self):
        user = self.request.get('username')

因此您最终得到的用户名是空的,所以这是您提供的代码的预期行为。

有很多方法可以解决这个问题(取决于您的要求),但其中一些是:

  • 您可以在没有重定向的情况下立即显示欢迎消息

  • 而不是 POST 到 /你可以直接发布到/welcome (即 <form method='post' action='/welcome'> )如果用户名在那里为空,那么您将重定向回 / 上的表单

  • 重定向时将用户名作为 GET 参数传递,即 self.redirect('/welcome?username=' + user)

  • 您可以将用户名存储在某处,以便它在请求之间保持不变(即内存缓存、 session /cookie、ndb 等)。

关于python - 新手,对原始的网络表单感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36645431/

相关文章:

mysql - 如何从 Google 云 SQL 调用或导入表到 Spark 数据框?

python - 如何将 awk 的值存储在 Python 变量中

python - 学习迭代器(深入Python3)

php - Ajax 问题,变量没有被发送

java - 如何在 Java 中解析 HTTP 请求?

android - 如何验证 Google ID token ?

python - 我的IF语句出现语法错误,不确定为什么吗?

Python模型继承和模型声明的顺序

http - 正确使用url编码

google-app-engine - Google Cloud SDK 中对 google-auth 的依赖性错误?