【问题标题】:Flask - window.location not working on Firefox (latest versions)Flask - window.location 在 Firefox 上不起作用(最新版本)
【发布时间】:2018-10-08 07:52:13
【问题描述】:

在我的 Flask 应用程序中,我制作了一堆 a hrefs,它将用户重定向到另一个包含输入表单的页面。此输入表单将通过 this.innerHTML 预填充它可以在除 Firefox 之外的所有浏览器上完美运行,我在其中得到 ValueError: View function did not return a response

{% for x in text %}
  <p>{{ x["address"] }} : <strong><a href="">{{ x["car_park_no"] }}</a></strong> </p>
{% endfor %}

这对我来说特别令人困惑,因为我在 Google 和 SO 上到处检查并尝试了所有可能与 Firefox 相关的修复...(window.location) vs (window.location.href) vs (window.location.assign) vs make function return false

我了解 SO 上存在一些问题,即仅当函数不返回响应时才会发生此错误 - 但是我的函数在这里已经返回了响应。而且这个错误不会出现在 Chrome/Internet Explorer/Safari/Edge 上,只会出现在 Firefox 上。

<script>
  // add query strings
  window.onload = function() {
    var elements = document.getElementsByTagName('a');
      for(var i = 0, len = elements.length; i < len; i++) {
        elements[i].onclick = function () {
        event.preventDefault(); 
        window.location = "/lotfinder?address=" + this.innerHTML;
      }, false;
    }
  }
</script>

任何帮助将不胜感激,如果您需要更多代码 sn-ps,请发表评论。

编辑:/lotfinder 端点处的代码

    <h1>carpark.py</h1>
      <form action = "/carpark" method = "POST">
         <p>Carpark No: <input type = "text" id="carpark-input" name = "Carpark" required></p>
         <p><input type = "submit" value = "submit"></p>
      </form>
   </body>
  <script>

  const carparkInput = document.getElementById("carpark-input");
  // use new URLSearchParams API instead of ugly regex querystring parsing
  window.onload = function() {
    var urlParams = new URLSearchParams(window.location.search);
    carparkInput.value = urlParams.get('address');
  }

</script>

上面是HTML,下面是Handler

@app.route('/lotfinder',methods = ['POST', 'GET'])
def car1():
    if request.method == 'GET':
        return render_template("car1.html")

【问题讨论】:

    标签: javascript flask jinja2 query-string window.location


    【解决方案1】:

    我认为您正在将false 分配给您的所有点击事件处理程序。试试这个:

     // add query strings
     window.onload = function() {
       var elements = document.getElementsByTagName('a');
         for(var i = 0, len = elements.length; i < len; i++) {
           elements[i].onclick = function () {
           event.preventDefault(); 
           window.location = "/lotfinder?address=" + this.innerHTML;
         };
       }
     }
    

    当您的某个函数没有返回值时,Flask 会返回 ValueError: View function did not return a response 错误。见Flask Value error view function did not return a response

    您可以尝试像这样编辑端点函数:

    @app.route('/lotfinder',methods = ['POST', 'GET'])
    def car1():
        if request.method == 'GET':
            return render_template("car1.html")
        return 'OK'
    

    【讨论】:

    • 是的,我也是这么想的,但是ValueError: View function did not return a response 的错误仍然存​​在,奇怪的是它的 Firefox-only
    • 完成@tomcek112
    • 根据您的回答进行了编辑,甚至删除了 if request.method == 处理程序,但 err 500 仍然存在,有趣的是,在 Firefox 上,端点是 GET /address 而不是 GET /lotfinder?querystringhere 在其他浏览器上
    【解决方案2】:

    只需将事件作为参数传递给匿名函数

    elements[i].onclick = function ( event ) {
    

    谢谢

    【讨论】:

    • 嗨@vinesh 将事件传递给函数有什么作用?尝试过,但 500 在 Firefox 上仍然存在
    猜你喜欢
    • 2023-04-07
    • 2023-03-09
    • 2015-01-27
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多