WINDOWS上的Python Flask双栈(ipv4和ipv6)

diogoftp

我在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Ubuntu(双栈(IPv4 / IPv6))网络上未配置IPv4

在支持 IPv4 和 IPv6 的 Windows 上构建 Subversion

如何在JRE上为IPv4 IP禁用IPv6堆栈使用?

如何在Java上同时支持IPv4和IPv6

CentOS 6.2上的静态IPv4和IPv6配置

django是否需要在ipv6和ipv4上打开端口?

Windows 7中的IPv4和IPv6优先级

如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

SQL Server 2019 Express(v15.0.2000)正在侦听localhost(IPv4和IPv6)上的随机端口

在使用IPv6和IPv4的三台路由器上配置静态路由

如何将IPv4和IPv6源地址都绑定到Python套接字?

在仅IPv6的网络上运行仅IPv4的应用程序

为什么Windows 10比IPv6更喜欢IPv4?

Python Protobuf(IPv4/IPv6 地址)转化为 Clickhouse FixedString(16)

使用Python查找IPv4并忽略IPv6 IP地址

我们可以在Windows XP / 2003上禁用IPV4并仅使用IPV6吗?

在同一网络中的不同服务器上为ipv4和ipv6运行DHCP

使用Comcast(ipv6 vs ipv4)在新路由器上的下载速度受到限制

如何在CentOS 7上使用IPv4连接连接到IPv6服务?

为什么我在 Android 上看到两个不同的 IPv4 地址但 IPv6 地址相同?

Flask应用程序中对IPv4和IPv6的双重支持

设置静态IPv4和IPv6

PHP Echo ipv4 和 IPv6

IPv4,IPv6和IPTable

在Mint和Debian上禁用IPv6

在Windows 7和本地DNS服务器上运行ipv6隧道

IPv6在OpenVPN上的路由问题

连接到IPV4路由器时无法解析名称,但可以ping地址,在IPV6路由器上都可以正常工作

Linux 内核 IPv4 和 IPv6 套接字创建:EPROTONOSUPPORT 和 ESOCKTNOSUPPORT 错误