跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • django 有没有官方的服务器文件访问途径
未分類
20 1 月 2021

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

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

資深大佬 : HashV2 5

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

我是一直在 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)

  • 主 資深大佬 : HashV2

    我知道这个方法没有对用户权限做判定,但可以重写判断 request 用户去做权限控制
    这么做的话风险在那里?为什么 django 不建议在生产环境中使用这个方法?

  • 資深大佬 : zengxs

    @HashV2 生产中应该由 nginx 直接处理静态文件

  • 資深大佬 : YouLMAO

    需要鉴权就不是 static 了,static 一般是 nginx or cdn

  • 資深大佬 : zengxs

    参考 https://docs.djangoproject.com/zh-hans/3.1/howto/static-files/deployment/

  • 資深大佬 : veoco

    官方文档有说吧,推荐用云服务:

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

    自己搞一般都是用 Nginx 之类的前端来处理静态文件。

  • 主 資深大佬 : HashV2

    @zengxs 感谢,这块我有些小白了
    如果是使用 nginx 处理静态文件的话(像是用户上传的图片、pdf 等文件),如何结合 django model 进行复杂的权限判断?假设一个 model 记录了上传的文件、上传时间、上传人等数据,能否做到当用户访问文件时仅限当访问人的角色(自定义)权限大于上传人的权限且文件在 3 个月内上传可以查看,否则不给权限查看这种复杂判断?
    我好像没找到相关的资料

  • 資深大佬 : allisone

    你这样的需需求,估计要用专门的文件托管服务器来处理。。。。

  • 資深大佬 : 746970179

    上传的文件用 uuid 重命名, 保存成一条 model 里的数据, 包含上传的文件名(路径), 上传时间, 上传人等, 对这个数据进行权限相关的管理.

  • 資深大佬 : loading

    建议搜索 nginx internal flask
    之前看过的例子。

  • 主 資深大佬 : HashV2

    @allisone 举个例子。。
    实际需求只看是否是本人上传
    但是项目用了 jwt

  • 主 資深大佬 : HashV2

    @allisone 举个例子,实际没有那么复杂,只判断上传人就好了,项目用的是 jwt,不知道好不好搞

  • 資深大佬 : freakxx

    感觉这里面实际上是几个问题了,

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

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

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

    文件查看权限,这里可以做在业务里面,用路径来控制文件的读写,
    要么用库 https://github.com/johnsensible/django-sendfile
    来做控制管理

  • 資深大佬 : allisone

    @HashV2 是要做到获取文件时判断当前登陆人是否是拥有查看文件权限,不是就返回 403 么,写个中间件应该可以拦截请求应该可以。

  • 資深大佬 : westoy

    它这个不建议用是因为等于 django 读取输入再吐给 webserver, webserver 再输出

    但是你可以 django 端鉴权 + 发 x-sendfile 头让 web server 自己读啊……..

  • 資深大佬 : uhian

    @westoy 关注~~能详细说说?

  • 資深大佬 : uhian

    @uhian 哦,搜索了下,大概明白了,是 apache 或者 nginx 的一个模块。Django 只需要返回特定 header 的内容就行。

  • 資深大佬 : slipper

    @HashV2 django 只做鉴权,鉴权通过后内部转发到 Nginx,由 Nginx 返回静态文件。

  • 資深大佬 : wuwukai007

    django 接受请求判定权限,然后转发给 nginx

    ori_filename = request.quer_params.get(‘xxx’)
    #权限判定 xxx
    url = ‘nginx 路由’
    response = HttpResponse()
    response[‘X-Accel-Redirect’] = url
    return response

  • 資深大佬 : 0bit

    推荐使用一个第三方库
    whitenoise,http://whitenoise.evans.io/en/stable/

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

    推荐试试,方便很多。

  • 主 資深大佬 : HashV2

    @slipper 多谢,明白了 我尝试改一下

    有没有大佬给解释一下使用 django 的 static 开放文件访问 具体的安全风险在体现在哪里呢?

  • 主 資深大佬 : HashV2

    @0bit 谢谢 我研究一下

  • 主 資深大佬 : HashV2

    @0bit
    现在项目是已经在有在生产环境跑着的( nigix, 内网环境),现在是版本迭代阶段
    请教一下这个库的使用情况,如果线上添加切换库进行文件管理 开销大不大 ?
    可以直接在开发环境配置使用(开发环境没有 nginx )然后上线到生产环境么?
    还是要在生产环境上进行一次文件迁移和配置?

  • 資深大佬 : namekkozZ

    from django.views.static import serve

  • 資深大佬 : 0bit

    @HashV2 会增加部分开销的,所以建议先把 CDN 用起来,这样只用于回源,就好了。

  • 主 資深大佬 : HashV2

    文件资源访问已经切换到 nginx,文件按需求存在 puclic 和 protect 两个文件夹,
    其中 public 文件夹下的文件可直接访问
    protect 在 nginx 配置为 internal,使用 @wuwukai007 的方法,通过 django 接口鉴权后转给 nginx,非常 nice 。
    感谢 @wuwukai007 @zengxs @0bit 各位指导

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具