好的,我知道不推荐通过 Django 提供媒体文件。但是,我希望通过 Django 模型使用细粒度访问控制来提供“静态”文件。
示例:我想通过网络向自己提供我的电影库。我经常出差,我希望能够随时随地观看我的任何电影,前提是我可以访问互联网。所以我翻录了我的 DVD,将它们上传到我的服务器并构建了这个简单的 Django 应用程序以及一些可嵌入的视频播放器。
为了避免任何法律后果,我想确保只有具有适当权限的登录用户(即我自己和住在同一家庭的人,可以像我一样,在他们方便的时候访问真正的 DVD),但拒绝它给其他用户(即在我的博客上发表评论的人)并返回 HTTP 404。
现在,直接使用 Apache 提供这些文件mod_wsgi相当麻烦,因为当媒体文件的 HTTP 请求(即http://video.mywebsite.com/my-favorite-movie/)进来时,我需要根据我的用户数据库验证另一端的人是否具有适当的权限。
问题:我可以在不直接通过 Django 视图提供媒体文件的情况下实现这种效果吗?我有哪些选择?
我确实想到的一件事是编写一个简单的脚本,该脚本采用会话 ID 和视频的 slug 并返回一些布尔值,指示用户是否可以(或不可以)访问视频文件。然后,mod_wsgi在访问请求的 URL 之前以某种方式请求执行此脚本,如果脚本失败,则返回 HTTP 404。但是,我不知道这是否可能。
编辑:发布这个问题澄清了我的一些想法搜索,我碰到过mod_python的文件扩展名的包装。有没有人有足够的经验来验证它是一个可行的解决方案?
我在Windows XP上运行django 1.3,python 2.7
我正在尝试在我的django应用程序的静态文件夹中设置一个CSS.
模板看起来像:
<html>
<head>
<title>css demo</title>
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/my.css" />
</head>
<body>
Run Code Online (Sandbox Code Playgroud)
生成的HTML如下所示:
<html>
<head>
<title>css demo</title>
<link rel="stylesheet" type="text/css" href="http://localhost/static/css/my.css" />
</head>
...
Run Code Online (Sandbox Code Playgroud)
因此,似乎我已经设置了所有内容,以便指定静态文件在模板中的位置,然后在生成的html中.
但是在' http://localhost/static/css/my.css '中注意到了.我怎么去那里?
我像这样跑了collectstatic:
C:\root\workspace\mywebapp\src\mywebapp>c:\Python27\python.exe manage.py collectstatic
You have requested to collect static files at the destination location as specified in your settings file.
This will overwrite existing files.
Are you sure you want to do this?
Type 'yes' to continue, or 'no' to cancel: yes
Copying 'c:\root\workspace\mywebapp\src\mywebapp\css_demo\static\css\my.css' …Run Code Online (Sandbox Code Playgroud) 我在 Windows XP 上使用 Tomcat 7。
%TOMCATDIR%/webapps/myapplication。localhost:8080/myapplication当我的服务器目录中的文件发生更改时,不会反映出来:
无论我尝试重新加载文件多少次,甚至向其中添加查询字符串(img.jpg?timestamp=...)都会发生上述情况。
在%TOMCATDIR%/conf/context.xml我设置了各种指令来禁用服务器端缓存:
<?xml version='1.0' encoding='utf-8'?>
<Context antiResourceLocking="true" cachingAllowed="false" cacheMaxSize="1" cacheTTL="1">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
Run Code Online (Sandbox Code Playgroud)
怎么了?
我目前有一个实时的Symfony2.4应用程序,它也链接到我们服务器上的一个目录(称为"指南"),该目录位于"web"文件夹下.此文件夹中的文件是使用外部程序自动生成的,由我们公司的其他部门生成普通的html文件.
最初我们将这些文件向公众开放,但是如果用户登录到应用程序,我们只想使它们可访问.我们已经设置了站点来处理登录过程等等,我只是无法弄清楚如何通过Symfony路由静态文件,以便我可以让它使用安全过程来检查用户是否有权查看文件.
我知道Symfony已经设置好,静态文件会自动提供,所以我修改了htaccess文件以包含这个:
凡是是一个文件,不是在"指南"目录应该只得到服务.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !/guides/
RewriteRule .? - [L]
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建一个路径,可以捕获来自该目录的所有URL并通过一个特殊的控制器,我可以检查授权用户,如果不好则重定向到登录,或者如果好的话显示实际页面.
support_guides:
path: /guides/{the-rest}
defaults: { _controller: MillenniumSIMeevoSupportBundle:HelpGuide:show }
Run Code Online (Sandbox Code Playgroud)
htaccess似乎有用(我认为),因为它不会尝试直接提供页面,但现在我只是得到了Symfony 404页面.
所以我正在玩Owin和Katana,我想在我的公共文件夹中提供静态文件.
我有一个带有样式表和脚本文件夹的Content文件夹.
我的创业公司:
public void Configuration(IAppBuilder app)
{
#if DEBUG
//when things go south
app.UseErrorPage();
#endif
// Remap '/' to '.\public\'.
// Turns on static files and public files.
app.UseFileServer(new FileServerOptions()
{
RequestPath = PathString.Empty,
FileSystem = new PhysicalFileSystem(@".\public"),
});
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我浏览到localhost:8861 /我去我公共文件夹中的index.html文件.没关系.但我也可以浏览我想要阻止的localhost:8861/Content/style.css.应该可以在公用文件夹中访问用户需要的所有内容.其余的都应该被阻止.
我怎样才能做到这一点?
我正在开发一个包含一些静态文件(配置和html模板)的小型Web应用程序:
??? Dockerfile
??? manifest.json
??? session
? ??? config.go
? ??? handlers.go
? ??? restapi_client.go
??? templates
? ??? header.tmpl
? ??? index.tmpl
??? webserver.go
Run Code Online (Sandbox Code Playgroud)
例如,代码中的模板是使用本地路径发现的(这是一个好习惯吗?):
func init() {
templates = template.Must(template.ParseGlob("templates/*.tmpl"))
}
Run Code Online (Sandbox Code Playgroud)
Docker容器用于应用程序部署.正如您在中看到的Dockerfile,我必须复制/go/bin目录中的所有静态文件:
FROM golang:latest
ENV PORT=8000
ADD . /go/src/webserver/
RUN go install webserver
RUN go get webserver
# Copy static files
RUN cp -r /go/src/webserver/templates /go/bin/templates
RUN cp -r /go/src/webserver/manifest.json /go/bin/manifest.json
EXPOSE $PORT
ENTRYPOINT cd /go/bin && PORT=$PORT REDIRECT=mailtest-1.dev.search.km /go/bin/webserver -manifest=manifest.json …Run Code Online (Sandbox Code Playgroud) 默认情况下,ManifestStaticFilesStorage仅在时返回带有哈希值的网址DEBUG=False。我希望我的开发环境尽可能接近生产环境,但是在开发过程中,我确实需要将debug设置为False。有没有办法告诉ManifestStaticFilesStorage总是给我带哈希的网址?
我在我的@home网络服务器上使用https://github.com/ebekker/ACMESharp作为我的SSL(它是免费的!:O).这是非常手动的,但在维基上注意到它提到了https://github.com/Lone-Coder/letsencrypt-win-simple上的另一个项目,这是一个用于自动申请,下载和安装SSL的GUI证书到您的网络服务器.
GUI用于验证域的方法是您的,通过创建一个随机命名的文件,其中包含一个随机的文本字符串,其中[webroot]/.well-known/[randomFile]包含扩展名.使用.dotnetcore应用程序在此[webroot]上运行,即使遵循IIS下更改"处理程序映射"的说明,我也无法提供该文件.
看起来我可以通过直接导航到他们来提供文件[webRoot]/wwwroot/[whatever]- 所以为什么我不能进入[webroot]/.well-known/[randomFile]?
有人知道解决这个问题吗?我可以删除.netcore应用程序,然后运行SSL证书安装,但这个安装需要每2-3个月进行一次,因为它是手动的,我更愿意弄清楚如何以正确的方式做到这一点.
我的文件夹结构/src/app/some-module/some-component和src/public/images/user.png.现在,当我想要在我的某个组件中展示一个图像时,我必须给出一条路径,../../../public/images/user.png一旦图像数量增加,它似乎过于天真和浪费.
我们是否在angular2中有一个路由机制或相对路径来提供静态文件.我正在使用Angular2和webpack.
我想用Gatsby创建一个静态生成的站点.这一切都很好,但我希望有适当的身份验证和授权,因为这是一个内部网站 - 它只能由我公司的人员访问.我想到了这一点,如果没有一些服务器组件,在没有某种后端的情况下安全地验证用户是不可能的(?).我以为我可以使用ASP.NET Core来提供静态文件,并在这些静态文件前面进行Google(for Work)身份验证和授权.
看起来StaticFileHandler 它不支持设计授权,因为它只负责提供可公开访问的静态文件.我设法通过使用Authorize我的root操作上的属性(听取'/')来获得Google身份验证,并且具有发布的登录操作,Challenge并且用户将被重定向到Google进行身份验证.进一步阅读处理静态文件的文档说:
静态文件模块不提供授权检查.它提供的任何文件,包括wwwroot下的文件都是公开的.根据授权提供文件:
- 将它们存储在wwwroot之外以及静态文件中间件可访问的任何目录中
- 通过控制器操作提供服务,返回应用授权的FileResult
所以现在我Index对我的动作HomeController看起来像这样:
[Authorize]
public IActionResult Index()
{
// TODO: Return static files based on incoming requested path.
return View();
}
Run Code Online (Sandbox Code Playgroud)
我对这个解决方案不是很满意.我应该使用中间件而不是使用MVC吗?这甚至是正确的方法吗?有没有更好的方法来做到这一点?