在Google App Engine中加载页面后删除URL Params

时间:2013-07-03 12:24:29

标签: python google-app-engine url

首先,我对网络编程一般都很陌生。我在线阅读了很多教程,因为有些教程已经过时了,所以有点令人困惑。因此,如果我走的是一条根本错误的道路,我会喜欢关于正确道路的建议。话虽如此,这只是一个有趣的项目,所以如果有一个简单的(< 10行)方式来获得我想要的东西,我很乐意看到今天快速的结果,即使长期我最终从根本上改变一切。

所以无论如何,我正在使用Google App Engine(Python 2.7)进行简单的计算。我显示一个表单,用户填写值,单击底部的按钮,并显示一些结果文本和计算结果。这部分工作正常。

对于我自己的测试,总是重新输入输入值很烦人,有些字段对用户来说并不是很明显,所以我希望能够向表格中的某个人发送链接“ http://buggyapp.appspot.com/calculation?input1=100&input2=200“并填写这两个参数。这部分也有效。

问题是当用户加载那种链接时,更改表单中的一个值,然后单击该按钮。它不使用(更改的)表单值,而是使用URL中的值。我想解决这个问题,理想情况下,我希望URL栏在页面加载后甚至不显示URL Params。

我不确定需要哪些信息来帮助您找到我做错的事情。

这是HTML的一个部分,它是一个Jinja2模板:

<form method="post">
  <input value="{{ input1 }}" name="input1">
  <input value="{{ input2 }}" name="input2">
  <button class="submit" type="submit">Calculate</button>
</form>
<p>{{ result }}</p>

这是python代码:

def get(self):
  input1 = request.get('input1')
  input2 = request.get('input2')

  # some irrelevant(?) code to set default values on the initial load if there are no URL Params

  result = str(input1+input2) #actual calculation slightly more complicated than this
  template = JINJA_ENVIRONMENT.get_template('calculation.html')
  self.response.write(template.render(vars()))

无论我是将计算放在get处理程序还是post处理程序中,它似乎都表现得相同。目前,我只是简单地打电话给另一个:

def post(self):
  input1 = request.get('input1')
  print input1 # even this shows the URL value (if one exists), not form value
  return self.get();

因此,我的使其工作的下一步是更改表单输入的名称,使它们与URL Params不同,并添加额外的代码以合并潜在的输入源。但这并不能真正让我得到我想要的东西,这是因为一旦他们填充了输入表格,URL Params就会消失。它还使生成这些链接的代码部分变得复杂。

我更喜欢仅使用Python的解决方案,但我愿意使用javascript。还有其他堆栈溢出问题/答案暗示javascript机制将做我想要的,但我不理解它们中的任何一个足以将它们应用于我的问题。

我确定我做了很多其他错误的事情,我可能过度简化了事情或者没有发布足够的信息。我在这里学习,所以开火了。并提前感谢您的帮助。

tl; dr-我如何使用URL Params一次,然后从URL中删除它们,以便它们不会覆盖后续帖子的表单输入?

1 个答案:

答案 0 :(得分:1)

HTTP GET请求通常包含URL中的参数,因为没有其他地方可以传递它们(没有请求正文)。

HTTP POST请求通常包含请求正文中的参数,但仍可以在URL中包含参数。

看起来您正在使用某种Javascript发布表单。确保您使用POST请求并将参数放在POST正文中。只要您发出POST请求,大多数库都会自动将params放在POST主体中。

编辑:

默认情况下,表单通常会发出POST请求。通常,<form>元素将具有action属性,该属性指定要发送到的URL。但是,如果它没有action属性,它将向当前URL发出POST请求。

在您的情况下,当前网址包含参数,并且会根据您的请求再次提交这些参数。你应该有几个选择。

  1. 在表单中指定action,这样您就不会使用已附加参数的相同网址提交。

  2. 在您的请求处理程序中,从帖子正文(request.POST['input1'])而不是网址中读取数据。