Python 3.x 变量未在Flask应用程序中更新

Python 3.x 变量未在Flask应用程序中更新,python-3.x,flask,Python 3.x,Flask,我制作了这个小东西(作为我自己的学习练习),效果很好: import urllib.request url = "http://www.google.com" print_result = "" def is_google_down(): try: result = urllib.request.urlopen(url).getcode() if result == 200: print_result = "google.com

我制作了这个小东西(作为我自己的学习练习),效果很好:

import urllib.request

url = "http://www.google.com"
print_result = ""
def is_google_down():
    try:
        result = urllib.request.urlopen(url).getcode()
        if result == 200:
            print_result = "google.com is fine"
        else:
            print_result = "google.com is down"   
    except urllib.error.HTTPError as e:
        print_result = "google.com is down"
    print(print_result)
is_google_down()
因此,现在我正在尝试将其转换为flask应用程序,以便围绕结果构建一个网页:

from flask import Flask, render_template
import urllib.request
app = Flask(__name__)

@app.route("/")
def is_it_down():
    url = "http://www.google.com"
    print_result = "not working"
    def is_google_down():
        try:
            result = urllib.request.urlopen(url).getcode()
            if result == 200:
                print_result = "google.com is fine"
            else:
                print_result = "google.com is down"   
        except urllib.error.HTTPError as e:
            print_result = "google.com is down"
        print(print_result)
    is_google_down()
    return render_template("is_it_down.html", result=print_result)

if __name__ == "__main__":
    app.run(debug=True)

当我刷新我的网页时,我只得到“不工作”文本,这是
print\u result
最初设置的。为什么不更新?

您的内部函数应该返回
print\u result

答复:

print_result = is_google_down()
return render_template("base.html", result=print_result)

或答复:

你不需要
is\u google\u down
功能。即使这个函数也几乎不返回任何东西,所以只需删除它

app.py

@app.route("/")
def is_it_down():
    url = "http://www.google.com"
    print_result = "not working"
    try:
        result = urllib.request.urlopen(url).getcode()
        if result == 200:
            print_result = "google.com is fine"
        else:
            print_result = "google.com is down"   
    except urllib.error.HTTPError as e:
        print_result = "google.com is down"
    return render_template("is_it_down.html", result=print_result)
它是吗

{{ result }}

简短回答:

您需要使用
非本地
语句

长答案:

Python认为名为
print\u result
的两个变量是不同的,因为它们是在两个不同的范围内声明的(在函数
is\u it\u down
is\u google\u down
中)

这是您的代码的简化版本:

#!/usr/bin/env python3

def is_it_down():
    print_result = "not working"
    def is_google_down():
        print_result = "google.com is fine"
        print(print_result)
    is_google_down()
    print(print_result)

is_it_down()
输出:

google.com is fine
not working
google.com is fine
google.com is fine
虽然这是固定代码,但它将按照您的预期工作:

#!/usr/bin/env python3

def is_it_down():
    print_result = "not working"
    def is_google_down():
        nonlocal print_result
        print_result = "google.com is fine"
        print(print_result)
    is_google_down()
    print(print_result)

is_it_down()
输出:

google.com is fine
not working
google.com is fine
google.com is fine

谢谢你的解释。一切都有道理,好像我在做很多不必要的工作。真的很感激