2017-07-03 24 views
0

次のコードは、hereの答えのバリエーションです。 2つのwebbrowser.open()が要求され、時間的に少し離れています。Python - Flask - デフォルトのブラウザで2つのWebページを開きます。

2つのWebページが正常に表示されますが、両方とも2番目のパラメータ(Chris)が表示されます。

Patはなぜ迎えられないのですか?

import random, threading, webbrowser 
from flask import Flask, render_template_string 

app = Flask(__name__) 


@app.route('/<name>') 
def index(name): 
    return render_template_string('''<h3>Hello, {{ name }}!</h3>''', name=name) 


if __name__ == '__main__': 
    names = ['Pat', 'Chris'] 
    port = 5000 + random.randint(0, 999) 
    wait = 1.25 
    for name in names: 
     url = "http://127.0.0.1:{0}/{1}".format(port, name) 
     threading.Timer(wait, lambda: webbrowser.open(url)).start() 
     wait += 0.5 
    app.run(port=port, debug=False) 

答えて

0

ループでコールバック関数を定義することは問題です。遅延バインディングと呼ばれています。両方のラムダは最終的にurlという最後の値を参照します。

functools.partial(webbrowser.open, url) 

するか、タイマーをスクラップし、ループ内だけtime.sleep(0.5):でラムダを交換してください。

+0

です。ありがとう。これを見て、その本で「遅い綴り」を見つけるのに苦労している人にとっては、「閉鎖」の下で見ている方が幸運かもしれません。 (私はBeazleyとLutzのことを特に言及しています.YMMV。) – Calaf

関連する問題