gpt4 book ai didi

python - 子目录中的 Django - 管理站点不工作

转载 作者:行者123 更新时间:2023-12-04 20:31:32 26 4
gpt4 key购买 nike

我已经在服务器的子目录(dns_name_of_my_page/notes)上部署了我的 Django 项目。我在这个项目中的应用程序可以通过 dns_name_of_my_page/notes/app/访问。不幸的是,如果整个 Django 项目位于托管服务器上 public_html 的子目录“notes”中,则管理站点无法正常工作。当我进入管理站点 (dns_name_of_my_page/notes/admin/) 时,重定向到没有子目录名称的 URL (dns_name_of_my_page/adminlogin/?next=//admin/),这是 Not Acceptable 。它应该是 dns_name_of_my_page/notes/adminlogin/?next=/notes/admin/

这是我在项目中的 URL 配置:

urlpatterns = [
url(r'^/?app/?', include('app.urls')),
url(r'^/?$', views.index, name='index'),
url(r'^/?admin/?', admin.site.urls),
]

这是我在应用程序中的 URL 配置:
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^(?P<num>[0-9]+)/?', views.num, name='num'),
]

我试图设置
FORCE_SCRIPT_NAME = '/notes/'

或者
SUB_SITE = "/notes/"

在 settings.py 中,但对我没有帮助。

您在子目录中运行 Django 应用程序时遇到过这种问题吗?

最佳答案

我今天被捕获了,虽然有许多类似的问题 [1],但从我解决这个问题的经验来看,答案在某种程度上是一种混合体。

您的问题中缺少的一个细节是您正在使用的服务器设置。为了解释我的解决方案,它有助于理解它是如何与 Django 方面结合使用的。

我一直在解决的问题包括访问 Django 管理员(以及大多数其他应用程序,例如 Auth)的问题是让服务器充当多个独立 django 项目的主机。目的是让 URI 以 http://my.server.com/project_name/foo/bar/ 开头[2]。就每个项目而言,它在 my.server.com 上运行,并且只处理/foo/bar(在大多数生产/单应用程序系统中就是这种情况,以及使用 manage.py runserver 进行本地开发)

我正在使用 NGinx 作为反向代理,在我的域的端口 80 和 443 上进行监听。在该服务器中,我有一个 location设置为每个子项目代理到 Nginx 服务 + Gunicorn。

nginx 默认位置配置如下所示:

location /project_name {
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://localhost:7001/;
}

每个项目自己的 nginx+gunicorn 服务的设置与本主题并不特别相关,但正如您所见,它呈现在自己的本地服务端口上。

此配置将为 http://my.server.com/foo/bar/ 提供有效请求.这让我们现在可以说服 Django 为它在输出中生成的所有 URL 添加一个/project_name/前缀。

为此,您需要涵盖一些关键设置,它们是:
USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = '/project_name/'

这会导致 Django 尊重 nginx 传递的 header 更改,并触发它自己的进程来重写 {% url name %} 的输出。模板中的标签。
SESSION_COOKIE_PATH = '/project_name/'

这应该有助于分离该域上的多个登录,并且意味着您可以登录一个项目,但不能登录另一个项目(或混淆它)。
STATIC_FILES_ROOT='\path\on\disk\as\in\your\nginx\config\for\static\'
STATIC_FILES_URL='/project_name/static/'
MEDIA_FILES_ROOT='\path\on\disk\as\in\your\nginx\config\for\media\'
MEDIA_FILES_URL='/project_name/media/'

这些处理 `{% static blah %} 类型的模板标签和文件服务。
LOGIN_REDIRECT_URL='/project_name/'
LOGOUT_REDIRECT_URL='/project_name/'

这些处理使用 Auth 模块登录/退出服务的结果,并确保它在登录或注销时将用户发送回项目站点的根目录。您可以轻松地根据自己的需要定制这些内容,包括使用 url-conf 样式的正则表达式字符串,例如我们将在下面为管理页面执行的操作
ADMIN_URL=r'^admin/'

此设置与您网站 urls.py 中的这一行配对:
url(settings.ADMIN_URL, include(admin.site.urls)),   # default=r'^admin/'

这里的一个关键细节是,正则表达式前面没有/,否则会尝试将其强制返回主机名,因此 FORCE_SCRIPT_NAME 指定的更改将起作用。

此外,请注意不要在模板中包含任何以/开头的硬编码 url(相对或其他),因为 Django 模板输出更改不会捕获这些url。

按照这种方法,我已经能够在三个不同的系统中部署这些项目中的每一个,其中两个涉及它们作为该域或服务端口上唯一的 django 应用程序运行,其余一个是这个共享域设置,并且不需要除了更改每个位置的设置值之外的任何内容。

将这种方法与您自己的代码示例一起使用,我建议您正在寻找以下方面的更改:
urlpatterns = [
url(r'^admin/?', admin.site.urls),
url(r'^app/?', include('app.urls')),
url(r'^$', views.index, name='index'),
]

为了帮助搜索和匹配顺序,我重新安排了 admin 排在第一位,而 empty/home/root 匹配模板排在最后。否则你的 FORCE_SCRIPT_NAME 设置是正确的。

[1] 例如 multiple instances of django on a single domain ; Is it possible to host multiple django projects under the same domain? ; how to deploy django under a suburl behind nginx

[2] 默认服务器实际上也在处理 SSL 转换,因为服务在 https 上提供,但在内部本地主机端口(隐藏在机器防火墙后面)只处理 http。

关于python - 子目录中的 Django - 管理站点不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44987110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com