You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目非主应用页面404错误排查与解决求助

Django多应用URL路由404问题排查与解决

问题背景

我在Django项目中创建了多个应用,主应用为main_app,其余子应用包括profile_app、settings_app、messages_app。

问题描述

在main_app中通过应用命名空间+URL名称(例如profilepage_app:"profile-redirect")调用其他应用的视图函数时,会触发**Page not found (404)**错误。除main_app外,其他所有应用的链接在浏览器中均会报404。

已执行操作

  • 所有应用已在INSTALLED_APPS中完成注册
  • 项目根URL配置已关联各应用的urls.py文件
  • main_app内的测试视图可正常运行,但将相同函数移至profile_app后无法工作
  • 新建测试应用后,问题仍然存在

疑问

  1. 该问题产生的原因是什么?
  2. 如何解决这个问题?
  3. 问题是否与settings.py配置有关?

相关代码

视图代码(profile_app/views.py)

from django.conf import settings
from django.shortcuts import render, redirect
from django.views.generic import View

from profile_app.forms import *
from profile_app.models import *
from messages_app.models import Message

user = settings.AUTH_USER_MODEL
# Create your views here.

## Redirect to user profile from the navbar

class ProfilePageView(View):
    model = ProfilepageMember
    template_name = "profile_app/profilepage.html"
    
    def get(self, request, user_name):
        user_related_data = ProfilepageMember.objects.filter(member__username = user_name)
        context = {"user_related_data": user_related_data}
        return render(request, self.template_name, context)

项目根URL配置(body/urls.py)

"""
URL configuration for bodyswap_project project.

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("auth_app.urls")),
    path("", include("main_app.urls")),
    path("", include("profile_app.urls")),
    path("", include("messages_app.urls")),
    path("", include("settings_app.urls")),
]

Settings配置(body/settings.py)

"""
Django settings for body project.

Generated by 'django-admin startproject' using Django 4.2.

For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""

from pathlib import Path
import os
from dotenv import load_dotenv
load_dotenv()

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.getenv("SECRET_KEY")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.getenv("DEBUG")

ALLOWED_HOSTS = []

# HTTPS settings

# Set this to True in production to avoid transmitting the CSRF cookie over HTTP accidentally.
CSRF_COOKIE_SECURE = False
# Set this to True in production to avoid transmitting the CSRF cookie over HTTP accidentally.
SESSION_COOKIE_SECURE = False
# Change to True in production
SECURE_SSL_REDIRECT = False

# HSTS settings

# SECURE_HSTS_SECONDS = 31536000  # 1 year
# SECURE_HSTS_PRELOAD = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = False

# Email settings for the contact form
# Used only during development

EMAIL_HOST = os.getenv("EMAIL_HOST")
EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD")
EMAIL_PORT = os.getenv("EMAIL_PORT")

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Installed apps
    'main_app.apps.MainAppConfig',
    'auth_app.apps.AuthAppConfig',
    'profile_app.apps.ProfileAppConfig',
    'settings_app.apps.SettingsAppConfig',
    'messages_app.apps.MessagesAppConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'body.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

WSGI_APPLICATION = 'body.wsgi.application'


# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = 'static/'

STATICFILES_DIRS = [
    BASE_DIR / "static"
]


# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# This is set when creating a custom user model.
AUTH_USER_MODEL = 'main_app.Member'

问题解答

1. 问题原因

  • 路由冲突与顺序问题:所有应用的URL都挂载到根路径""下,且main_app的路由配置在其他应用之前。若main_app的urls.py存在匹配根路径或宽泛路径的规则,Django会优先匹配该规则,导致后续应用的路由永远无法被触发。
  • 应用命名空间配置错误:调用时使用的profilepage_app:"profile-redirect"中,命名空间与实际应用名称不匹配,且子应用urls.py未设置app_name,导致Django无法识别命名空间,反向解析失败。
  • 子应用URL规则缺失/参数不匹配:profile_app的urls.py未定义对应profile-redirect的URL规则,或规则未包含视图所需的user_name参数,导致路由无法匹配视图。

2. 解决方法

步骤1:给子应用分配独立路由前缀

修改项目根URL配置,为每个子应用设置专属路径前缀,避免路由冲突:

urlpatterns = [
    path("admin/", admin.site.urls),
    path("auth/", include("auth_app.urls")),
    path("", include("main_app.urls")),
    path("profile/", include("profile_app.urls")),
    path("messages/", include("messages_app.urls")),
    path("settings/", include("settings_app.urls")),
]

步骤2:配置正确的应用命名空间

在每个子应用的urls.py开头添加app_name,以profile_app为例:

from django.urls import path
from .views import ProfilePageView

app_name = "profile_app"  # 与反向解析使用的命名空间保持一致

urlpatterns = [
    # 定义包含user_name参数的URL规则
    path("<str:user_name>/", ProfilePageView.as_view(), name="profile-redirect"),
]

之后反向解析需改为profile_app:profile-redirect,确保命名空间匹配。

步骤3:检查子应用URL规则

确保子应用urls.py中的规则包含视图所需的参数,且名称与反向解析时使用的一致。

步骤4:验证路由匹配顺序

Django路由按从上到下顺序匹配,避免将宽泛匹配规则放在子应用路由之前,防止覆盖后续路由。

3. 与settings配置的关系

该问题与settings.py无直接关联,只要已正确注册应用(你已完成此操作),就不会影响路由匹配。若未注册应用,只会导致模板、静态文件无法找到,不会直接触发404错误。


内容的提问来源于stack exchange,提问作者AJJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:47:01