Skip to content

SharedDataMiddleware 中间件, Flask 文件访问服务. #1

Open
@x1ah

Description

@x1ah

SharedDataMiddlewareWerkzeug 内的一个中间件,顾名思义,用来 share data 共享数据的。经常我们能看见一些软件的安装方式是这样的:

$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

通过 URL 直接就能访问服务器上的文件,那么我们也可以通过 Flask 和 ShareDataMiddleware 很简单的来实现一个这样的小功能,下面看一个 Demo:

#!/usr/bin/env python
# encoding: utf-8
# demo.py

# official document: http://flask.pocoo.org/docs/0.10/patterns/fileuploads/

from flask import Flask, send_from_directory
from werkzeug import SharedDataMiddleware

app = Flask(__name__)

app.config["FILE_PATH"] = "."   # The path want handdle

def prev_file(filename):
    return send_from_directory(app.config.get("FILE_PATH"), filename)

app.add_url_rule("/file/<filename>", "prev_file", build_only=True)

app.wsgi_app = SharedDataMiddleware(
    app.wsgi_app,
    {
        "/file": app.config.get("FILE_PATH")
    },
    cache = False
    # tips: http://stackoverflow.com/questions/11515804/zombie-shareddatamiddleware-on-python-heroku
)


if __name__ == "__main__":
    app.run()

当运行脚本之后,便可以直接通过访问 http://localhost:8000/file/<filename> 来直接访问该目录下的文件内容了。

除此之外,在 Flask 源码(0.1)内也有一段使用了SharedDataMiddleware,源码如下:

class Flask(object):
    # balabala
    def __init__(self, package_name):
        if self.static_path is not None:
            self.url_map.add(Rule(self.static_path + '/<filename>',
                                        build_only=True, endpoint='static'))
        if pkg_resources is not None:
            target = (self.package_name, 'static')
        else:
            target = os.path.join(self.root_path, 'static')
        self.wsgi_app = SharedDataMiddleware(self.wsgi_app, { 
            self.static_path: target
        })

这段代码就是默认的为static静态文件提供访问服务,使得我们不用再去关心如何管理静态文件。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions