我有一个具有以下结构的Django项目: 根 视频 静态的 模板
并且settings.py中的STATIC_URL设置为STATIC_URL ='/ static /'
我设法使用pyinstaller从manage.py创建一个Windows可执行文件。我可以启动Django服务器,但我无法弄清楚静态文件的放置位置。
当我第一次启动服务器时,它也找不到模板,它在以下位置搜索它们:'root \ django \ contrib \ admin \ templates \ videos \'我将模板复制到此文件夹并且工作正常。但我无法弄清楚静态文件的放置位置。我尝试将它们放在'root \ django \ contrib \ admin \ static'中以重新创建原始结构。但它似乎并没有在那里搜索它们......
任何人都知道静态文件应该去哪里?或者如何定义捆绑的pyinstaller exe将查找它们的位置?
答案 0 :(得分:2)
我想我想通了这一点。和你一样,我遇到了同样的问题,我可以使用 pyinstaller 打包和构建我的 Django 项目,但是从构建的可执行文件运行项目时找不到静态文件。当我使用 manage.py 运行项目时,一切正常,但这是一个令人头疼的问题。
对我有用的解决方案是运行 collectstatic 函数,然后从该目录而不是 app/static/app 目录提供我的静态文件。
如果您不熟悉 collectstatic,它实际上会在您的项目目录中搜索应用中的所有静态文件,并将它们放在您在设置文件中指定的顶级目录中的文件夹中。
Here's a link to its documentation.
现在我的顶级目录如下所示。
site
app
admin.py
apps.py
models.py
views.py
site
asgi.py
settings.py
urls.py
wsgi.py
media
media files
staticfiles
static files I want to serve (css, js, etc)
在我的设置文件中,我指定了这样的静态文件设置...
STATIC_URL = '/staticfiles/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'app\\static\\app')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
然后在我的 urls.py 文件中,我包含了这样的 staticfiles 目录... (请注意,这是主站点目录中的 urls.py 文件,而不是应用程序目录中的 urls.py 文件,如果您在那里创建了)
from django.contrib import admin
from django.conf import settings
from django.urls import include, path
from django.conf.urls.static import static
urlpatterns = [
path('', include('app.urls')),
path('admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
在我的规范文件中,我能够像这样添加文件夹...
datas=[('..\\site\\staticfiles\\', '.\\staticfiles\\')]
然后在我的 html 文件中,我可以使用这样的静态文件...
<script src="{% static 'app/static.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'app/static.css' %}">
希望这对遇到相同问题的人有所帮助。另外提醒一下,请务必在构建之前运行 collectstatic,尤其是在您修改或更改了任何静态文件的情况下。
python manage.py collectstatic
干杯!
答案 1 :(得分:0)
首先确保django.contrib.staticfiles
中的INSTALLED_APPS
中包含settings.py
。然后必须在settings.py
插入例如:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
我希望在BASE_DIR
的顶部定义settings.py
。 BASE_DIR
指向您的manage.py
文件所在的文件夹。因此,如果您在同一个目录中有静态文件,那么您可以保留上面的设置。如果没有,让我们在同一个目录中说,manage.py
旁边有一个名为app
的文件夹,那么您的设置应如下所示:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "app/static"),
]
你甚至可以跑:
python manage.py collectstatic
将管理静态文件放入静态目录。
希望有所帮助。
答案 2 :(得分:0)
这似乎与PyInstaller打包的python脚本查找静态文件有关。它们放置在临时文件夹中,需要通过绝对路径进行访问。查看以下问题:Bundling data files with PyInstaller (--onefile)