Django找不到静态文件夹中的文件

2 投票
2 回答
2260 浏览
提问于 2025-04-18 15:01

我想我漏掉了什么。

这是我的文件夹应该长的样子:

显然是带有所需图片的。

为了提高可移植性,我在代码中使用了动态路径。

settings.py 中的代码:

SETTINGS_DIR = os.path.dirname(__file__)

PROJECT_PATH = os.path.join(SETTINGS_DIR, os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)

TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'templates')
TEMPLATE_DIRS = (
    TEMPLATE_PATH,
)

STATIC_PATH = os.path.join(PROJECT_PATH,'static')
STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    STATIC_PATH,
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rango'

urls.py

from django.conf.urls import patterns, url
from rango import views

urlpatterns = patterns('',
        url(r'^$', views.index, name='index'),url(r'^rango/', views.about, name='about'))

views.py

def index(request):
    context = RequestContext(request)

    # Construct a dictionary to pass to the template engine as its context.
    # Note the key boldmessage is the same as {{ boldmessage }} in the template!
    context_dict = {'boldmessage': "I am bold font from the context"}

    # Return a rendered response to send to the client.
    # We make use of the shortcut function to make our lives easier.
    # Note that the first parameter is the template we wish to use.
    return render_to_response('rango/index.html', context_dict, context)
def about(request):
    return HttpResponse("Rango says: This is about page!<a href='../../'>Index</a>")

注意,图片是放在一个 HTML 模板中的。HTML 是正常加载的,但图片却没有显示。

<!DOCTYPE html>
{% load static %} <!-- New line -->
<html>
    <head>
        <title>Rango</title>
    </head>
    <body>
        <h1>Rango says...</h1>
        hello world! <strong>{{ boldmessage }}</strong><br />
        <a href="/rango/about/">About</a><br />
        <img src="{% static "rango.png" %}" alt="Picture of Rango" /> <!-- New line -->
    </body>
</html>

结果是什么呢?

图片返回了一个讨厌的 404 错误。

127.0.0.1:8000/static/rango.png 或者 manage.py findstatic rango.png 访问都会失败。

不过,从 file:///D:/tango_with_django_project/static/rango.png 访问却是成功的。

谢谢!

附加信息:

DEBUG=TRUE

我检查过 STATIC_PATH,文件确实指向了正确的路径 D:\tango_with_django_project\static

这可能是因为反斜杠和正斜杠的问题,但如果斜杠是问题的话,模板也应该会出错。

2 个回答

1

这个问题可能是因为找不到应用程序的目录。你可以在项目的 setting.py 文件中添加以下内容:

STATIC_URL = '/static/'

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
3

在实际使用中,静态文件应该由网络服务器来提供,而不是由Django自己来处理。这就是为什么默认情况下没有开启这个功能。

你需要告诉开发服务器,它必须提供静态文件。我觉得在你的 settings.py 文件中把 DEBUG=True 设置成这样就可以了。

你可能还需要在你的 urls.py 文件中添加一些内容。

from django.conf.urls import patterns, include, url
from django.conf import settings

from django.contrib import admin
admin.autodiscover()


urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'your_app.views.home', name='home'),


    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls))
)

if settings.DEBUG :
    urlpatterns += patterns('django.contrib.staticfiles.views',
        url(r'^static/(?P<path>.*)$', 'serve'),
    )

希望这些信息对你有帮助。

撰写回答