这三个静态网址有什么区别?
我不确定我是否正确,我使用MEDIA_ROOT
存储我上传的照片(通过models.ImageField()
)
但是,我为管理员和admin.py
创建了一个JS脚本。我将媒体定义如下:
....
class Media:
js = ('/admin/custom.js', )
和我的settings.py
:
....
STATIC_ROOT = "/home/user/project/django1/top/listing/static"
我将custom.js
添加到STATIC_ROOT/admin/custom.js
,但它无效。投掷404未找到错误。
然后我将STATIC_ROOT
更改为STATICFILES_DIRS
,然后就可以了!
....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"
所以,我不明白这里发生了什么。事实上,我只是不明白STATIC_ROOT
和STATICFILES_DIRS
之间的区别。
目前我正在通过virtualenv在我的机器上测试Django,尚未部署,是STATIC_ROOT
无法正常工作的原因吗?
答案 0 :(得分:71)
您可以在Django documentation中找到这些设置。以下是我自己的文档定义和引文:
MEDIA_ROOT
是使用FileField
上传文件的文件夹。
将保留user-uploaded files的目录的绝对文件系统路径。
STATIC_ROOT
是使用manage.py collectstatic
collectstatic
将收集静态文件以进行部署的目录的绝对路径。如果
staticfiles
contrib app已启用(默认),collectstatic
管理命令将收集静态文件到此目录中。有关使用的更多详细信息,请参阅有关管理静态文件的方法。
STATICFILES_DIRS
是Django将搜索除安装的每个应用的static
文件夹之外的其他静态文件的文件夹列表。
此设置定义了在启用
FileSystemFinder
查找程序时staticfiles应用程序将遍历的其他位置,例如如果您使用collectstatic
或findstatic
管理命令或使用静态文件服务视图。
在您的设置中,您应该:
MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )
...其中:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
现在默认为Django settings.py
。
答案 1 :(得分:63)
STATIC_ROOT
在开发过程中无用,只需部署即可。
在开发过程中,STATIC_ROOT
什么也没做。你甚至不需要设置它。 Django在每个应用程序的目录(myProject/appName/static
)中查找静态文件并自动提供。
这是manage.py runserver
DEBUG=True
时所做的魔术。
当您的项目上线时,情况会有所不同。很可能你会使用Django提供动态内容,静态文件将由Nginx提供。为什么?因为Nginx非常高效,可以减少Django的工作量。
这是STATIC_ROOT
变得方便的地方,因为Nginx对你的django项目一无所知,也不知道在哪里找到静态文件。
因此,您设置STATIC_ROOT = '/some/folder/'
并告诉Nginx在/some/folder/
中查找静态文件。然后运行manage.py collectstatic
,Django会将您拥有的所有应用中的静态文件复制到/some/folder/
。
STATICFILES_DIRS
用于包含collectstatic
要查找的其他目录。例如,默认情况下,Django无法识别/myProject/static/
。所以你可以自己加入。
STATIC_URL = '/static/'
if not DEBUG:
STATIC_ROOT = '/home/django/www-data/site.com/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/'),
]
答案 2 :(得分:19)
STATICFILES_DIRS
和STATIC_ROOT
STATICFILES_DIRS
可以包含带有静态文件的其他目录(不一定是app目录),当您运行collectstatic
时,这些静态文件将被收集到您的STATIC_ROOT中。然后,这些静态文件将由您的Web服务器提供,它们将从您的STATIC_ROOT提供。
如果您希望提供STATIC_ROOT中的文件,那么您需要将这些文件移到另一个目录并将其他目录放在STATICFILES_DIRS
中。您的STATIC_ROOT
目录应为空,并且应将所有静态文件收集到该目录中。
MEDIA_ROOT
媒体文件,所有上传的文件都在其中。
示例:图像,文件
答案 3 :(得分:0)
class Media:
js = ('/admin/custom.js', )
<块引用>
但它不起作用。抛出 404 not found 错误。
404 错误的部分原因是文件路径中的前导斜杠。