Python 更多Django静态404问题-与余烬配对
我看过很多关于Django静态文件问题的帖子。不幸的是,他们似乎都帮不了我。我的django管理css很好,但是静态文件给了我一个404错误。以下是我的问题的描述: 在settings.py中:Python 更多Django静态404问题-与余烬配对,python,django,ember.js,Python,Django,Ember.js,我看过很多关于Django静态文件问题的帖子。不幸的是,他们似乎都帮不了我。我的django管理css很好,但是静态文件给了我一个404错误。以下是我的问题的描述: 在settings.py中: STATIC_URL = '/static/' STATIC_ROOT = '/Users/me/develop/ember/myproj/static/' from os import pardir from os.path import abspath, dirname, join # Get
STATIC_URL = '/static/'
STATIC_ROOT = '/Users/me/develop/ember/myproj/static/'
from os import pardir
from os.path import abspath, dirname, join
# Get the root directory of our project
BASE_DIR = abspath(join(dirname(__file__), pardir))
# Add our project static folder for discovery
STATICFILES_DIRS = (
# /Users/me/develop/myproject/myproject/static/
join(BASE_DIR, 'myproject', 'static'),
)
# /Users/me/develop/myproject/static/
STATIC_ROOT = join(BASE_DIR, 'static')
在URL.py中:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
我的项目目录:
> static
> myproj
> app
> templates
> ember.hbs
> img
> test.jpg
在我的ember.hbs
中,我引用了test.jpg
,但是我得到了一个404错误。这很奇怪,因为我可以用:file:///Users/me/develop/ember/proj/static/myproj/img/test.jpg
我不知道如何解决这个问题,我已经尝试使用这里提到的STATICFILES\u DIRS
方法:
但似乎一切都不起作用
提前谢谢
更多信息:Django 1.8和Ember CLI。
我在static
dir中主持ember项目。我正在运行
python manage.py runserver
并在端口8000上运行django,同时运行ember s
并在端口4200上运行应用程序。我正在使用CORS headers()来允许在开发时进行跨站点调用。静态文件将在您创建的“应用程序”(在已安装的应用程序中找到)或在静态文件\u DIRS
中指定的其他目录中找到
假设我做到了:
django-admin.py启动项目myproject
然后:
cd myproject
./manage.py startapp myapp
mkdir myapp/static
mkdir myproject/static
会给你一个目录结构,看起来像
/Users/me/develop/myproject/
> myapp/
> migrations/
> static/
> __init__.py
> admin.py
> models.py
> tests.py
> views.py
> myproject/
> static/
> __init__.py
> settings.py
> urls.py
> wsgi.py
> manage.py
然后在settings.py中将“myapp”添加到已安装的应用程序中
在这种结构中,myapp/static/
文件将由Django自动发现,因为它是一个安装了静态目录的应用程序。但是,myproject/static/
文件不会被自动发现,因为“myproject”不在INSTALLED\u APPS
中(而且不应该是)
这是因为默认的STATICFILES\u FINDERS
设置,即:
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'django.contrib.staticfiles.finders.FileSystemFinder',
]
第一个查找程序,AppDirectoriesFinder
,扫描所有安装的应用程序的目录,并发现它们可能包含的任何“静态”文件夹
第二个查找程序,FileSystemFinder
,扫描您在STATICFILES\u DIRS
中指定的额外目录,默认情况下,该目录为空列表
因此,如果您希望发现/Users/me/developer/myproject/myproject/static/中的那些文件(您可能会这样做),可以将其添加到settings.py中:
STATIC_URL = '/static/'
STATIC_ROOT = '/Users/me/develop/ember/myproj/static/'
from os import pardir
from os.path import abspath, dirname, join
# Get the root directory of our project
BASE_DIR = abspath(join(dirname(__file__), pardir))
# Add our project static folder for discovery
STATICFILES_DIRS = (
# /Users/me/develop/myproject/myproject/static/
join(BASE_DIR, 'myproject', 'static'),
)
# /Users/me/develop/myproject/static/
STATIC_ROOT = join(BASE_DIR, 'static')
现在,所有这些都与STATIC\u ROOT
分开,在这里,当您运行/manage.py collectstatic
时,所有静态文件都被复制。对于刚开始的项目,这通常位于项目根文件夹:/Users/develop/me/myproject/static中/
因此,我们将在settings.py中添加:
STATIC_URL = '/static/'
STATIC_ROOT = '/Users/me/develop/ember/myproj/static/'
from os import pardir
from os.path import abspath, dirname, join
# Get the root directory of our project
BASE_DIR = abspath(join(dirname(__file__), pardir))
# Add our project static folder for discovery
STATICFILES_DIRS = (
# /Users/me/develop/myproject/myproject/static/
join(BASE_DIR, 'myproject', 'static'),
)
# /Users/me/develop/myproject/static/
STATIC_ROOT = join(BASE_DIR, 'static')
但这只在生产中使用,它是一种将所有静态资产编译成单个点的方法,然后使用服务器(例如NGINX)指向/静态/指向它
在开发过程中,您可以完全跳过collectstatic,让Django动态地发现和服务您的静态资产。Django在Django.contrib.staticfiles.views.service
中提供了一个“服务”视图来执行此操作
在您的URL.py中尝试以下操作:
from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.staticfiles.views import serve
admin.autodiscover()
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
]
if settings.DEBUG:
urlpatterns += [
url(r'^static/(?P<path>.*)$', serve),
]
来自django.conf导入设置的
从django.conf.url导入包括
从django.contrib导入管理
从django.contrib.staticfiles.views导入服务
admin.autodiscover()
URL模式=[
url(r“^admin/”,包括(admin.site.url)),
]
如果设置为.DEBUG:
URL模式+=[
url(r'^static/(?P.*),serve),
]
在您的示例中,您要求Django提供来自STATIC\u ROOT
的文件,这也很好,但要求您首先运行/manage.py collectstatic
,并且每次您的静态资产发生更改时都会遇到麻烦。Ember和Django确实不应该位于同一个项目中。它们是使用不同工具的完全不同的框架
将您的Django项目视为服务于API的后端应用程序。将您的Ember项目视为可能会使用您的API的许多客户机之一。其他可能包括移动应用程序、合作伙伴服务等
当我启动一个将使用Django和Ember的新项目时,我启动了一个名为“myproject”的Django项目:
另外,还有一个名为“myproject web”的余烬项目:
在开发中,我将在终端中打开两个选项卡
第一个选项卡:
cd myproject
./manage.py runserver
第二个选项卡:
cd myproject-web
ember serve
在生产中,我将有两个不同的服务器,一个位于app.myproject.com,用于Django应用程序,另一个位于myproject.com,用于Ember应用程序
稍后,我可能会在一个名为“myproject ios”的存储库中启动一个Swift项目,并启动一个名为“myproject android”的Java项目。你明白了。为了将静态文件提供给django项目,你只需要将这些行添加到`settings.py
STATIC_URL = '/static/'
STATIC_PATH = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
STATIC_PATH,
)
然后在项目的主要结构中,口述需要是
>Project_dir
>App_dir
>static_dir
>templates
>manage.py
将css、js和其他静态内容放入静态目录中您是否在html中使用/static/myproj/img/test.jpg加载此文件?1)当django项目(从视图源获取完整路径)时,该test.jpg的URL是什么?2)您是否使用Apache或其他服务器运行django?是@cafebabe1991,我在我的ember.hbs中使用的正是这个。@KrishnaSunuwar 1)来源的url:“NetworkError:404 Not Found-”2)我正在运行django项目,并使用CORS Header()允许对我的开发环境进行跨服务器调用。dustin-就是那个url吗?或者我应该使用路径指向img
目录吗?我这样问是因为很不幸,它没有起到任何作用。PS-你的东西的超级粉丝!实际上,您的问题可能是将静态文件放在哪里。我会更新我的答案。谢谢dustin,如果有帮助的话,我已经在上面添加了更多信息。好的,我只是详细说明了更多