我正在用一个
Django backend
和
Vuejs frontend
.在开发中,我分别用
python manage.py runserver
和
yarn serve
分别地这非常有效,我现在想部署该网站。为了做到这一点,我跑了
yarn build
,这创造了一个
dist/
我的前端文件夹中的文件夹。所以我的结构是这样的:
cockpit
âââ backend/
â âââ cockpit/
â â âââ views.py
â â âââ css/
â â âââ etc..
â âââ settings/
â â âââ settings.py
â âââ manage.py
âââ frontend/
âââ dist/
âââ index.html
âââ css/
âââ js/
我现在想为你的消息来源服务
frontend/dist/
从我的django项目,这样我就可以使用uwsgi运行一切。为了做到这一点,我正在努力遵循
this description
.我有以下几点
settings/urls.py
from django.contrib import admin
from django.urls import include, path, re_path
from django.views.generic import TemplateView
urlpatterns = [
path('admin/', admin.site.urls),
path('cockpit/', include("cockpit.urls")),
re_path('', TemplateView.as_view(template_name='index.html')),
]
并在“我的设置”中设置以下设置。py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['static'], # <== ADDED THIS
'APP_DIRS': True,
'OPTIONS': {
# removed to keep this example small
},
},
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, '../frontend/dist'),
]
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
print("BASE_DIR:", BASE_DIR)
print("STATIC_ROOT:", STATIC_ROOT)
print("STATICFILES_DIRS:", STATICFILES_DIRS)
这些指纹告诉我:
BASE_DIR: /home/kramer65/repos/cockpit/backend
STATIC_ROOT: /home/kramer65/repos/cockpit/backend/static/
STATICFILES_DIRS: ['/home/kramer65/repos/cockpit/backend/../frontend/dist']
然后我跑了一圈。py静态:
$ python manage.py collectstatic
150 static files copied to '/home/kramer65/repos/cockpit/backend/static'.
现在看起来是这样的:
cockpit
âââ backend/
â âââ cockpit/
â â âââ views.py
â â âââ css/
â â âââ etc..
â âââ settings/
â â âââ settings.py
â âââ manage.py
â âââ static/
â âââ index.html
â âââ css/
â âââ js/
âââ frontend/
âââ dist/
âââ index.html
âââ css/
âââ js/
我通过运行(节点)来测试它
http-server
从
backend/static/
文件夹在浏览器中,网站加载并运行完美。下面是命令行的输出:
$ http-server
Starting up http-server, serving ./
Available on:
http://127.0.0.1:8080
http://192.168.0.104:8080
Hit CTRL-C to stop the server
[2020-05-18T13:50:58.487Z] "GET /" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
(node:5928) [DEP0066] DeprecationWarning: OutgoingMessage.prototype._headers is deprecated
[2020-05-18T13:50:58.671Z] "GET /css/chunk-vendors.2c7f3eba.css" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
[2020-05-18T13:50:58.679Z] "GET /css/app.e15f06d0.css" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
[2020-05-18T13:50:58.681Z] "GET /js/chunk-vendors.9c409057.js" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
[2020-05-18T13:50:58.687Z] "GET /js/app.c930fce5.js" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0"
我阻止了这一切
http服务器
,启动Django dev服务器并打开浏览器。终端向我显示:
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
May 18, 2020 - 17:57:00
Django version 3.0.6, using settings 'settings.settings'
Starting ASGI/Channels version 2.4.0 development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
HTTP GET / 200 [0.22, 127.0.0.1:33224]
HTTP GET /static/debug_toolbar/css/print.css 200 [0.04, 127.0.0.1:33232]
HTTP GET /static/debug_toolbar/css/toolbar.css 200 [0.05, 127.0.0.1:33234]
HTTP GET /static/debug_toolbar/js/toolbar.js 200 [0.02, 127.0.0.1:33232]
HTTP GET /static/debug_toolbar/js/toolbar.timer.js 200 [0.04, 127.0.0.1:33234]
HTTP GET /js/chunk-vendors.9c409057.js 200 [0.80, 127.0.0.1:33228]
HTTP GET /css/chunk-vendors.2c7f3eba.css 200 [0.94, 127.0.0.1:33224]
HTTP GET /js/app.c930fce5.js 200 [0.98, 127.0.0.1:33230]
HTTP GET /css/app.e15f06d0.css 200 [0.99, 127.0.0.1:33226]
HTTP GET /favicon.ico 200 [0.09, 127.0.0.1:33226]
在浏览器控制台中,我看到源代码似乎已加载,但有些源代码似乎是空的(0字节),屏幕上没有显示任何内容。下面是结果的屏幕截图和Django调试栏中静态文件选项卡的屏幕截图。
有人知道为什么它不能在Django中正确地提供这些文件吗?
[编辑]
我刚发现如果我改变
STATIC_URL = '/static/'
到
STATIC_URL = '/'
当我去看电影时,它能正常工作
http://127.0.0.1:8000/index.html
但是现在
http://127.0.0.1:8000/
给了我这个错误:
[编辑2]
好的,按照@geek_life的建议,我将设置文件中的值更改为:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_NAME = 'cockpit'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, PROJECT_NAME, "static/")
STATICFILES_DIRS = [os.path.join(BASE_DIR, '../frontend/dist')]
print("## BASE_DIR:", BASE_DIR)
print("## STATIC_ROOT:", STATIC_ROOT)
print("## STATICFILES_DIRS:", STATICFILES_DIRS)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['cockpit/static/'], # <= THIS IS WHAT I CHANGED
'APP_DIRS': True,
'OPTIONS': {} # And here some options
},
]
打印出来的
## BASE_DIR: /home/kramer65/repos/cockpit/backend
## STATIC_ROOT: /home/kramer65/repos/cockpit/backend/cockpit/static/
## STATICFILES_DIRS: ['/home/kramer65/repos/cockpit/backend/../frontend/dist']
在档案里
设置/URL。py
我(仍然)明白了:
urlpatterns = [
path('admin/', admin.site.urls),
path('cockpit/', include("cockpit.urls")),
re_path('', TemplateView.as_view(template_name='index.html')),
]
然后我复制了
static/
包含从中生成的vuejs ap的文件夹
cockpit/backend/
到
cockpit/backend/cockpit/
.
不幸的是,我仍然得到同样的结果。索引。html加载,但js和css文件仍然不加载。还有其他想法吗?