如何在Django中设置基本URL

如何在Django中设置基本URL,django,django-admin,Django,Django Admin,我想从位置运行Django,这样我就有了位于的管理界面。我可以看到登录窗口,但当我登录时,我会被重定向到 在哪里可以设置Django的基本URL?我尝试使用BASE_URL,但没有成功。这应该适合您 from django.conf.urls import patterns, url urlpatterns = patterns('', (r'^someuri/admin/', include(admin.site.urls) ), ) @AgileDeveloper的答案对于一次性

我想从位置运行Django,这样我就有了位于的管理界面。我可以看到登录窗口,但当我登录时,我会被重定向到


在哪里可以设置Django的基本URL?我尝试使用BASE_URL,但没有成功。

这应该适合您

from django.conf.urls import patterns, url

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

@AgileDeveloper的答案对于一次性的admin案例是完全正确的。但是,是否希望对所有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)
    ])),
]

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

WSGIScriptAlias /someuri /path/to/wsgi.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),
]
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',
            ],
        },
    },
]
以下是从子目录为项目提供服务的WSGIScriptAlias文档

在URL.py文件中,我设置了以下内容:

WSGIScriptAlias /someuri /path/to/wsgi.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),
]
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',
            ],
        },
    },
]

登录后,我被重定向到

。@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
在同一文件中,还需要更改模板并添加以下内容:

WSGIScriptAlias /someuri /path/to/wsgi.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),
]
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

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

此后,管理包应该可以正常工作,带有适当的样式表和所有内容。唯一一个似乎不太好用的是“查看站点”链接,因为它缺少斜杠。我没有找到一个解决方案,但它可能涉及黑客的管理应用程序



除此之外,在子路径下安装Django还有各种在线指南。它很凌乱,但上面的内容避免了最令人头痛的问题。

@sofist这个答案对您有帮助吗?这两个答案的问题都是Django安装在“/someuri”上,这意味着它看不到路径的那一部分。您可以分享一下您在最后提到的一些指南吗?