我有一个关于新的Django 1.3静态文件框架的一般性问题.
我非常喜欢Django 1.3中引入的新Django静态文件功能.通常,我设置STATIC_URL ="/ static /"并在我的模板中输入{{STATIC_URL}}模板标签.开发服务器自动提供静态文件的方式非常棒,我的所有内容都按预期提供.
The {{ STATIC_URL }} would be substituted in the template and might serve up files like this...
example.com/static/css/master.css
example.com/static/images/logo.png
example.com/static/js/site.js
Run Code Online (Sandbox Code Playgroud)
但是,我正在使用旧网站,其中静态媒体安装在网址根目录.例如,静态URL的路径可能如下所示:
example.com/css/master.css
example.com/images/logo.png
example.com/js/site.js
Run Code Online (Sandbox Code Playgroud)
它不使用"静态"url命名空间.
我想知道是否有办法让新的静态文件功能不使用静态命名空间并提供上面的URL,但仍然保留了新的静态文件框架(开发服务器提供的collectstatic,静态文件等)的好处.我尝试设置STATIC_URL =""和STATIC_URL ="/",但似乎都没有达到预期的效果.
有没有办法配置静态文件来提供没有命名空间的静态文件?谢谢你的考虑.
根据Django的文档:"将静态资产与用户上传的文件一起放在MEDIA_ROOT中是很常见的,并在MEDIA_URL上提供它们."
这是否意味着每个人都可以访问其他人上传的文件?这不安全吗?
我正在运行django 1.4.1应用程序.
我不知道,只包括django.contrib.staticfiles到INSTALLED_APPS您的设置足以让静态文件服务,而settings.DEBUG为真,即,您不必手动添加任何东西到您的网址文件.
我也注意到这绕过了django中间件.有谁知道这是怎么发生的?
我刚创建了一个空白的新项目,我的views.py:
from django.http import HttpResponse
def index(request):
html = '<html><body>Logo: <img src="/static/logo.gif"></body></html>'
return HttpResponse(html)
Run Code Online (Sandbox Code Playgroud)
我的urls.py:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'testapp.views.index', name='home'),
)
Run Code Online (Sandbox Code Playgroud)
我的settings.py指定了一个目录来查找静态文件,它还添加了以下内容:
MIDDLEWARE_CLASSES = (
'testapp.middleware.TestMiddleware',
...
)
Run Code Online (Sandbox Code Playgroud)
使用此中间件:
from __future__ import print_function
class TestMiddleware(object):
def process_request(self, request):
print("[REQUEST]", request.path)
Run Code Online (Sandbox Code Playgroud)
当我提出请求时,会打印出来:
[REQUEST] /
[18/Jan/2013 15:30:27] "GET / HTTP/1.1" 200 60
[18/Jan/2013 15:30:27] "GET /static/logo.gif HTTP/1.1" 200 2190
[REQUEST] /favicon.ico
Run Code Online (Sandbox Code Playgroud)
它与测试服务器的启动方式有关吗?
使用django dev服务器(1.7.4),我想为它所服务的所有静态文件添加一些标头.
看起来我可以传递自定义视图django.conf.urls.static.static,如下所示:
if settings.DEBUG:
from django.conf.urls.static import static
from common.views.static import serve
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL,
document_root=settings.STATIC_ROOT, view=serve)
Run Code Online (Sandbox Code Playgroud)
而且common.views.static.serve看起来是这样的:
from django.views.static import serve as static_serve
def serve(request, path, document_root=None, show_indexes=False):
"""
An override to `django.views.static.serve` that will allow us to add our
own headers for development.
Like `django.views.static.serve`, this should only ever be used in
development, and never in production.
"""
response = static_serve(request, path, document_root=document_root,
show_indexes=show_indexes)
response['Access-Control-Allow-Origin'] = '*'
return response …Run Code Online (Sandbox Code Playgroud) 所以我正在构建一个Django渐进式Web应用程序,使用服务工作者提供离线支持.
根据谷歌的文档,sw.js文件应该是应用程序URL的根目录:
您需要执行此操作,因为服务工作者的范围(ServiceWorker将加载的URL集)由其所在的目录定义.
目前,我正在从http://example.com/static/文件夹中提供所有静态资源.但我需要在以下网址上提供此特定文件:http://example.com/sw.js.
知道我怎么能做到这一点?我可以制定一个特定的nginx规则来执行此重定向,但我不知道这是否是最干净的方法.也许这个设置应该存在于urls.py中?
注意:我已经看到这个问题建议使用static()方法django.conf.urls.static.但是django的文档说静态方法仅供开发使用,对我不利.
注意(2):我想我可以更改STATIC_URL设置,但我对从/ static目录提供的文件感到满意.我只希望这个文件位于url的根目录下.
我的配置如下:
STATIC_URL = '/static/'
MEDIA_URL = '/static/media/'
Run Code Online (Sandbox Code Playgroud)
自从我将 django 2.1 升级到 2.2 后,我得到:
"runserver can't serve media if MEDIA_URL is within STATIC_URL."
django.core.exceptions.ImproperlyConfigured: runserver can't serve media if MEDIA_URL is within STATIC_URL.
Run Code Online (Sandbox Code Playgroud)
我理解错误。我的问题是“为什么不”?您希望媒体作为 static 的子目录有非常充分的理由。
此外,在 2.2 发行说明中零提及此重大更改:https : //docs.djangoproject.com/en/3.0/releases/2.2/
大家好我无法解决这个问题:如果我将DEBUG变为False,我就无法运行manage.py runserver:
CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False
Run Code Online (Sandbox Code Playgroud)
然后,假设我向ALLOWED_HOSTS添加了一些内容:
ALLOWED_HOSTS = ['*']
or
ALLOWED_HOSTS = ['localhost']
or
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
Run Code Online (Sandbox Code Playgroud)
现在,我可以做'manage.py runserver',但静态文件不起作用.奇怪的.
如果我将DEBUG转为True,那么它将ALLOWED_HOSTS设置为nothing,localhost或*.所以,我猜这个问题与DEBUG有关.我不明白.
我可以通过管理页面上传图像,但是当我导航到django生成的网址时,无法找到图像.(404错误)文件正在上传到文件夹:
project_root/media/eventbanner/1/
Run Code Online (Sandbox Code Playgroud)
我尝试了多种解决方案,但似乎没有一种方法适用于我的情况.Django 1.10正在Ubuntu 16.04上运行.
我得到的网址是:
http://localhost:8000/media/eventbanner/1/banner_image.jpg
Run Code Online (Sandbox Code Playgroud)
媒体根文件夹位于:
/home/username/xxx/xxx/project_name/media
Run Code Online (Sandbox Code Playgroud)
HTML文件中的代码:
<div class="banner-image">
<img src="{{ event.eventbanner.banner_image.url }}"/>
</div>
Run Code Online (Sandbox Code Playgroud)
url.py代码:
from django.conf.urls import url, include
from django.contrib import admin
from . import views
from django.conf import settings
from django.conf.urls.static import static
app_name = 'events'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^details/(?P<event_id>[0-9]+)/$', views.details, name='details'),
url(r'^details/(?P<event_id>[0-9]+)/addcomment/$', views.add_comment, name='add_comment'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS =[os.path.join(BASE_DIR, 'static'),]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
models.py
def validate_only_one_instance(obj):
model = obj.__class__
if (model.objects.count() …Run Code Online (Sandbox Code Playgroud) 我已经完成了所有其他答案,但似乎无法为我提供任何帮助。我正在学习教程并尝试将我的master分支推送到 heroku 并得到错误You're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path。我正在使用 Django 2.0 和 python 3.6.3。完整的追溯:
remote: -----> $ python manage.py collectstatic --noinput
remote: Traceback (most recent call last):
remote: File "manage.py", line 15, in <module>
remote: execute_from_command_line(sys.argv)
remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
remote: utility.execute()
remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
remote: self.fetch_command(subcommand).run_from_argv(self.argv)
remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
remote: self.execute(*args, **cmd_options)
remote: File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line …Run Code Online (Sandbox Code Playgroud) 我正在 heroku 上部署一个 Django 应用程序。
在我的设置模块中,我已配置为托管静态文件,例如
STATIC_ROOT = os.path.join(BASE_DIR, 'static_my_project')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static_my_project')
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn', 'media_root')
Run Code Online (Sandbox Code Playgroud)
和 urls.py
urlpatterns = urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)
但是在部署到heroku时,它给出了错误
SystemCheckError: System check identified some issues:
ERRORS:
?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
Run Code Online (Sandbox Code Playgroud)