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

Django访问register/路由报404 加斜杠后无法跳转问题解决

问题根因

你遇到的404错误是几个低级问题叠加导致的:

  • 最核心问题:user/urls.py 没有定义Django要求的urlpatterns路由列表,直接把path()语句写在了文件顶层,框架加载路由配置时根本读不到你写的这些路由规则,所有非admin路径都匹配不上。
  • 路由格式不统一:你定义的路由是login、register这种不带尾部斜杠的格式,但Django默认开启了斜杠补全,浏览器实际请求的是/login/、/register/带尾部斜杠的路径,和你定义的规则不匹配。
  • 视图函数缩进混乱,if/else层级完全错位,就算路由匹配上了也会报语法错误跑不起来。
  • 模板里硬编码相对路径,很容易出现路径拼接偏差。
修复步骤

1. 修正user/urls.py配置

必须把所有路由规则封装到urlpatterns列表中,同时统一给所有路径加上尾部斜杠,符合Django默认路由规范:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),
    path('login/', views.login, name="login"),
    path('register/', views.register, name="register"),
    path('logout/', views.logout, name="logout"),
    path('form/', views.form, name="form"),
    path('predict/', views.predict, name="predict"),
]

你贴出来的loan/urls.py配置是正常的,不需要修改。

2. 修正views.py的缩进错误

你现在的login、register视图函数缩进完全错位,把逻辑分支都写到函数外面了,直接运行会抛语法错误,修正后的代码如下:

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import User, auth
from .models import Prediction
import joblib
import pandas as pd
from sklearn.preprocessing import scale
from sklearn.impute import SimpleImputer

res = 'X'

def index(request):
    return render(request, "index.html")

def login(request):
    if request.method == "POST":
        name = request.POST['username']
        pas = request.POST['password']
        user = auth.authenticate(username=name, password=pas)
        if user:
            auth.login(request, user)
            return redirect("/")
        else:
            messages.info(request, "User does not exist")
            return redirect("login")
    else:
        return render(request, "login.html")

def register(request):
    if request.method == "POST":
        fname = request.POST['first_name']
        lname = request.POST['last_name']
        email = request.POST['email']
        uname = request.POST['username']
        pas1 = request.POST['password1']
        pas2 = request.POST['password2']
        if pas1 == pas2:
            if User.objects.filter(username=uname).exists():
                messages.info(request, "Username already exists")
                return render(request, "register.html")
            elif User.objects.filter(email=email).exists():
                messages.info(request, "Email already exits")
                return render(request, "register.html")
            else:
                user = User.objects.create_user(username=uname, password=pas1, email=email, first_name=fname,
                                                last_name=lname)
                user.save()
                return redirect("login")
        else:
            messages.info(request, "Password does not match")
            return render(request, "register.html")
    else:
        return render(request, "register.html")

3. 修正模板硬编码路径

不要在模板里直接写相对路径,用Django内置的{% url %}标签做反向解析,从根源上避免斜杠、路径拼接错误。打开register.html修改两处:

  • 把表单标签<form action="register" method="post">替换为<form action="{% url 'register' %}" method="post">
  • 把登录跳转链接<a href="login"> Login</a>替换为<a href="{% url 'login' %}"> Login</a>
    其他模板文件里所有写死的跳转、表单提交路径,都按这个方式替换成反向解析写法即可。

4. 验证生效

确认settings.py中APPEND_SLASH = True(Django默认开启,没手动改就不用动),重启Django开发服务,清空浏览器缓存后再访问,/login/、/register/路径就能正常匹配,跳转也不会出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:09:34