如何在Django中设置基本URL

时间:2013-07-02 08:04:39

标签: django django-admin

我想从位置https://www.example.com/someuri/运行Django,以便我在https://www.example.com/someuri/admin/拥有管理界面。我可以看到登录窗口,但是当我登录时,我被重定向到https://www.example.com/admin/

在哪里可以将Django的基本URL设置为https://www.example.com/someuri/?我试过BASE_URL,但没有运气。

4 个答案:

答案 0 :(得分:3)

@ AgileDeveloper的答案对于管理员的一个案例是完全正确的。但是,是否希望以这种方式为所有URL设置它?如果是这样,也许你应该做这样的事情

from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r'^someuri/', include([
        url(r'^admin/', include(admin.site.urls) ),
        url(r'^other/$', views.other)
    ])),
]

答案 1 :(得分:3)

我有一个具有类似设置的项目。我有django使用apache的虚拟环境运行。在我的000-default.conf文件中,我将WSGIScriptAlias设置为以下内容:

WSGIScriptAlias /someuri /path/to/wsgi.py

以下是WSGIScriptAlias从子目录https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/#using-mod-wsgi-daemon-mode为该项目提供服务的文档。

比在urls.py文件中我设置了以下内容:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^', include('someuri.urls')),
    url(r'^admin/', admin.site.urls),
]

登录后,我被重定向到http://example.com/someuri/admin/

答案 2 :(得分:2)

这应该适合你。

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    (r'^someuri/admin/', include(admin.site.urls) ),
)

答案 3 :(得分:1)

@James Wallace的回答很好,假设您可以控制在/ someuri托管Django的Web服务器。在该配置中,服务器会将标头中的SCRIPT_NAME值传递给Django,Django会知道它正在该子路径上提供服务。

但是,如果您无法控制前端服务器,那么您可以通过添加到项目中的settings.py来强制Django假设该值:

USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = '/someuri'

之后,即使在管理应用程序中,您仍可能遇到静态文件,css等问题。在默认配置中,这些由Django开发服务器提供,无需更改。但是,通过上述更改,静态文件将丢失。假设您仍希望通过内部Django开发服务器(而不是通过外部Web服务器)提供这些文件,则需要添加到settings.py项目文件中:

STATIC_SUFFIX = '/static/'
STATIC_URL = FORCE_SCRIPT_NAME + STATIC_SUFFIX
MEDIA_SUFFIX = '/media/'
MEDIA_URL = FORCE_SCRIPT_NAME + MEDIA_SUFFIX

在同一个文件中,您还需要更改模板并添加以下内容:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ STATIC_ROOT ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

然后,您需要将静态文件收集到定义的目录中:

python manage.py collectstatic

python3 manage.py collectstatic

项目级别urls.py文件应该如下所示(Django v1.11):

import os
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings
from django.views.generic.base import TemplateView

urlpatterns = [
    url(r'^admin/', admin.site.urls),
] + static(settings.STATIC_SUFFIX, document_root=settings.STATIC_ROOT)

此后,管理包应该可以使用适当的样式表和所有内容。唯一看起来效果不佳的是“VIEW SITE”链接,因为它错过了一个斜线。我没有找到解决方案,但可能涉及黑客管理应用程序。

除此之外,还有各种指南可以在子路径下安装Django。它很乱,但上面避免了最严重的麻烦。