我想开发一个同时使用Flask和httpd的应用程序。 Flask发布与HTML相关的文件,而httpd发布本地文件中的文件。
它用于浏览Flask HTML中以httpd发布的本地文件。
尽管Flask和httpd的端口号不同,但是httpd服务器端似乎无法正常工作。 连接到httpd服务器时发生连接拒绝错误。
添加了问题的意图。
我想通过脚本同时运行Flask的内置Web服务器和HTTPServer。 我只希望能够看到自己,而不是将其暴露给网络。
我正在寻找一种无需使用WSGI即可通过app.py脚本完成的机制。
为问题添加了其他信息。
此问题使用Flask和Python的HTTPServer,但是使用NodeJS的HTTPServer代替HTTPServer似乎效果很好。
(注释run()
)
如果可能的话,我想在Python中完成而不使用NodeJS HTTPServer。
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
我不能用以下代码启动每个服务器吗?
templates / 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>
python(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()
它可能传输不佳。不好意思
非常感谢。
答案 0 :(得分:3)
我不能用以下代码启动每个服务器吗?
是的,还有许多其他方法。
WSGI
wsgi
(代表Web Server Gateway Interface
在PEP 333中定义:
此文档指定了网络之间建议的标准接口 服务器和Python Web应用程序或框架,以促进Web 应用程序在各种Web服务器上的可移植性。
框架方面
flask
,django
和许多其他框架都实现了此接口。因此,当您使用flask
编写应用程序时,app
会实现wsgi
,因此任何知道如何服务wsgi
应用程序的Web服务器都可以提供服务。
网络服务器端
有很多选择,您可以在wsgi.org中找到更多选择:
基本上,您可以选择任何一种来启动服务器,并使用httpd
代理对服务器的请求。或者,您可以使用mod_wsgi:
mod_wsgi是一个Apache模块,将Python应用程序嵌入其中 服务器并允许他们通过Python WSGI进行通信 接口,如Python PEP 333中所定义。
注意
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
来提供文件,而不是启动绑定到两个端口的两个服务器。这样,您只需启动一台服务器绑定到一个端口:
@app.route('/videos/<path:filename>')
def download_file(filename):
return send_from_directory(r'C:\Users\User\Videos',
filename, as_attachment=True)
您可以查看documentation以获得更多详细信息。
答案 1 :(得分:0)
app.run()是一项阻止操作。以下几行将不予解释。
从单独的文件或在不同的thread/process中运行应用。