【问题标题】:Pyinstaller compiles but 404 error on Django Static javascript filesPyinstaller 在 Django 静态 javascript 文件上编译但出现 404 错误
【发布时间】:2018-06-22 19:31:02
【问题描述】:

我已设法编译我的应用程序,但每当它引用静态文件时,我的 javascript 文件都会收到 404 错误。我确认它们确实存在于 dist 应用程序中。

我的应用结构设置如下:

我已将我的静态文件添加到 .spec 文件的数据中,如下所示:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['manage.py'],
             pathex=['C:\\python\\dsssecurity'],
             binaries=[],
             datas=[('mysite/static','static_root'),('mysite/search/templates','mysite/templates')],
             hiddenimports=['django_select2.apps','django.contrib.admin.apps','django.contrib.auth.apps','django.contrib.contenttypes.apps','django.contrib.sessions.apps','django.contrib.messages.apps','django.contrib.staticfiles.apps','django_filters.apps','widget_tweaks.apps','django.contrib.messages.middleware.apps','django.template.loaders.apps'],
             hookspath=['C:/Python/dsssecurity'],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='dsssecurity',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='dsssecurity')

我还在 mysite > search > urls.py 中添加了静态设置,如下所示:

from django.conf.urls import url, include
from django.contrib import admin
from . import views
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    url(r'^results/$', views.results, name='results'),
    url(r'^submitted/$', views.submitted, name='submitted'),
    url(r'^update/$', views.update, name='update'),
    url(r'^submittedupdate/$', views.submittedupdate, name='submittedupdate'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

我的控制台输出显示:

[22/Jun/2018 14:24:02] "GET /search/?employeentname=&employeelastname=&qv_statusid=1&employee_status_id=1&title=&coid= HTTP/1.1" 200 841390
[22/Jun/2018 14:24:10] "POST /search/results/ HTTP/1.1" 200 36667
Not Found: /static/search/selectallrep.js
Not Found: /static/search/selectall.js
Not Found: /static/search/rolebased.js
[22/Jun/2018 14:24:10] "GET /static/search/selectall.js HTTP/1.1" 404 2354
Not Found: /static/search/buttonsubmit.js
[22/Jun/2018 14:24:10] "GET /static/search/selectallrep.js HTTP/1.1" 404 2363
[22/Jun/2018 14:24:10] "GET /static/search/rolebased.js HTTP/1.1" 404 2354
[22/Jun/2018 14:24:10] "GET /static/search/buttonsubmit.js HTTP/1.1" 404 2363
Not Found: /static/search/buttonsubmit.js
[22/Jun/2018 14:24:10] "GET /static/search/buttonsubmit.js HTTP/1.1" 404 2363
Not Found: /static/search/selectall.js
[22/Jun/2018 14:24:10] "GET /static/search/selectall.js HTTP/1.1" 404 2354
Not Found: /static/search/selectallrep.js
[22/Jun/2018 14:24:10] "GET /static/search/selectallrep.js HTTP/1.1" 404 2363
Not Found: /static/search/rolebased.js
[22/Jun/2018 14:24:10] "GET /static/search/rolebased.js HTTP/1.1" 404 2354

我已按照此处显示的说明进行操作:

Location of static files when creating a Django exe using pyinstaller

https://github.com/pyinstaller/pyinstaller/issues/2348

我在settings中的static_url和staticfiles_dirs定义为:

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'mysite/static'),
)

单独运行 manage.py 时,我的应用程序运行良好。为了让我的静态文件在我的 pyinstaller 可执行文件中被识别,我缺少什么?

【问题讨论】:

    标签: django pyinstaller django-staticfiles


    【解决方案1】:

    试试这个.. 为我工作。 在您的基本 URL 中添加此内容。

    urls.py

     from django.contrib.staticfiles.urls import staticfiles_urlpatterns
     urlpatterns = patterns('',
     # ...
     )+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    urlpatterns += staticfiles_urlpatterns() # Added this
    

    在settings.py中

       #..... 
       STATIC_URL = '/static/'
       STATICFILES_DIRS = [
       os.path.join(BASE_DIR, "myapp/static") # my static files are located in myapp/static
       ]
       # ....
    

    在 .spec(验证标识)中

    # -*- mode: python -*-
    
    block_cipher = None
    
    a = Analysis(......)
    
    ##### include mydir in distribution #######
    def extra_datas(mydir):
        def rec_glob(p, files):
            import os
            import glob
            for d in glob.glob(p):
                if os.path.isfile(d):
                    files.append(d)
                 rec_glob("%s/*" % d, files)
        files = []
        rec_glob("%s/*" % mydir, files)
        extra_datas = []
        for f in files:
        extra_datas.append((f, f, 'DATA'))
    return extra_datas
    a.datas += extra_datas('myapp')
    a.datas += extra_datas('db.sqlite3')
    ###########################################
    
    pyz = PYZ(.....)
    exe = EXE(.....)
    coll = COLLECT(....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2022-10-13
      • 2018-05-24
      • 2016-03-30
      • 2014-10-20
      • 1970-01-01
      • 2017-09-04
      • 2018-06-23
      相关资源
      最近更新 更多