我正在尝试在单个域下部署基于 gatsby 的前端和基于 django 的后端。它将依赖 Apache 和 mod_wsgi。在完美的世界中,它应该按如下方式工作:
我可以看到两种可能性:
/
设置为 STATIC_URL。/api
和 /admin
。 /
由网络服务器处理。我对第二种方法感觉更舒服,但是我不知道如何为这种情况配置 VirtualHost。第一种方法看起来像是一个丑陋的黑客。
我应该如何进行?
编译你的 gatsby 项目后,它应该由 django 作为静态页面提供。
首先:盖茨比区应该在你的
static_private
路径中。
第二:在你的 django 项目中,你将为 / 定义一个 URL,它将调用索引视图。
最后:在你看来,你应该渲染你的盖茨比区的
index.html
。
urls.py:
from django.contrib import admin
from django.urls import path, re_path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('apis/', include('apps.urls')),
path('/', views.index),
]
views.py:
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
请注意,如果您在前端处理路由,则索引视图的 url 模式应如下所示:
re_path('^.*$', views.index)
如果您在heroku上托管您的django应用程序,您将需要whitenoise中间件并在您的
settings.py
中进行设置:
MIDDLEWARE = [
...
'whitenoise.middleware.WhiteNoiseMiddleware',
...
]
此处提供了文档:https://devcenter.heroku.com/articles/django-assets#whitenoise
我确信您不再需要它,但它可能对其他人有用。
我遇到了同样的问题,解决方案是在 gatsby-config.js 中专门使用 assertPrefix (例如,“/static/”,它仅替换静态文件的路径,并且不会更改静态文件的路径) .html 文件)而不是 pathPrefix (替换每个文件的路径)
module.exports = {
assetPrefix: "/static/",
...
}
现在在 django 设置中,只需指定相同的
STATIC_URL = "/static/"
以及 gatsby 在 gatsby build
之后给出的文件所在文件夹的绝对路径
STATICFILES_DIRS = (os.path.join(BASE_DIR,"frontend/public/")).
还指定模板:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [str(BASE_DIR/'frontend/public')],
...
}
]
接下来,您需要在 django 中创建一个 url 路径。例如:
#main/urls
urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include('backend.urls')),
path(r'', include('frontend.urls')),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
和
#frontend/urls
urlpatterns = [
path('', mainpage),
path('app/',app),
path('login/',login),
path('user/<userid>',userid),
]
视图可以如下所示:
#frontend/views*
from django.views.generic import templateview
mainpage = templateview.as_view(template_name="index.html")
app = templateview.as_view(template_name="app/index.html")
user = templateview.as_view(template_name="user/index.html")
login = templateview.as_view(template_name="login/index.html")
error = templateview.as_view(template_name="404/index.html")
userid = templateview.as_view(template_name="user/[userid]/index.html")