基于自定义companyUsers模型的Django替代登录实现需求
不依赖Django默认认证系统的自定义登录实现
1. 确认自定义模型结构
假设你的companyUsers模型至少包含用户名和哈希存储的密码字段(必须哈希,禁止明文存储):
# models.py from django.db import models class companyUsers(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(max_length=50, unique=True) password = models.CharField(max_length=255) # 存储哈希后的密码 # 可按需添加其他字段:email、phone等
2. 密码哈希处理
创建用户时,必须用Django的make_password生成哈希密码,示例:
# 可在Django shell或注册视图中执行 from django.contrib.auth.hashers import make_password from .models import companyUsers # 创建测试用户 user = companyUsers(username="test_user", password=make_password("your_password")) user.save()
3. 登录表单
用Django表单做前端输入验证:
# forms.py from django import forms class LoginForm(forms.Form): username = forms.CharField(label="用户名", max_length=50) password = forms.CharField(label="密码", widget=forms.PasswordInput)
4. 视图逻辑
处理登录请求、验证凭证、维护登录状态(通过session):
# views.py from django.shortcuts import render, redirect from django.contrib.auth.hashers import check_password from .models import companyUsers from .forms import LoginForm def login(request): if request.method == "POST": form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data["username"] password = form.cleaned_data["password"] # 查询用户 try: user = companyUsers.objects.get(username=username) # 验证密码哈希是否匹配 if check_password(password, user.password): # 将用户ID存入session,标记登录状态 request.session["user_id"] = user.id return redirect("dashboard") # 登录成功跳转到目标页面 else: form.add_error("password", "密码错误") except companyUsers.DoesNotExist: form.add_error("username", "用户不存在") return render(request, "login.html", {"form": form}) else: form = LoginForm() return render(request, "login.html", {"form": form}) # 登录后才能访问的页面示例 def dashboard(request): # 检查session中的用户ID user_id = request.session.get("user_id") if not user_id: return redirect("login") try: user = companyUsers.objects.get(id=user_id) return render(request, "dashboard.html", {"user": user}) except companyUsers.DoesNotExist: # 清除无效的session记录 del request.session["user_id"] return redirect("login") # 登出功能 def logout(request): # 清除所有session数据 request.session.flush() return redirect("login") # 自定义登录校验装饰器(可选,简化重复校验) def login_required(view_func): def wrapper(request, *args, **kwargs): user_id = request.session.get("user_id") if not user_id: return redirect("login") try: companyUsers.objects.get(id=user_id) return view_func(request, *args, **kwargs) except companyUsers.DoesNotExist: del request.session["user_id"] return redirect("login") return wrapper # 使用装饰器的示例视图 @login_required def profile(request): user = companyUsers.objects.get(id=request.session["user_id"]) return render(request, "profile.html", {"user": user})
5. 模板文件
登录页面(login.html)
<!-- templates/login.html --> <!DOCTYPE html> <html> <head> <title>用户登录</title> </head> <body> <h2>登录</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form> </body> </html>
仪表盘页面(dashboard.html)
<!-- templates/dashboard.html --> <!DOCTYPE html> <html> <head> <title>用户仪表盘</title> </head> <body> <h2>欢迎,{{ user.username }}!</h2> <a href="{% url 'logout' %}">退出登录</a> </body> </html>
6. URL配置
# urls.py from django.urls import path from . import views urlpatterns = [ path("login/", views.login, name="login"), path("dashboard/", views.dashboard, name="dashboard"), path("logout/", views.logout, name="logout"), path("profile/", views.profile, name="profile"), # 装饰器示例视图的URL ]
注意事项
- 确保
django.contrib.sessions在INSTALLED_APPS中,且django.contrib.sessions.middleware.SessionMiddleware在中间件配置里(Django默认已包含) - 模板必须添加
{% csrf_token %},否则POST请求会被Django的CSRF保护拦截 - 绝不允许明文存储密码,必须使用
make_password生成哈希值,用check_password验证匹配
内容的提问来源于stack exchange,提问作者user13726864
相关产品推荐
相关产品推荐

