Django用户登录系统异常:Views.py无法接收请求
问题原因分析
你猜的没错:
django.contrib.auth.urls包含了Django自带的认证URL规则(含login/、logout/等),这些规则会优先匹配请求,导致你自己写的login_user视图完全没被触发。templates/registration/是Django自带认证系统的默认模板目录,自带的登录视图会自动加载该目录下的login.html,所以哪怕删掉自己的视图,模板依然能正常显示。
解决方案
要让前端数据提交到你自己的后端视图,有两种可行方式:
方式一:替换自带的登录URL规则
修改项目urls.py,将自带的登录URL替换为你自己的视图,确保自定义视图优先级高于自带规则:
from django.contrib.auth import views as auth_views from . import views # 导入你的自定义views模块 # 先添加自定义登录路径,URL匹配从上到下,先匹配到的生效 path('login/', views.login_user, name='login'), # 若需保留其他自带认证功能(如logout),可单独配置 path('logout/', auth_views.LogoutView.as_view(), name='logout'), # 移除或注释掉原来的全局include规则: # path('', include('django.contrib.auth.urls')),
方式二:修改表单提交目标(适合保留部分自带认证URL的场景)
如果不想完全替换自带认证URL,只需修改登录模板的表单action属性,指向自定义视图的URL:
打开templates/registration/login.html,调整表单标签:
<form action="{% url 'login' %}" method="POST"> {% csrf_token %} <!-- 必须添加,否则Django会拦截POST请求 --> <!-- 你的用户名、密码输入框 --> <button type="submit">登录</button> </form>
注意:这里的login是你在urls.py中给login_user视图设置的name值,需保证两者一致。
关键检查点
- CSRF令牌必须存在:表单里必须加
{% csrf_token %};如果用AJAX提交,要在请求头里带上X-CSRFToken(值从页面的csrfmiddlewaretoken元素获取)。 - 模板路径正确:你的
login_user视图当前返回render(request, 'login.html', {}),但模板实际在registration/目录下,应改为render(request, 'registration/login.html', {});或者确保settings.py中TEMPLATES的APP_DIRS为True,且你的App已加入INSTALLED_APPS。 - 请求方法匹配:确保表单的
method属性为POST,和视图里的request.method == "POST"判断逻辑对应。
内容的提问来源于stack exchange,提问作者Lenni
相关产品推荐
相关产品推荐

