Flask应用崩溃 "重启中....socket.error: [Errno 98] 地址已被占用

3 投票
2 回答
5627 浏览
提问于 2025-04-18 13:40

在我的Flask应用中,我导入了一个文件,这个文件里有一些Python变量。然后我把这些变量传递给HTML模板,并通过Jinja2模板引擎在浏览器上显示出来。

我在这里做的事情是,把用户重定向到一个网址,这个网址会渲染一个HTML文件,并把这个Python变量传递给Jinja2模板。我会定期更新这个文件,并通过一个脚本来改变变量的值。

但是,当我更新我的模块文件并改变变量的值时,我的Flask应用就崩溃了。请告诉我我哪里做错了,我对网页开发还很陌生。另外,我也想知道有没有办法在Jinja2模板中导入Python变量。

* Detected change in '/root/Tas/modules/steps.py', reloading
* Restarting with reloader
Traceback (most recent call last):
File "routes.py", line 45, in <module>
app.run(host='0.0.0.0', debug=True,use_reloader=True)
 File "/root/Tas/venv/lib/python2.6/site-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File "/root/Tas/venv/lib/python2.6/site-packages/werkzeug/serving.py", line 706, in   run_simple
test_socket.bind((hostname, port))
File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

我的代码:

from flask import Flask, render_template, request, flash, redirect, url_for
from forms import UpgradeForm
import subprocess
import os
import sys
sys.path.append('/root/Tas/modules/')
import time
import reko
import tibbr_path
import steps

app = Flask(__name__)
app.secret_key = 'development key'

@app.route('/')
def home():
    return render_template('home.html')


@app.route('/upgrade', methods=['GET', 'POST'])
def upgrade():
    form = UpgradeForm(request.form)
    if request.method == 'POST':
            if form.validate() == False:
                    flash('All Fields are required')
                    return render_template('upgrade.html', form=form)
            else:
                    fo = open("/root/Tas/modules/reko.py", "wb")
                    print form.username.data
                            fo.write("username='%s'\npassword='%s'\npack_pack='%s'\nup_server='%s'\n" % (form.username.data, form.password.data, form.pack_pack.data, form.up_server.data))
                    fo.close()
                    return render_template('validate.html', form=form)
    elif request.method == 'GET':
            return render_template('upgrade.html', form=form)

@app.route('/exec_SNupgrade', methods=['GET'])
def exec_SNupgrade():
     os.system("/root/Tas/scripts/int_SNupgrade.py &")
     return redirect(url_for('display_step'))
     )
@app.route('/display_step', methods=['GET'])
def display_step():
    return render_template('display_step.html', up_server=reko.up_server, step1=steps.step1 , step2=steps.step2, step3=steps.step3, step4=steps.step4)
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True,use_reloader=True)

2 个回答

0

'地址已在使用'的意思是,你的电脑上已经有另一个服务器在运行,并且它占用了同样的端口。把那个服务器关掉,你就可以正常使用了。

3

如果这个地址已经被占用了,那就换一个默认的端口。

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True, port=12345, use_reloader=True)

现在你可以通过 http://localhost:12345 来访问这个页面。

撰写回答