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 列表,并添加你的应用名称。

卡拉OK视频制作
卡拉OK视频制作

卡拉OK视频制作,在几分钟内制作出你的卡拉OK视频

下载
# 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 模式导入。

# 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 %} 标签结合应用命名空间来确保正确解析。

<!-- my_app/templates/home.html -->
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home</title>
</head>
<body>
    {% block content %}
    {% if user.is_authenticated %}
        Yo wassup {{ user.username }}!
        <form method="post" action="{% url 'my_app:compare-files' %}" enctype="multipart/form-data">
            {% csrf_token %} <!-- 确保包含 CSRF token -->
            <br>file 1: <br>
            <input type = 'file' name="file1"/>
            <br>file 2: <br>
            <input type = 'file' name="file2"/>
            <br><button type="submit">Compare Files</button>
        </form>
        {% if result %}
            <p>Comparison Result: {{ result }}</p>
        {% endif %}
    {% else %}
        <p>please Login</p>
        <a href="{% url 'my_app:login' %}">Login</a>
    {% endif %}
    {% endblock %}
</body>
</html>

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

157

2026.02.04

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

487

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

448

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

3325

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2800

2024.08.16

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

5

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

11

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

33

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

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

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