所以这很尴尬.我有一个应用程序,我把它放在一起,Flask
现在它只是提供一个静态HTML页面,其中包含一些CSS和JS的链接.我无法在文档Flask
中找到返回静态文件的位置.是的,我可以使用,render_template
但我知道数据没有模板化.我曾经想过send_file
或者url_for
是对的,但是我无法让它们发挥作用.与此同时,我正在打开文件,阅读内容,并Response
使用适当的mimetype来装配:
import os.path
from flask import Flask, Response
app = Flask(__name__)
app.config.from_object(__name__)
def root_dir(): # pragma: no cover
return os.path.abspath(os.path.dirname(__file__))
def get_file(filename): # pragma: no cover
try:
src = os.path.join(root_dir(), filename)
# Figure out how flask returns static files
# Tried:
# - render_template
# - send_file
# This should not be so non-obvious
return open(src).read()
except IOError as exc:
return str(exc)
@app.route('/', methods=['GET'])
def metrics(): # pragma: …
Run Code Online (Sandbox Code Playgroud) 我正在配置一个Django项目,该项目使用服务器文件系统来存储应用程序静态文件(STATIC_ROOT
)和用户上传的文件(MEDIA_ROOT
).
我现在需要在亚马逊的S3上托管所有内容,所以我为此创建了一个存储桶.使用django-storages
与boto
存储后端,我设法收集静态上传到S3斗:
MEDIA_ROOT = '/media/'
STATIC_ROOT = '/static/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'KEY_ID...'
AWS_SECRET_ACCESS_KEY = 'ACCESS_KEY...'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)
然后,我遇到了一个问题:MEDIA_ROOT
并且STATIC_ROOT
没有在存储桶中使用,因此存储桶根目录包含静态文件和用户上载的路径.
那么我可以设置:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)
并在模板中使用这些设置,但在S3中存储时,静态/媒体文件没有区别django-storages
.
怎么做到这一点?
谢谢!
django amazon-s3 static-files django-settings django-storage
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if (-f $request_filename) {
access_log off;
expires 30d;
break;
}
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8080; # backend server listening
break;
}
}
Run Code Online (Sandbox Code Playgroud)
上面将使用Nginx直接提供所有现有文件(例如Nginx只显示PHP源代码),否则将请求转发给Apache.我需要从规则中排除*.php文件,以便*.php的请求也传递给Apache并进行处理.
我希望Nginx处理所有静态文件和Apache来处理所有动态的东西.
编辑:有白名单的方法,但它不是很优雅,看到所有这些扩展,我不希望这样.
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
access_log off;
expires 30d;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:在使用nginx的更新版本try_files
,而不是http://wiki.nginx.org/HttpCoreModule#try_files
这可能是一个愚蠢的问题,但它并没有点击我的脑袋.
在Django中,惯例是将您的应用程序特有的所有静态文件(即css,js)放入名为static的文件夹中.所以结构看起来像这样:
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
Run Code Online (Sandbox Code Playgroud)
在mysite/settings.py我有:
STATIC_ROOT = 'staticfiles'
Run Code Online (Sandbox Code Playgroud)
所以当我运行命令时:
python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)
它在根级别创建一个名为staticfiles的文件夹(与myapp /目录相同)
这有什么意义?是不是只创建了我所有静态文件的副本?
我已经看过几个关于这个问题的帖子,但没有找到我的解决方案.
我正在尝试在Django 1.3开发环境中提供静态文件.
这是我的设置
...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'/static/',
)
...
Run Code Online (Sandbox Code Playgroud)
我的urls.py
urlpatterns = patterns('',
...
url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root', settings.STATIC_ROOT}
),
...
);
Run Code Online (Sandbox Code Playgroud)
我的/ home/glide/Documents/django/cbox/static /目录就像
css
main.css
javascript
image
Run Code Online (Sandbox Code Playgroud)
尝试访问http://127.0.0.1:8000/static/css/main.css时出现404错误.
我是否必须单独指定css,javascript和图像的模式?
我runserver
在我的本地计算机(Mac OS X)上运行Django的开发服务器()并且无法加载CSS文件.
以下是settings.py中的相关条目:
STATIC_ROOT = '/Users/username/Projects/mysite/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'/Users/thaymore/Projects/mysite/cal/static',
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
INSTALLED_APPS = (
# other apps ...
'django.contrib.staticfiles',
)
Run Code Online (Sandbox Code Playgroud)
在我的views.py中,我正在请求上下文:
return render_to_response("cal/main.html",dict(entries=entries),context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
在我的模板中{{ STATIC_URL }}
正确呈现:
<link type="text/css" href="{{ STATIC_URL }}css/main.css" />
Run Code Online (Sandbox Code Playgroud)
变成:
<link type="text/css" href="/static/css/main.css"/>
Run Code Online (Sandbox Code Playgroud)
这是文件实际所在的位置.我还跑去collectstatic
确保收集所有文件.
我的urls.py中还有以下几行:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
Run Code Online (Sandbox Code Playgroud)
我是Django的新手,所以我可能会错过一些简单的东西 - 感谢任何帮助.
我的.html
服务器上有几组静态文件,我想使用nginx直接提供它们.例如,nginx应该提供以下模式的URI:
www.mysite.com/public/doc/foo/bar.html
Run Code Online (Sandbox Code Playgroud)
使用.html
位于的文件/home/www-data/mysite/public/doc/foo/bar.html
.您可以将其foo
视为集名称,以及bar
此处的文件名.
我想知道下面的nginx配置是否可以完成这项工作:
server {
listen 8080;
server_name www.mysite.com mysite.com;
error_log /home/www-data/logs/nginx_www.error.log;
error_page 404 /404.html;
location /public/doc/ {
autoindex on;
alias /home/www-data/mysite/public/doc/;
}
location = /404.html {
alias /home/www-data/mysite/static/html/404.html;
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,模式的所有请求/public/doc/.../....html
都将由nginx处理,如果找不到任何给定的URI,www.mysite.com/404.html
则返回默认值.
我正在尝试建立一个特定静态文件的路由,但我正在尝试的所有内容都以错误结束.
我做了3次不同的尝试:
1.
GET /file staticFile:/public/html/file.html
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
Compilation error
string matching regex `\z' expected but `:' found
Run Code Online (Sandbox Code Playgroud)
2.
GET /file controllers.Assets.at(path="/public/html", "file.html")
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
Compilation error
Identifier expected
Run Code Online (Sandbox Code Playgroud)
3.
GET /file controllers.Assets.at(path="/public/html", file="file.html")
Run Code Online (Sandbox Code Playgroud)
我得到的错误:(这是最奇怪的)
Compilation error
not enough arguments for method at: (path: String, file: String)play.api.mvc.Call. Unspecified value parameter file.
Run Code Online (Sandbox Code Playgroud)
关于第3个错误的奇怪部分是它被抛出在以下行的不同文件(app/views/main.scala.html)中:
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
Run Code Online (Sandbox Code Playgroud)
所有这些方法都可以在stackoverflow上的官方文档和/或线程中找到.我在这里错过了什么?
谢谢.
我的css,js,图像文件的请求正在通过ASP.NET管道提供.我认为IIS默认避免这种情况,但是我在Application_AuthenticateRequest
断点上看到了请求,并且不需要实际验证这些请求.我看到了改变这种行为的相互矛盾的方法 - 最好的方法是什么?
我目前正在我的app.js/server.js文件中提供所有我的HTML,如下所示:
app.get('/', function(req, res) {
res.render('index.html');
});
app.get('/about', function(req, res) {
res.render('about.html');
});
app.get('/projects', function(req, res) {
res.render('projects.html');
});
Run Code Online (Sandbox Code Playgroud)
我想如果我有15个以上的HTML页面,这可能不是调用它们的最佳方式.有没有更好的方法从另一个文件或位置提供服务,并使用导出或其他东西只能在app.js上调用一个函数或其他东西.它可能是路由的用途,但也许我不太了解它.
(添加了同一文件中的更多代码)
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/public');
// used below code to render html files
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'ejs');
app.use(express.favicon("public/img/favicon.ico"));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
Run Code Online (Sandbox Code Playgroud)