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

2021-01-22 11:25:44 +08:00
 HashV2

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

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

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

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

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

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

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


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

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

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

但是你可以 django 端鉴权 + 发 x-sendfile 头让 web server 自己读啊........
uhian
2021-01-22 12:49:35 +08:00
@westoy 关注~~能详细说说?😄
uhian
2021-01-22 13:23:03 +08:00
@uhian 哦,搜索了下,大概明白了,是 apache 或者 nginx 的一个模块。Django 只需要返回特定 header 的内容就行。
slipper
2021-01-22 14:01:29 +08:00
@HashV2 django 只做鉴权,鉴权通过后内部转发到 Nginx,由 Nginx 返回静态文件。
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
2021-01-22 14:13:44 +08:00
推荐使用一个第三方库
whitenoise,http://whitenoise.evans.io/en/stable/

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747325

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX