如何使用 Http 服务器为 Flask 提供服务
How to serve Flask With Http Server
我想开发一个同时使用 Flask 和 httpd 的应用程序。
Flask发布HTML相关文件,httpd发布本地文件中的文件
用于浏览 Flask 在 httpd 中发布的本地文件 HTML。
虽然Flask和httpd的端口号不一样,但是httpd server端好像不行。
连接到 httpd 服务器时出现连接被拒绝错误。
增加了题意。
我想 运行 Flask 的内置网络服务器和 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()
可能是没有传好。对不起。
非常感谢。
app.run()是阻塞操作。下面几行将不会被解释。
运行 您的应用来自不同的文件或不同的 thread/process。
Can I not start each server with the following code?
是的,还有很多其他方法。
WSGI
wsgi
代表Web Server Gateway Interface
定义在PEP 333:
This document specifies a proposed standard interface between web
servers and Python web applications or frameworks, to promote web
application portability across a variety of web servers.
框架端
flask
、django
等很多框架都实现了这个接口。因此,当您在 flask
中编写应用程序时,app
会实现 wsgi
,因此任何知道如何为 wsgi
应用程序提供服务的 Web 服务器都可以为其提供服务。
网络服务器端
有很多选择,您可以在 wsgi.org:
找到更多选择
基本上,您可以选择其中任何一个来启动您的服务器并使用 httpd
将请求代理到它。或者你可以使用 mod_wsgi:
mod_wsgi is an Apache module that embeds a Python application within
the server and allow them to communicate through the Python WSGI
interface as defined in the Python PEP 333.
备注
flask
中的捆绑服务器不适合生产使用,您可以查看this question了解更多详情。
更新问题
I want to run Flask's built-in web server and HTTPServer
simultaneously from a script.
只需运行Shell命令
您可以启动另一个进程并使用 Popen 调用 shell 命令:
if __name__ == '__main__':
p = Popen(['python -m http.server'], shell=True)
app.run(host='localhost', port=5000)
使用任何你喜欢的命令,你甚至可以在这里启动一个节点http服务器。
使用Thread/Process
你可以在另一个线程或进程中启动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了解更多详情。
我想开发一个同时使用 Flask 和 httpd 的应用程序。 Flask发布HTML相关文件,httpd发布本地文件中的文件
用于浏览 Flask 在 httpd 中发布的本地文件 HTML。
虽然Flask和httpd的端口号不一样,但是httpd server端好像不行。 连接到 httpd 服务器时出现连接被拒绝错误。
增加了题意。
我想 运行 Flask 的内置网络服务器和 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()
可能是没有传好。对不起。
非常感谢。
app.run()是阻塞操作。下面几行将不会被解释。
运行 您的应用来自不同的文件或不同的 thread/process。
Can I not start each server with the following code?
是的,还有很多其他方法。
WSGI
wsgi
代表Web Server Gateway Interface
定义在PEP 333:
This document specifies a proposed standard interface between web servers and Python web applications or frameworks, to promote web application portability across a variety of web servers.
框架端
flask
、django
等很多框架都实现了这个接口。因此,当您在 flask
中编写应用程序时,app
会实现 wsgi
,因此任何知道如何为 wsgi
应用程序提供服务的 Web 服务器都可以为其提供服务。
网络服务器端
有很多选择,您可以在 wsgi.org:
找到更多选择基本上,您可以选择其中任何一个来启动您的服务器并使用 httpd
将请求代理到它。或者你可以使用 mod_wsgi:
mod_wsgi is an Apache module that embeds a Python application within the server and allow them to communicate through the Python WSGI interface as defined in the Python PEP 333.
备注
flask
中的捆绑服务器不适合生产使用,您可以查看this question了解更多详情。
更新问题
I want to run Flask's built-in web server and HTTPServer simultaneously from a script.
只需运行Shell命令
您可以启动另一个进程并使用 Popen 调用 shell 命令:
if __name__ == '__main__':
p = Popen(['python -m http.server'], shell=True)
app.run(host='localhost', port=5000)
使用任何你喜欢的命令,你甚至可以在这里启动一个节点http服务器。
使用Thread/Process
你可以在另一个线程或进程中启动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了解更多详情。