使用Flask和CherryPy来提供静态文件

wsc*_*ang 2 python cherrypy flask

第一次使用Web框架,希望得到正确方法的建议.

我的目标是拥有一个可以根据传入的URL返回静态文件的服务器.我使用Flask作为我的Web框架,我打算使用CherryPy作为我的Web服务器.网络描述了使用CherryPy设置Flask的许多方法,我不确定我是否正确地进行了操作.

我一直在使用的资源:

我的Flask应用程序的简化版本test.py:

from flask import Flask
from flask import request
from flask import send_from_directory
import os

FOLDER='contents'
ROOT=os.path.abspath(os.path.join('.', FOLDER))

@app.route("/get")
def route_3():
    return flask.send_from_directory(os.path.join(ROOT, 'p01', 'p02'), 'file12.zip', as_attachment=True)

if __name__ == "__main__":
    app.config.update(DEBUG=True)
    app.run()
Run Code Online (Sandbox Code Playgroud)

我运行CherryPy的脚本:

import os
import cherrypy
from test import app
from cherrypy import wsgiserver

def option_1():
    cherrypy.tree.graft(app, '/')

    # If I comment this out, the server works
    #cherrypy.tree.mount(None, '/', config={
    #        '/': {
    #                'tools.staticdir.on': True,
    #                'tools.staticdir.dir': app.static_folder
    #            },
    #    })

    cherrypy.config.update({'server.socket_port': 5000})

    cherrypy.engine.start()
    cherrypy.engine.block()


def option2():
    d = wsgiserver.WSGIPathInfoDispatcher({'/': app})
    server = wsgiserver.CherryPyWSGIServer(('127.0.0.1', 5000), d)
    try:
       server.start()
    except KeyboardInterrupt:
       server.stop()

 if __name__ == '__main__':
    #option_1()
    option_2()
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 在设置CherryPy以运行Flask方面,option_1和option_2都有效,那么两者之间的区别是什么?
  2. 建议让Web服务器提供静态文件而不是Web框架.我这样做了吗?当我读取响应头时,服务器不是'Werkzeug',所以我假设CherryPy服务器正在发送它.

Sea*_*ira 7

选项1是高级CherryPy

option_1实际上使用整个CherryPy Web框架(他们的文档称为APPLICATION层)来安装您的WSGI应用程序 - 插件,工具等可以充分利用.要使用CherryPy提供静态文件,您可能希望将注释掉的代码更改为:

cherrypy.tree.mount(None, '/static', config={
    '/': {
        'tools.staticdir.on': True,
        'tools.staticdir.dir': app.static_folder
    },
})
Run Code Online (Sandbox Code Playgroud)

选项2是低级别的CherryPy

option_2另一方面,只是利用CherryPy的WSGI服务器实现(CORE层)来为Flask应用程序提供服务 - 它不使用任何类似于CherryPy的框架方面.如果你也可以通过Flask的路由层提供静态文件,你甚至可以删除WSGIPathInfoDispatcher中间件并直接安装appCherryPyWSGIServer.如果您希望CherryPy管理/static路由服务,那么您将需要cherrypy.tools.staticdir.handler/static路由下安装实例,如下所示:

static_handler = tools.staticdir.handler(section='/', dir=app.static_folder)
d = wsgiserver.WSGIPathInfoDispatcher({'/': app, '/static': static_handler})
Run Code Online (Sandbox Code Playgroud)