使用pyinstaller创建Django exe时静态文件的位置

时间:2016-08-28 15:53:09

标签: python django pyinstaller

我有一个具有以下结构的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将查找它们的位置?

3 个答案:

答案 0 :(得分:2)

我想我想通了这一点。和你一样,我遇到了同样的问题,我可以使用 pyinstaller 打包和构建我的 Django 项目,但是从构建的可执行文件运行项目时找不到静态文件。当我使用 manage.py 运行项目时,一切正常,但这是一个令人头疼的问题。

对我有用的解决方案是运行 collectstatic 函数,然后从该目录而不是 app/static/app 目录提供我的静态文件。

如果您不熟悉 collectstatic,它实际上会在您的项目目录中搜索应用中的所有静态文件,并将它们放在您在设置文件中指定的顶级目录中的文件夹中。

Here's how to run it.

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.pyBASE_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)