0

0

Django 404 错误:深入理解 URL 路由与应用配置

霞舞

霞舞

发布时间:2025-12-12 19:07:13

|

508人浏览过

|

来源于php中文网

原创

Django 404 错误:深入理解 URL 路由与应用配置

本文旨在解决 django 应用中常见的 404 页面未找到错误,特别是当表单提交或文件上传未能正确路由到视图函数时。我们将详细阐述如何通过正确配置项目级和应用级 `urls.py`、在 `settings.py` 中注册应用,以及规范使用 url 命名空间来解决此类问题,确保请求被正确处理。

当用户在 Django 应用中提交表单,特别是涉及文件上传时,如果服务器返回 404 "Page not found" 错误,通常意味着 Django 的 URL 调度器未能找到与请求 URL 匹配的模式。这种错误提示,例如 Request Method: GET Request URL: http://127.0.0.1:8000/post?file1=f.txt&file2=t.txt,表明了请求的路径 /post 未在项目的 URL 配置中找到对应项。尽管表单可能被设置为 POST 方法并指向一个命名 URL,但错误的配置可能导致请求无法被正确处理,甚至以意外的 GET 请求形式出现。

核心问题诊断

出现 404 错误,尤其是在表单提交后,通常源于以下几个核心问题:

  1. URL 模式未匹配: 请求的 URL (例如 /post) 未在 Django 项目的任何 urlpatterns 中定义。即使模板中的 {% url 'compare-files' %} 语法正确,如果底层 URL 配置有误,它也可能无法解析到正确的路径。
  2. 应用未注册: Django 项目由多个应用组成。如果一个应用包含视图和 URL 模式,但该应用未在项目的 settings.py 文件的 INSTALLED_APPS 列表中注册,Django 将无法发现并加载其 URL 模式。
  3. URL 路由层级混淆: Django 鼓励将 URL 模式分为项目级和应用级。项目级 urls.py 负责包含(include)各个应用的 URL 模式,而应用级 urls.py 则定义了该应用内部的具体路由。混淆这两个层级或未能正确 include 应用的 URL,是常见的错误源。

解决方案与实践

要解决这类 404 错误并确保 Django 应用的路由机制正常工作,请遵循以下步骤:

1. 确保应用已创建并注册

首先,确认你已经创建了一个 Django 应用(例如 my_app),并且该应用已在项目的 settings.py 文件中注册。

创建应用(如果尚未创建):

python manage.py startapp my_app

注册应用(settings.py):

在项目的 settings.py 文件中,找到 INSTALLED_APPS 列表,并添加你的应用名称。

# project_name/settings.py

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

    'my_app', # 确保你的应用名称在此处
]

2. 配置项目级 urls.py

项目的 urls.py 位于项目根目录(与 settings.py 同级),它的主要职责是包含各个应用的 URL 模式。使用 django.urls.include 函数将你的应用 URL 模式导入。

Replit Agent
Replit Agent

Replit最新推出的AI编程工具,可以帮助用户从零开始自动构建应用程序。

下载
# project_name/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # 将所有非 admin 的请求路由到 'my_app' 的 urls.py
    # 也可以指定一个前缀,例如 path('app/', include('my_app.urls'))
    path('', include('my_app.urls')),
]

3. 配置应用级 urls.py

在你的应用目录(例如 my_app/)中创建一个 urls.py 文件(如果它不存在)。这个文件将定义 my_app 内部的所有 URL 模式。同时,强烈建议设置 app_name 来为应用的 URL 模式提供命名空间,以避免与其他应用发生 URL 名称冲突。

# my_app/urls.py

from django.urls import path
from . import views

app_name = 'my_app' # 定义应用的命名空间

urlpatterns = [
    path('', views.home_view, name='home'),
    path('login/', views.login_view, name='login'),
    path('compare-files/', views.compare_files_view, name='compare-files'), # 文件比较视图的 URL
]

4. 更新模板中的 URL 引用

在 home.html 或其他模板中,当引用应用内部的 URL 时,应使用 {% url %} 标签结合应用命名空间来确保正确解析。




    
    
    Home


    {% block content %}
    {% if user.is_authenticated %}
        Yo wassup {{ user.username }}!
        
{% csrf_token %}
file 1:

file 2:

{% if result %}

Comparison Result: {{ result }}

{% endif %} {% else %}

please Login

Login {% endif %} {% endblock %}

5. 审查视图函数

确保你的视图函数(例如 compare_files_view)能够正确处理请求方法和文件数据。

# my_app/views.py

from django.shortcuts import render
import xxhash
from django.http import HttpResponse

def home_view(request):
    return render(request, 'home.html')

def login_view(request):
    # 如果你正在使用 Django 的 LoginView,这个自定义视图可能不需要
    return render(request, 'login.html')

def compare_files_view(request):
    if request.method == 'POST' and 'file1' in request.FILES and 'file2' in request.FILES:
        file1 = request.FILES['file1']
        file2 = request.FILES['file2']
        result = "Same" if compare_files(file1, file2) else "Different"
        return render(request, 'home.html', {'result': result})
    else:
        # 处理 GET 请求或缺少文件的 POST 请求,可以返回带有错误信息的页面
        return render(request, 'home.html', {'error_message': '请上传两个文件进行比较。'})

def compare_files(file1, file2):
    # 确保文件对象在读取前被重置到开头,以防之前被读取过
    file1.seek(0)
    file2.seek(0)
    hash1 = xxhash.xxh64(file1.read()).hexdigest()
    hash2 = xxhash.xxh64(file2.read()).hexdigest()
    return hash1 == hash2

注意事项与最佳实践

  • CSRF 保护: 在所有 POST 表单中,务必包含 {% csrf_token %}。Django 的 CsrfViewMiddleware 会自动验证此令牌,以防止跨站请求伪造攻击。
  • DEBUG 模式:开发环境中,设置 DEBUG = True 可以让 Django 在 404 页面中显示详细的 URLconf 匹配尝试,这对于调试路由问题非常有帮助。
  • URL 命名空间: 始终建议为应用设置 app_name,并在模板中使用 {% url 'app_name:view_name' %} 来引用 URL。这不仅提高了代码的可读性,还能有效避免不同应用之间 URL 名称冲突的问题。
  • 请求方法: 确保视图函数中对 request.method 的判断与表单提交方法一致。如果表单是 POST,视图就应该处理 POST 请求。
  • 文件读取: 在 compare_files 函数中,如果文件对象在视图中已经被读取过(例如,通过 file1.read()),再次读取时可能得到空内容。为了确保哈希计算的准确性,可以在读取之前使用 file.seek(0) 将文件指针重置到开头。

总结

Django 中的 404 错误通常是 URL 路由配置问题的直接体现。通过遵循正确的 Django 应用结构,包括创建和注册应用、合理配置项目级和应用级 urls.py,并使用 URL 命名空间来引用 URL,可以有效避免此类问题。理解 Django 的 URL 调度机制是构建健壮和可维护 Web 应用的关键一步。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

613

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

653

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

470

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2892

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

505

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

424

2023.09.01

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 3.6万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号