如何在单个虚拟主机上服务 django 和 gatsby?

问题描述 投票:0回答:2

我正在尝试在单个域下部署基于 gatsby 的前端和基于 django 的后端。它将依赖 Apache 和 mod_wsgi。在完美的世界中,它应该按如下方式工作:

我可以看到两种可能性:

  1. Django 知道前端。通过 Django 提供一切服务,将
    /
    设置为 STATIC_URL。
  2. Django 不知道前端。通过 django 提供
    /api
    /admin
    /
    由网络服务器处理。

我对第二种方法感觉更舒服,但是我不知道如何为这种情况配置 VirtualHost。第一种方法看起来像是一个丑陋的黑客。

我应该如何进行?

python django apache gatsby wsgi
2个回答
1
投票

编译你的 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


0
投票

我确信您不再需要它,但它可能对其他人有用。

我遇到了同样的问题,解决方案是在 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")
© www.soinside.com 2019 - 2024. All rights reserved.