使用aws s3+cloudfront为django提供安全存储

djamazing的Python项目详细描述


djazing[d__me_z_]提供了一种使用s3+cloudfront作为django存储的方法。它有 与传统存储相比,它可以生成签名的url,因此只有 能够显示url的用户也能够访问它。DJ惊人 可以在两种模式下工作:

unprotected mode
In this mode the storage simply generates URL-s to cloudfront. The cloudfront distribution should be publicly accessible. This can be used for files that don’t require special security.
protected mode
The URLs are signed in this model using the ^{tt1}$. These signatures are only valid for the current user. Please remember that it is up to the developer to ensure that the signed URLs are created only when the user that can access them is logged in (some kind of per-row authorization should probably be in place). After clicking these a special view redirects the user to a signed cloudfront URL. This URL is only valid for a very small amount of time.

AWS配置

  1. 创建一个s3 bucket。
  2. 为可以访问bucket的用户生成密钥对。
  3. 创建一个源于bucket的cloudfront分发 仅限于已签名的URL。
  4. (对于保护模式)生成可在中使用的CloudFront密钥对
    分布。

安装

  1. 安装djazing by pip:

    $ pip install djamazing
    

    注意:如果你使用django 1.10的djazing 未发布的django threadlocals版本

    $ pip install git+https://github.com/nebstrebor/django-threadlocals.git
    
  2. "djamazing.storage.DjamazingStorage"设置为默认的文件存储。

  3. 配置DJamazing:

    DJAMAZING = {
        'CLOUDFRONT_KEY': b"""-----BEGIN RSA PRIVATE KEY-----
    (...)
    -----END RSA PRIVATE KEY-----""",
        'CLOUDFRONT_KEY_ID': '...',
        'CLOUDFRONT_URL': 'http://....cloudfront.net/',
        'S3_KEY_ID': '...',
        'S3_SECRET_KEY': '...',
        'S3_BUCKET': '...',
        'SIGNATURE_TIMEOUT': datetime.timedelta(seconds=2),
    }
    

    对于无保护模式,省略CLOUDFRONT_KEYCLOUDFRONT_KEY_ID 钥匙。 如果要在文件^{tt5}中存储cloudfornt密钥$ 参数也可以用于文件路径。 请注意,签名超时是不需要任何人工操作的时间 交互时,只需浏览器来处理重定向。如果未指定-它 默认为1.5秒。

  4. 添加threadlocals中间件 'threadlocals.middleware.ThreadLocalMiddleware'到您的MIDDLEWARE

  5. urls.py

    url(r'^djamazing/', include(djamazing.urls)),
    

在一个项目中使用各种配置

如果要在一个项目中使用各种配置(例如 静态文件和保护上传),您可以使用继承。创建一个 DjamazingStoragelike的简单子类:

class StaticStorage(DjamazingStorage):
    """Storage for static files"""

    def __init__(self):
        super(StaticStorage, self).__init__(settings.STATIC_DJAMAZING)

现在您可以将其用作存储空间,如:

STATICFILES_STORAGE = 'some.path.StaticStorage'
STATIC_DJAMAZING = { ... }

STATIC_DJAMAZING配置将重写DJAMAZING 此存储的配置。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java嗨,我正在尝试运行一个简单的奇偶程序,但它给了我一个错误“预期标识符”   java程序输出问题   使用全新Spring上下文的java启动JUnit测试   oauth获取Java中Microsoft Graph API的令牌   java如何停止声音   for loop Java 8向集合中添加自定义元素的方法?   java如何将数组的第n个值赋给变量   java局部变量在使用前必须初始化,例如实例变量,没有这样的限制,为什么?   macos在Mac上安装和运行Java应用程序   运行jar文件时发生java NoClassDefFoundError   用于映射同一数据库中多个MySQL表的java Hibernate配置文件(.cfg.xml)?   如何使用Java通过代理发送华为推送通知   datetime Java将MessagePack时间戳转换为日期   java如何从读取器返回的字符串中删除unicode空格。readLine()   java返回Ljava的字符串值。lang.对象   如何使用java方法在jsp中打印arraylist   JAVAutil。扫描器java。lang.NumberFormatException与一个只有int的txt文件   java Dijkstra单调路径   键入错误号时发生java错误