我正在开发一款django应用,其中包含从http://host/static提供的静态文件。
我有一个新的文件夹,里面装满了静态html / js / css,需要http://host/staff才能访问。
如何告诉django从该网址提供/ staff文件?
使用nginx或其他代理不是一种选择,也不会更改网址。
我能够通过添加urlpatterns += static('/staff/', document_root='staff')
使其部分有效,但这仅适用于Debug = True
。
答案 0 :(得分:1)
./manage.py runserver
是 Django 的开发服务器。它“神奇地”提供来自所有 <app>/static/
(如果您添加 STATICFILES_DIRS=
则来自更多位置)的静态文件。
它们在 STATIC_URL=
上可见,通常设置了 STATIC_URL = '/static/'
。
如果您需要其他网址,请将以下内容添加到 urls.py
中:
from django.conf.urls.static import static
urlpatterns = [
path(<url>, <function>),
] + static('/<otherurl>/', document_root='<path>/<otherstaticdir>/')
但是在生产中应该以不同的方式进行。您应该将所有 <app>/static/
和其他 STATICFILES_DIRS
中的静态文件收集到通过 STATIC_ROOT=
定义的单个目录中。
从那里像 Whitenoise 这样的 Django 工具可以为静态文件提供服务(在更改静态文件时注意缓存和缓存失效)。
或者nginx可以配置为不向gunicorn+django(或uwsgi+django)发送静态文件请求而是直接服务。
相同,即。 Whitenoise 或 Nginx,您可以连接到 <otherstaticdir>
上可访问的额外 <otherurl>
。
答案 1 :(得分:0)
修改自https://docs.djangoproject.com/en/2.1/ref/urls/#static:
staffImages = (small) => {
const photoURL = small ? photo.url.replace(new RegExp("(.*)" + 'lg'), "$1sm") : `${photo.url}`;
return (photos).map((photo, i) => small ? (
<GridPhotoContainer key={i}>
<Photo
className="Photo"
backgroundImage={photoURL}
openModal={() => this.openModal(i, false, true)}
/>
</GridPhotoContainer>
) : (
<Photo
key={i}
className="Photo"
backgroundImage={photoURL}
openModal={() => this.openModal(i, false, true)}
/>
)
)
}
renderStaffImages = (
<Media query="(max-width: 768px)">
{matches => (
<Grid className="Grid" marginTop={matches ? '0' : '3em'}>
{staffImages(matches)}
</Grid>
)
}
</Media>
)
ROOT是您要提供服务的文件夹的路径。它应该是操作系统上文件的绝对路径。
PATH是将在其中提供文件的路径。如果您的网站是https://example.com,并且您设置了from django.conf import settings
from django.conf.urls.static import static
PATH = '/custom-static-files/'
ROOT = '/var/www/html/custom-static-files/'
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(PATH, document_root=ROOT)
,则文件将以https://example.com/custom-static-files/