我在Windows 10上使用python Flask。它对ipv4或ipv6正常工作,具体取决于我绑定的ip,但不能同时使用两者。
在此示例中:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello World! <strong>I am learning Flask</strong>", 200
app.run(host='', port=5000, debug=True)
我明白了
在此示例中:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello World! <strong>I am learning Flask</strong>", 200
app.run(host='::', port=5000, debug=True)
我明白了
当我运行一个Minecraft服务器并将其绑定到“ ::”时,我得到了
我在这篇文章中看到Flask在绑定到“ ::”时会在Linux上进行双堆栈。我想知道是否可以让de Flask应用程序同时收听ipv4和ipv6地址。谢谢。
附加信息:Python套接字模块在Windows上不会双重堆栈(我认为在Linux上是双重堆栈)。我发现了这一点,并通过以下示例成功创建了一个双堆栈套接字:
import socket
from recipe1 import has_dual_stack, create_server_sock, MultipleSocketsListener
tcp = MultipleSocketsListener([("0.0.0.0", 5000), ("::", 5000)])
while True:
con, cliente = tcp.accept()
print ('Concetado por', cliente)
while True:
msg = con.recv(1024)
if not msg: break
print (cliente, msg)
print ('Finalizando conexao do cliente', cliente)
con.close()
结果它确实有效,但是我不知道此套接字是否可以与Flask一起使用。
根据[PalletProjects.Flask]:运行(host = None,port = None,debug = None,load_dotenv = True,** options):
请勿
run()
在生产环境中使用。它无意满足生产服务器的安全性和性能要求。相反,请参阅WSGI服务器建议的“部署选项”。
NGINX知道如何处理这种确切的情况。
在开发模式下,我不知道为什么监听所有地址如此重要,因为可以一次监听一个东西来测试事物。
我没有发现完成这项工作的任何简便方法。需要注意的是,在Lnx上,似乎很容易,因为可以通过该设置控制映射IPv4的 IPv6地址net.ipv6.bindv6onl
。
但是,有多种解决方法,这是一种针对每个侦听IP地址在新进程中执行当前文件(本身)的方法(并在线程中执行,因为(子)进程阻止了执行)。
code00.py:
#!/usr/bin/env python3
import sys
from flask import Flask
import threading
import subprocess
app = Flask(__name__)
def run_flask(host):
return subprocess.call([sys.executable, sys.argv[0], host])
@app.route("/")
def hello_world():
return "Hello World! <strong>I am learning Flask</strong>", 200
def main(argv):
port = 5000
debug = True
if argv:
app.run(host=argv[0], port=port, debug=debug)
else:
hosts = [
"127.0.0.1",
"::1",
]
threads = list()
for host in hosts:
threads.append(threading.Thread(target=run_flask, args=(host,)))
for idx, thread in enumerate(threads):
print("Starting on {0:s}:{1:d}".format(hosts[idx], port))
thread.start()
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(sys.argv[1:])
print("\nDone.")
输出(有点混):
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057881991]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 Starting on 127.0.0.1:5000 Starting on ::1:5000 Done. Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 * Serving Flask app "code00" (lazy loading) * Serving Flask app "code00" (lazy loading) * Environment: production * Environment: production WARNING: Do not use the development server in a production environment. WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on Use a production WSGI server instead. * Debug mode: on * Restarting with stat * Restarting with stat Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 * Debugger is active! * Debugger is active! * Debugger PIN: 566-002-078 * Debugger PIN: 566-002-078 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Running on http://[::1]:5000/ (Press CTRL+C to quit)
如图所示,服务器开始侦听给定的地址(您可以删除打印调用,以减少输出)。另外(在另一个cmd上):
[cfati@CFATI-5510-0:C:\WINDOWS\system32]> netstat -an | findstr 5000 TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING TCP [::1]:5000 [::]:0 LISTENING
您也可以通过使用/ etc / hosts文件在操作系统级别进行操作,但是我没有对此进行测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句