【问题标题】:How to set base URL in Django如何在 Django 中设置基本 URL
【发布时间】:2013-07-02 08:04:38
【问题描述】:

我想从位置 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 但没有运气。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    @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)
        ])),
    ]
    

    【讨论】:

    • 两者的问题都回答了Django安装在“/someuri”,这意味着它看不到路径的那部分。
    【解决方案2】:

    我有一个具有类似设置的项目。我使用带有 apache 的虚拟环境运行 django。在我的 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/

    【讨论】:

      【解决方案3】:

      假设您可以控制在 /someuri 托管 Django 的 Web 服务器,@James Wallace 的答案很有效。在该配置中,服务器会将标头中的 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
      

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

      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)
      

      此后,管理包应该可以正常工作,具有适当的样式表和一切。唯一似乎不能正常工作的是“查看站点”链接,因为它错过了一个斜线。我没有找到解决方案,但可能涉及破解管理应用程序。


      除此之外,还有各种在线指南可用于在子路径下安装 Django。这很混乱,但上述内容避免了最严重的头痛。

      【讨论】:

      • 你能分享一些你在最后提到的指南吗?
      【解决方案4】:

      这应该适合你。

      from django.conf.urls import patterns, url
      
      urlpatterns = patterns('',
          (r'^someuri/admin/', include(admin.site.urls) ),
      )
      

      【讨论】:

      • @sofist 这个答案对你有帮助吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 2011-11-28
      • 2021-08-22
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多