Django的私人媒体。在向private_media_url提供文件(上载到private_media_root)之前,请检查用户的授权。需要django 1.5。

django-private-media的Python项目详细描述


===
django私有媒体
=


overview
----
默认情况下,django允许您指定用户(或管理员)上传媒体的媒体根目录。所有人都可以通过media_url访问它。

使用django private media,您还可以指定private_media_root和private_media_url。使用提供的privateMediaStorage()存储类上载专用文件或图像。它们由一个视图提供服务,该视图在提供服务之前检查用户的授权。

在webfaction上设置xsendfile(例如)将在"here<;http://community.webfaction.com/questions/12205/serving static files with django using xsendfile>;"中介绍。通过修改stephan foulis的django文件管理器中的代码,添加nginx服务器将变得很容易。

当我研究django filer的安全文件下载方法时,我终于明白了它是如何做到的;但是,我有一个现有的项目,不想采用django文件管理器的全部功能。


我还希望能够将其应用于现有项目,而无需进行任何数据迁移;有了它,您只需确保您的媒体文件从媒体根目录重新定位到私有媒体根目录。


属性
----
此代码的关键部分基于Stephan Foulis和
`Django filer<;https://github.com/stefanfoulis/Django filer>的贡献者编写的代码;`.

注意事项
----
尽管到目前为止,就我的目的而言,它工作得令人满意,但这并不是一个完成的项目。尤其是,它没有任何测试。但是,

添加到"settings.py"中,例如:


private嫒media嫒url='/private/'
如果调试:
dev
import os
project嫒path=os.path.abspath(os.path.dirname(嫒file嫒))
private嫒media嫒root=os.path.join(project嫒path,"private")
专用媒体服务器="专用媒体服务器。默认服务器"
其他:
产品
专用媒体根="/home/user/my/path/to/private/media"
专用媒体服务器="专用媒体服务器。apachexsendfileserver"
#private_media_server_options={'arg1':1,…}(可选)kwargs to init server

默认权限是让经过身份验证的工作人员看到所有,而不是其他人。
概括来说,还添加::

private_media_permissions='myapp.permissions.mypermissionclass'
private_media_permissions_options={'arg1':1,…}(可选)kwargs to init

此权限类必须具有以下方法::

has_read_permissions(self,request,路径)

,返回true或false。






使用:

from django.db import models
from private廑media.storages import private media storage

class car(models.model):
photo=models.imagefield(storage=private mediastorage())



permissions method
是它的路径,您需要在上载时将允许的权限编码到路径中。

例如,您可以使用它将所有者的主键保存到路径中:


import os
from django.db import models
from django.contrib.auth.models i从私有媒体导入用户
存储导入私有媒体存储

def owner_file_name(instance,filename):
返回os.path.join('cars',"{0}"。格式(instance.user.pk),filename)


class car(models.model):
owner=models.foreignkey(user)
photo=models.imageField(存储=privateMediaStorage(),upload_to=owner_file_name)

,然后提供这样一个许可类(允许员工和所有者查看):


import os
from django.http import http404


class owner erpkpermissions(object):
def具有读取许可(self、request、path):
user=request.user
如果不是user.is戋authenticated():
返回false
elif user.is戋superuser:
返回true
elif user.is戋staff:
返回true
否则:
尝试:
所有者pk=int(os.path.split(os.path.split(path)[0])[1])
除了值错误:
引发http404('file not found')
返回(user.pk==所有者pk)

详细文档请参见`<;http://racingtapole.com/blog/private media with django/>;`,位于"docs"目录中(待定)。

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

推荐PyPI第三方库


热门话题
java文件分块,获取长度字节   java嵌入式Tomcat不执行jsf页面   java我的数据库中有2个实体,但hibernate返回其中6个。   java如何基于逗号拆分字符串   java取消已经运行的CompletableFutures的预期模式是什么   java如何在informix中从另一个数据库复制表ddl和数据   为什么图片是黑色的?   java根据字符串数组中的单词筛选列表   Java8的集合。平行流有效吗?   Kotlin中的java静态内部类   java如何在GUI中生成一列字符串   javafx如何正确使用高对比度主题?   带空格的javascript Httpurlconnection参数   java如何设置GridBagLayout的约束   java如何在一个线程可能尚未初始化时关闭另一个线程   java将简单时间格式转换为特殊时间格式(hhmmt)   安卓/java阵列重复过滤器的问题   java在队列的链接实现下,入队和出队是如何工作的   java更新sql外键约束