V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
HashV2
V2EX  ›  Django

django 有没有官方的服务器文件访问途径

  •  
  •   HashV2 · 2021-01-22 11:25:44 +08:00 · 3016 次点击
    这是一个创建于 1388 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用户上传的一些图片、文档保存在服务器后,用户需要访问

    我是一直在 url.py 使用 django.conf.url.static.static 放出 url 去做文件访问的

    今天在看源码的时候发现 static 所使用的的 view 参数的文件上有注释告知仅在开发环境使用,不建议在生产环境使用

    """ Views and functions for serving static files. These are only to be used during development, and SHOULD NOT be used in a production setting. """

    包括在官方文档中我也找到了相关描述: https://docs.djangoproject.com/en/2.2/ref/urls/#module-django.conf.urls

    想问一下有没有其它方法让用户查看到文件呢?

    25 条回复    2021-01-25 14:31:03 +08:00
    HashV2
        1
    HashV2  
    OP
       2021-01-22 11:28:23 +08:00
    我知道这个方法没有对用户权限做判定,但可以重写判断 request 用户去做权限控制
    这么做的话风险在那里?为什么 django 不建议在生产环境中使用这个方法?
    zengxs
        2
    zengxs  
       2021-01-22 11:46:49 +08:00   ❤️ 1
    @HashV2 生产中应该由 nginx 直接处理静态文件
    YouLMAO
        3
    YouLMAO  
       2021-01-22 11:47:12 +08:00 via Android
    需要鉴权就不是 static 了,static 一般是 nginx or cdn
    zengxs
        4
    zengxs  
       2021-01-22 11:47:46 +08:00
    veoco
        5
    veoco  
       2021-01-22 11:52:22 +08:00
    官方文档有说吧,推荐用云服务:

    https://docs.djangoproject.com/zh-hans/3.1/topics/security/#user-uploaded-content

    自己搞一般都是用 Nginx 之类的前端来处理静态文件。
    HashV2
        6
    HashV2  
    OP
       2021-01-22 11:56:21 +08:00
    @zengxs 感谢,这块我有些小白了
    如果是使用 nginx 处理静态文件的话(像是用户上传的图片、pdf 等文件),如何结合 django model 进行复杂的权限判断?假设一个 model 记录了上传的文件、上传时间、上传人等数据,能否做到当用户访问文件时仅限当访问人的角色(自定义)权限大于上传人的权限且文件在 3 个月内上传可以查看,否则不给权限查看这种复杂判断?
    我好像没找到相关的资料
    allisone
        7
    allisone  
       2021-01-22 11:59:18 +08:00
    你这样的需需求,估计要用专门的文件托管服务器来处理。。。。
    746970179
        8
    746970179  
       2021-01-22 12:14:46 +08:00
    上传的文件用 uuid 重命名, 保存成一条 model 里的数据, 包含上传的文件名(路径), 上传时间, 上传人等, 对这个数据进行权限相关的管理.
    loading
        9
    loading  
       2021-01-22 12:19:20 +08:00 via Android
    建议搜索 nginx internal flask
    之前看过的例子。
    HashV2
        10
    HashV2  
    OP
       2021-01-22 12:24:29 +08:00
    @allisone 举个例子。。
    实际需求只看是否是本人上传
    但是项目用了 jwt
    HashV2
        11
    HashV2  
    OP
       2021-01-22 12:26:11 +08:00
    @allisone 举个例子,实际没有那么复杂,只判断上传人就好了,项目用的是 jwt,不知道好不好搞
    freakxx
        12
    freakxx  
       2021-01-22 12:34:15 +08:00
    感觉这里面实际上是几个问题了,

    拆成几个东西来做
    - 文件上传
    - 文件与用户关系绑定
    - 文件查看权限


    文件上传这块还是按正常来走,

    文件与用户关系,可以通过数据表,做个 file model 来管理,或者直接用路径来表示 /file/<user_id>/

    文件查看权限,这里可以做在业务里面,用路径来控制文件的读写,
    要么用库 https://github.com/johnsensible/django-sendfile
    来做控制管理
    allisone
        13
    allisone  
       2021-01-22 12:44:07 +08:00
    @HashV2 是要做到获取文件时判断当前登陆人是否是拥有查看文件权限,不是就返回 403 么,写个中间件应该可以拦截请求应该可以。
    westoy
        14
    westoy  
       2021-01-22 12:46:02 +08:00
    它这个不建议用是因为等于 django 读取输入再吐给 webserver, webserver 再输出

    但是你可以 django 端鉴权 + 发 x-sendfile 头让 web server 自己读啊........
    uhian
        15
    uhian  
       2021-01-22 12:49:35 +08:00
    @westoy 关注~~能详细说说?😄
    uhian
        16
    uhian  
       2021-01-22 13:23:03 +08:00
    @uhian 哦,搜索了下,大概明白了,是 apache 或者 nginx 的一个模块。Django 只需要返回特定 header 的内容就行。
    slipper
        17
    slipper  
       2021-01-22 14:01:29 +08:00   ❤️ 1
    @HashV2 django 只做鉴权,鉴权通过后内部转发到 Nginx,由 Nginx 返回静态文件。
    wuwukai007
        18
    wuwukai007  
       2021-01-22 14:09:45 +08:00
    django 接受请求判定权限,然后转发给 nginx

    ori_filename = request.quer_params.get('xxx')
    #权限判定 xxx
    url = 'nginx 路由'
    response = HttpResponse()
    response['X-Accel-Redirect'] = url
    return response
    0bit
        19
    0bit  
       2021-01-22 14:13:44 +08:00   ❤️ 1
    推荐使用一个第三方库
    whitenoise,http://whitenoise.evans.io/en/stable/

    省得配置 Nginx,部署方便一点。
    当然它存在的前提是,认为你的服务器静态资源一定会套一层 CDN 进行回源。

    推荐试试,方便很多。
    HashV2
        20
    HashV2  
    OP
       2021-01-22 14:26:11 +08:00
    @slipper 多谢,明白了 我尝试改一下

    有没有大佬给解释一下使用 django 的 static 开放文件访问 具体的安全风险在体现在哪里呢?
    HashV2
        21
    HashV2  
    OP
       2021-01-22 14:28:11 +08:00
    @0bit 谢谢 我研究一下
    HashV2
        22
    HashV2  
    OP
       2021-01-22 14:35:40 +08:00
    @0bit
    现在项目是已经在有在生产环境跑着的( nigix, 内网环境),现在是版本迭代阶段
    请教一下这个库的使用情况,如果线上添加切换库进行文件管理 开销大不大 ?
    可以直接在开发环境配置使用(开发环境没有 nginx )然后上线到生产环境么?
    还是要在生产环境上进行一次文件迁移和配置?
    namekkozZ
        23
    namekkozZ  
       2021-01-22 18:54:17 +08:00
    from django.views.static import serve
    0bit
        24
    0bit  
       2021-01-25 13:59:03 +08:00
    @HashV2 会增加部分开销的,所以建议先把 CDN 用起来,这样只用于回源,就好了。
    HashV2
        25
    HashV2  
    OP
       2021-01-25 14:31:03 +08:00
    文件资源访问已经切换到 nginx,文件按需求存在 puclic 和 protect 两个文件夹,
    其中 public 文件夹下的文件可直接访问
    protect 在 nginx 配置为 internal,使用 @wuwukai007 的方法,通过 django 接口鉴权后转给 nginx,非常 nice 。
    感谢 @wuwukai007 @zengxs @0bit 各位指导
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2637 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:16 · PVG 13:16 · LAX 21:16 · JFK 00:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.