如何使用Http Server服务Flask [重复]

问题描述 投票:-1回答:2

我想开发一个同时使用Flask和httpd的应用程序。 Flask发布与HTML相关的文件,httpd在本地文件中发布文件。

它用于浏览来自Flask HTML的httpd中发布的本地文件。

虽然Flask和httpd的端口号不同,但似乎httpd服务器端无法正常工作。连接到httpd服务器时发生连接拒绝错误。


添加了问题的意图。

我想从脚本中同时运行Flask的内置Web服务器和HTTPServer。我只是希望能够看到自己,而不是将其暴露给网络。

我正在寻找一种可以使用app.py脚本完成而不使用WSGI的机制。


添加了该问题的其他信息。

这个问题使用Flask和Python的HTTPServer,但使用NodeJS的HTTPServer而不是HTTPServer似乎运行良好。 (评论run()

如果可能的话,我想在不使用NodeJS HTTPServer的情况下完成Python。

https://www.npmjs.com/package/http-server

C:\Users\User\Videos>http-server
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8080
Hit CTRL-C to stop the server
...

Flask==1.0.2
Python 3.7

我可以使用以下代码启动每个服务器吗?

模板/ index.html的

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <video src="http://localhost:8080/video.mp4"></video>
</body>
</html>

蟒蛇(app.py)

from http.server import SimpleHTTPRequestHandler, HTTPServer

from flask import Flask, render_template

app = Flask(__name__)


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


class Handler(SimpleHTTPRequestHandler):
    def __init__(self, *args, directory=None, **kwargs):
        super().__init__(*args,
                         directory=r'C:\Users\User\Videos',
                         **kwargs)


def run(server_class=HTTPServer, handler_class=Handler):
    server_address = ('localhost', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()


if __name__ == '__main__':
    app.run(host='localhost', port=5000)
    run()

它可能没有很好地传播。对不起。 非常感谢你。

python flask httpserver
2个回答
3
投票

我可以使用以下代码启动每个服务器吗?

是的,还有很多其他方法。

WSGI

wsgi代表Web Server Gateway Interface,在PEP 333中定义:

本文档规定了Web服务器与Python Web应用程序或框架之间的建议标准接口,以促进跨各种Web服务器的Web应用程序可移植性。

框架方面

flaskdjango和许多其他框架都实现了这个接口。因此,当您在flask中编写应用程序时,app会实现wsgi,因此任何知道如何提供wsgi应用程序的Web服务器都可以提供服务。

网络服务器端

有很多选择,你可以在wsgi.org找到更多:

基本上,您可以选择其中任何一个来启动服务器并使用httpd代理请求。或者你可以使用mod_wsgi

mod_wsgi是一个Apache模块,它在服务器中嵌入Python应用程序,并允许它们通过Python PEP 333中定义的Python WSGI接口进行通信。

注意

flask中的捆绑服务器不适合生产使用,您可以查看this question了解更多详情。


更新问题

我想从脚本中同时运行Flask的内置Web服务器和HTTPServer。

只需运行Shell命令

您可以使用Popen启动另一个进程并调用shell命令:

if __name__ == '__main__':
    p = Popen(['python -m http.server'], shell=True)
    app.run(host='localhost', port=5000)

使用您喜欢的任何命令,您甚至可以在此处启动节点http服务器。

使用线程/进程

你可以在另一个线程或进程中启动http服务器,这里我使用threading例如:

if __name__ == '__main__':
    from threading import Thread
    Thread(target=run, daemon=True).start() 
    app.run(host='localhost', port=5000)

使用Flask来提供文件

您可以实际使用flask来提供文件,而不是启动绑定到两个端口的两个服务器。这样,您只需启动一个服务器绑定到一个端口:

@app.route('/videos/<path:filename>')
def download_file(filename):
    return send_from_directory(r'C:\Users\User\Videos',
                               filename, as_attachment=True)

你可以看到documentation更多细节。


0
投票

app.run()是一个阻塞操作。以下行不会被解释。

从单独的文件或不同的thread/process运行您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.