用户上传的一些图片、文档保存在服务器后,用户需要访问
我是一直在 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
想问一下有没有其它方法让用户查看到文件呢?
1
HashV2 OP 我知道这个方法没有对用户权限做判定,但可以重写判断 request 用户去做权限控制
这么做的话风险在那里?为什么 django 不建议在生产环境中使用这个方法? |
3
YouLMAO 2021-01-22 11:47:12 +08:00 via Android
需要鉴权就不是 static 了,static 一般是 nginx or cdn
|
4
zengxs 2021-01-22 11:47:46 +08:00
|
5
veoco 2021-01-22 11:52:22 +08:00
官方文档有说吧,推荐用云服务:
https://docs.djangoproject.com/zh-hans/3.1/topics/security/#user-uploaded-content 自己搞一般都是用 Nginx 之类的前端来处理静态文件。 |
6
HashV2 OP @zengxs 感谢,这块我有些小白了
如果是使用 nginx 处理静态文件的话(像是用户上传的图片、pdf 等文件),如何结合 django model 进行复杂的权限判断?假设一个 model 记录了上传的文件、上传时间、上传人等数据,能否做到当用户访问文件时仅限当访问人的角色(自定义)权限大于上传人的权限且文件在 3 个月内上传可以查看,否则不给权限查看这种复杂判断? 我好像没找到相关的资料 |
7
allisone 2021-01-22 11:59:18 +08:00
你这样的需需求,估计要用专门的文件托管服务器来处理。。。。
|
8
746970179 2021-01-22 12:14:46 +08:00
上传的文件用 uuid 重命名, 保存成一条 model 里的数据, 包含上传的文件名(路径), 上传时间, 上传人等, 对这个数据进行权限相关的管理.
|
9
loading 2021-01-22 12:19:20 +08:00 via Android
建议搜索 nginx internal flask
之前看过的例子。 |
12
freakxx 2021-01-22 12:34:15 +08:00
感觉这里面实际上是几个问题了,
拆成几个东西来做 - 文件上传 - 文件与用户关系绑定 - 文件查看权限 文件上传这块还是按正常来走, 文件与用户关系,可以通过数据表,做个 file model 来管理,或者直接用路径来表示 /file/<user_id>/ 文件查看权限,这里可以做在业务里面,用路径来控制文件的读写, 要么用库 https://github.com/johnsensible/django-sendfile 来做控制管理 |
13
allisone 2021-01-22 12:44:07 +08:00
@HashV2 是要做到获取文件时判断当前登陆人是否是拥有查看文件权限,不是就返回 403 么,写个中间件应该可以拦截请求应该可以。
|
14
westoy 2021-01-22 12:46:02 +08:00
它这个不建议用是因为等于 django 读取输入再吐给 webserver, webserver 再输出
但是你可以 django 端鉴权 + 发 x-sendfile 头让 web server 自己读啊........ |
16
uhian 2021-01-22 13:23:03 +08:00
@uhian 哦,搜索了下,大概明白了,是 apache 或者 nginx 的一个模块。Django 只需要返回特定 header 的内容就行。
|
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 |
19
0bit 2021-01-22 14:13:44 +08:00 1
推荐使用一个第三方库
whitenoise,http://whitenoise.evans.io/en/stable/ 省得配置 Nginx,部署方便一点。 当然它存在的前提是,认为你的服务器静态资源一定会套一层 CDN 进行回源。 推荐试试,方便很多。 |
20
HashV2 OP |
22
HashV2 OP @0bit
现在项目是已经在有在生产环境跑着的( nigix, 内网环境),现在是版本迭代阶段 请教一下这个库的使用情况,如果线上添加切换库进行文件管理 开销大不大 ? 可以直接在开发环境配置使用(开发环境没有 nginx )然后上线到生产环境么? 还是要在生产环境上进行一次文件迁移和配置? |
23
namekkozZ 2021-01-22 18:54:17 +08:00
from django.views.static import serve
|
25
HashV2 OP 文件资源访问已经切换到 nginx,文件按需求存在 puclic 和 protect 两个文件夹,
其中 public 文件夹下的文件可直接访问 protect 在 nginx 配置为 internal,使用 @wuwukai007 的方法,通过 django 接口鉴权后转给 nginx,非常 nice 。 感谢 @wuwukai007 @zengxs @0bit 各位指导 |