news 2026/6/20 15:38:47

Django本地登录系统:含注册页、登录页、登出功能与SQLite数据存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Django本地登录系统:含注册页、登录页、登出功能与SQLite数据存储

本文还有配套的精品资源,点击获取

简介:直接运行就能用的Django用户认证小项目,带完整的HTML登录/注册页面、密码加密存储、CSRF防护和会话保持功能。前端是纯HTML+CSS写的简洁表单,不依赖JavaScript框架;后端用Django内置auth模块处理用户创建、登录验证和登出逻辑,所有用户数据存进自带的db.sqlite3文件里。项目结构清晰,包含login和user两个应用,已配置好URL路由、视图函数、模板路径和基础样式,只要安装requirements.txt里的依赖(主要是Django),执行python manage.py runserver就能启动服务,浏览器打开localhost:8000/login即可测试账号登录流程。支持普通用户名密码注册与登录,登出后自动清除会话,适合想动手理解Django认证机制的新手练习,也适合嵌入到小型内部工具或原型系统中快速加个登录门槛。没有接入微信、手机号或第三方OAuth,完全离线可用,代码风格贴近Django官方教程写法。

1. 项目概述:为什么一个“能直接跑起来”的Django登录系统如此珍贵

你有没有过这样的经历:想给自己的小工具、内部报表页面或者原型系统加个登录门槛,就为了防止同事误点、或者让家人别乱改配置?结果一搜“Django 登录”,出来的全是零散的教程片段——有的只讲UserCreationForm怎么用,有的只说login()函数参数,还有的直接跳到JWT或OAuth2,中间缺了最关键的一环:从新建项目到浏览器里输入账号密码、点登录、看到“欢迎回来”这整个闭环,到底每一步该敲什么命令、改哪几行代码、模板文件放哪儿、URL怎么连起来?更糟的是,照着拼凑出来的代码跑起来,要么404找不到页面,要么登录成功但刷新一下又回到登录页,要么注册时密码明文存进数据库……最后卡在某个报错信息里,反复查文档却找不到对应场景的解释。

这个项目就是为解决这个问题而生的。它不是一个教学PPT,也不是一个需要你填空的骨架代码,而是一个开箱即用、结构完整、逻辑自洽的最小可行认证系统。核心关键词“Django登录”、“用户注册”、“SQLite认证”不是标签,而是它每一处设计的落脚点:所有视图都基于Django内置的django.contrib.auth模块构建,不绕弯子;注册和登录表单是原生HTML+CSS写的,没有JavaScript框架干扰,你能一眼看清<form>method="post"{% csrf_token %}的位置与作用;用户密码永远以哈希形式(bcrypt)存进db.sqlite3这个单一文件里,删掉它,整个用户库就清空,干净利落;登出操作不是简单跳转,而是调用auth.logout(request)并重定向到首页,确保session被彻底销毁。它面向两类人:Python初学者,可以把它当“活体教材”,一行行读代码,理解settings.pyAUTH_PASSWORD_VALIDATORS如何强制密码强度,MIDDLEWARE里的SessionMiddlewareCsrfViewMiddleware怎样协同工作;小型项目开发者,则可以直接把login/user/两个应用目录复制过去,改几行INSTALLED_APPSurlpatterns,5分钟内就拥有了一个安全、合规、无需维护的本地登录入口。它不追求炫酷,只解决一个最朴素的问题:让“有登录功能”这件事,变得像启动一个Python脚本一样确定、可预期、无歧义。

2. 整体架构与设计思路:为什么选择“原生Django + SQLite”这条路径

2.1 拒绝过度工程化:从需求倒推技术选型

很多新手一上来就想搞“高可用”“微服务”,结果连一个登录按钮都点不动。这个项目的起点非常务实:“我只需要一个页面,输入用户名密码,点登录,如果对就进后台,不对就提示错误;注册同理;登出后必须彻底退出。”围绕这个核心诉求,所有技术决策都服务于“最小阻力路径”。

  • 为什么不用第三方包(如django-allauth)?
    django-allauth确实强大,支持邮箱验证、社交登录、多因素认证。但它引入了至少15个新配置项、一套独立的模板继承体系、以及大量你暂时用不到的模型(SocialAccount,EmailAddress)。对于只想验证“用户名+密码”这一种方式的场景,它就像用航空母舰去送快递——功能过剩,学习成本陡增,调试路径变长。而Django内置的auth模块,仅需from django.contrib import auth一行导入,就能完成90%的基础认证工作,API清晰稳定,文档详尽,是官方明确推荐的“起步首选”。

  • 为什么坚持SQLite而非PostgreSQL或MySQL?
    这是最关键的设计取舍。PostgreSQL当然更“生产级”,但它需要你额外安装服务端、配置用户权限、管理数据库进程。而SQLite呢?它就是一个文件。db.sqlite3在项目根目录下,python manage.py migrate命令会自动创建它,python manage.py createsuperuser会往里面写数据,rm db.sqlite3就能一键重置。这种“零外部依赖”的特性,完美匹配“开箱即用”的定位。更重要的是,SQLite的ACID事务、行级锁机制,在单机、低并发的小型应用中完全够用。我试过用它支撑一个20人团队的内部工单系统,连续运行半年没出过一次锁表问题。它的局限性(如不支持ALTER COLUMN)在这个项目里根本不会触发——我们只做CRUD,不做表结构动态变更。

  • 为什么前端拒绝JavaScript框架?
    看似“落后”,实则精准。一个登录表单的核心交互只有三步:用户输入、提交表单、服务器返回结果(成功跳转或失败渲染错误)。这三步,原生HTML表单+Django模板的{{ form.username.errors }}{{ form.non_field_errors }}就能完美承载。引入Vue或React,你需要配置Webpack、处理跨域(虽然本地开发不涉及)、学习响应式数据绑定……这些复杂度与登录功能本身毫无关系。而纯HTML/CSS,意味着你可以用任何文本编辑器打开templates/login/login.html,修改<input type="password">的placeholder文字,保存,刷新浏览器,立刻生效。这种“所见即所得”的调试体验,对学习者而言,价值远超炫技。

2.2 应用职责划分:login与user的边界在哪里?

项目目录里有两个核心应用:loginuser。这不是随意命名,而是遵循Django“关注点分离”的最佳实践。

  • login应用:专注“认证流程”的胶水层
    它不负责创建用户,也不负责存储用户信息,它的唯一使命是协调认证动作。具体表现为:
  • views.py里定义login_view(处理GET显示表单、POST验证登录)、logout_view(执行登出逻辑)、register_view(处理注册请求);
  • urls.py里将/login//logout//register/这些URL路径映射到上述视图;
  • templates/login/下存放所有与登录流程强相关的HTML文件,如login.html(登录表单)、register.html(注册表单)、logged_out.html(登出成功页)。

  • user应用:承载“用户实体”的数据层
    它才是Django用户模型的真正管理者。虽然我们使用内置的User模型,但user应用的存在意义在于:

  • 将所有与用户数据相关的逻辑(如密码重置邮件模板、用户资料编辑)预留扩展接口;
  • models.py虽为空(因为复用内置模型),但其存在明确了“用户数据归属此处”的契约;
  • admin.py中注册UserAdmin,方便后续通过Django Admin后台管理用户(比如禁用某个账号)。

这种划分让代码具备极强的可维护性。假如未来要增加“忘记密码”功能,你只需在login应用里新增password_reset_view和对应URL,完全不影响user应用的结构。反之,若要为用户添加头像字段,你只需修改user/models.py,扩展User模型(通过OneToOneField关联自定义Profile模型),login应用的视图和模板几乎无需改动。

2.3 安全基石:CSRF、密码哈希与会话管理的三位一体

一个“能用”的登录系统和一个“安全”的登录系统,差距就在三个细节上,而这三个细节,Django都已为你封装好,只需正确启用。

  • CSRF防护:不只是模板里的{% csrf_token %}
    很多人以为只要在表单里加上{% csrf_token %}就万事大吉。其实,这只是冰山一角。真正的防护由三层构成:
    1.客户端{% csrf_token %}生成一个随机token,作为隐藏字段嵌入表单;
    2.中间件CsrfViewMiddleware在每次POST请求到达视图前,自动检查请求头中的X-CSRFToken或表单字段中的csrfmiddlewaretoken,并与服务端session中存储的token比对;
    3.服务端CSRF_COOKIE_SECURECSRF_COOKIE_HTTPONLY设置(本项目默认开启)确保cookie只能通过HTTPS传输且无法被JS读取。

    提示:如果你在本地开发时遇到CSRF错误,请检查settings.pyMIDDLEWARE是否包含'django.middleware.csrf.CsrfViewMiddleware',且位置在'django.contrib.sessions.middleware.SessionMiddleware'之后——顺序错了,CSRF token就无法绑定到session上。

  • 密码哈希:bcrypt为何是默认选择?
    Django默认使用PBKDF2算法,但本项目在settings.py中显式配置了PASSWORD_HASHERS = ['django.contrib.auth.hashers.BCryptPasswordHasher']。原因很简单:bcrypt是专为密码哈希设计的算法,它内置“盐值(salt)”和“计算轮数(rounds)”,能有效抵御彩虹表攻击和暴力破解。当你调用User.objects.create_user(username, email, password)时,Django不会存储明文密码,而是生成类似bcrypt_sha256$32$...的哈希字符串存入数据库。即使黑客拿到了db.sqlite3文件,也无法反向推导出原始密码。实测下来,一个8位随机密码,用现代GPU暴力破解bcrypt需要数百年。

  • 会话管理:session_key背后的生命周期
    登录成功后,Django会在django_session表(SQLite中)创建一条记录,其中session_key是随机字符串,session_data是加密后的用户ID等信息,expire_date是过期时间。关键点在于:auth.login(request, user)这行代码,不仅把用户对象挂载到request.user,更会调用request.session.create()生成新的session,并将user.id写入session_data。登出时,auth.logout(request)会调用request.session.flush(),删除该session记录,并清空request.session字典。这意味着,登出后即使你手动在浏览器地址栏输入/admin/,也会被重定向到登录页——因为request.user.is_authenticated此时为False

3. 核心细节解析与实操要点:从代码到浏览器的每一处关键

3.1 settings.py:安全配置的“总开关”

settings.py是整个项目的神经中枢,这里集中了所有影响认证行为的关键配置。新手常犯的错误,就是忽略其中几项看似不起眼的设置。

  • INSTALLED_APPS的顺序与必要项
    除了基础的django.contrib.admin等,以下三项是认证的刚需:
    python INSTALLED_APPS = [ # ... 其他应用 'django.contrib.auth', # 提供User模型、认证后端 'django.contrib.contenttypes', # auth模块依赖此,用于权限系统 'django.contrib.sessions', # 会话管理,login/logout依赖它 'login', # 我们的登录应用 'user', # 用户数据应用 ]
    注意:django.contrib.auth必须在django.contrib.sessions之前。因为auth模块的login()函数内部会调用session.save(),如果sessions未加载,就会报AttributeError: 'WSGIRequest' object has no attribute 'session'

  • MIDDLEWARE:安全中间件的黄金组合
    认证流程依赖于特定中间件的协作:
    python MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 必须在CsrfViewMiddleware之前 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 必须在AuthenticationMiddleware之前 'django.contrib.auth.middleware.AuthenticationMiddleware', # 必须在SessionMiddleware之后 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
    这个顺序不是随意的。SessionMiddleware必须在CsrfViewMiddleware之前,否则CSRF token无法绑定到session;AuthenticationMiddleware必须在SessionMiddleware之后,因为它需要从session中读取user_id来实例化request.user。一旦顺序错乱,轻则登录状态丢失,重则整个认证流程崩溃。

  • AUTH_PASSWORD_VALIDATORS:强制密码强度的“守门员”
    默认配置启用了4条校验规则:
    python AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'}, {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 8}}, {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'}, {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}, ]
    这意味着,注册时如果密码是12345678(纯数字)、password(常见弱口令)、或与用户名相同,表单提交会直接失败,并在{{ form.password1.errors }}中显示具体错误原因。这是防止用户设置弱密码的第一道防线,无需你写一行校验逻辑。

3.2 login/views.py:认证逻辑的“心脏地带”

login/views.py是整个系统最核心的文件,它把Django的认证能力翻译成具体的业务动作。

  • register_view:如何安全地创建用户?
    关键代码如下:
    ```python
    from django.contrib.auth import get_user_model
    from django.contrib.auth.forms import UserCreationForm
    from django.contrib import messages

def register_view(request):
if request.method == ‘POST’:
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save() # 这里自动调用set_password()进行哈希
messages.success(request, f’账户 {user.username} 创建成功!’)
return redirect(‘login’) # 重定向到登录页,避免重复提交
else:
form = UserCreationForm()
return render(request, ‘login/register.html’, {‘form’: form})
`` 注意点: -form.save()是安全创建用户的唯一正确方式。它内部会调用user.set_password(),确保密码被哈希,而不是直接赋值user.password = raw_password(这会导致明文存储); - 使用messages.success()而非HttpResponse,是为了在重定向后仍能显示提示信息,提升用户体验; -redirect(‘login’)而非redirect(‘/login/’),是因为我们使用了命名URL(path(‘login/’, views.login_view, name=’login’)`),这样即使将来修改URL路径,视图代码也无需改动。

  • login_view:登录成功的“临门一脚”
    ```python
    from django.contrib import auth
    from django.contrib.auth import authenticate

def login_view(request):
if request.method == ‘POST’:
username = request.POST.get(‘username’)
password = request.POST.get(‘password’)
user = authenticate(request, username=username, password=password)
if user is not None:
auth.login(request, user) # 关键!建立会话
return redirect(‘home’) # 假设home是登录后的首页
else:
messages.error(request, ‘用户名或密码错误’)
return render(request, ‘login/login.html’)
``authenticate()auth.login()是两个不可分割的动作:前者只做“验证”,返回User对象或None;后者才做“登录”,将用户ID写入session。漏掉auth.login(),用户永远处于未登录状态。另外,authenticate()函数会自动检查用户是否is_active=True,如果管理员在Admin后台禁用了该用户,此处会直接返回None`。

  • logout_view:登出的“彻底清除”
    python def logout_view(request): auth.logout(request) # 一行代码,干掉session和request.user return redirect('login') # 重定向到登录页
    这行auth.logout(request)会执行三件事:1)调用request.session.flush()删除session记录;2)将request.user设为AnonymousUser;3)发送user_logged_out信号(可用于扩展,如记录登出日志)。它比手动del request.session['user_id']可靠得多,因为session可能包含多个相关键值。

3.3 模板与表单:HTML里的安全细节

templates/login/login.htmltemplates/login/register.html是用户直接面对的界面,它们的安全性往往被忽视。

  • login.html中的CSRF与错误渲染
    ```html

    {% csrf_token %}
    {{ form.username }} {{ form.username.errors }}
    {{ form.password }} {{ form.password.errors }}
    {{ form.non_field_errors }}

``{{ form.non_field_errors }}是关键。当authenticate()返回None时,form.add_error(None, ‘用户名或密码错误’)会被调用,这个错误就属于“非字段错误”,必须用non_field_errors`来渲染,否则用户看不到任何提示。

  • register.html中的密码确认
    UserCreationForm默认包含password1password2两个字段,后者用于确认密码。它的clean_password2()方法会自动比对两者是否一致。如果用户输入1234561234567,错误会出现在{{ form.password2.errors }}中。这是防止用户手滑输错密码的最简单有效手段。

3.4 URL路由:连接视图与浏览器的“高速公路”

login/urls.py定义了用户访问的入口:

from django.urls import path from . import views urlpatterns = [ path('login/', views.login_view, name='login'), path('logout/', views.logout_view, name='logout'), path('register/', views.register_view, name='register'), ]

而根urls.py需要包含它:

from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('login.urls')), # 将/login/等路径委托给login应用 ]

注意:include('login.urls')必须放在admin之后,否则/admin/会被login应用的path('', ...)捕获,导致Admin后台无法访问。这是新手最常见的404错误来源之一。

4. 实操过程与核心环节实现:从零开始搭建与验证

4.1 环境准备与项目启动:5分钟走通全流程

假设你已安装Python 3.8+,以下是完整的、可复制粘贴的操作步骤:

  1. 解压资源包,进入项目根目录
    bash unzip 55QKuo1TEt4sANhn6dHz-master-63429a7501349ad1d90dc457763d6442f6ad04b2.zip cd 55QKuo1TEt4sANhn6dHz-master-63429a7501349ad1d90dc457763d6442f6ad04b2

  2. 创建并激活虚拟环境(强烈推荐)
    bash python -m venv venv source venv/bin/activate # Linux/Mac # venv\Scripts\activate # Windows

  3. 安装依赖
    bash pip install -r requirements.txt # requirements.txt 内容应为:Django==4.2.7

  4. 初始化数据库
    bash python manage.py migrate # 此命令会创建db.sqlite3文件,并在其中生成auth_user、django_session等表

  5. 创建超级用户(用于Admin后台)
    bash python manage.py createsuperuser # 按提示输入用户名、邮箱(可选)、密码

  6. 启动开发服务器
    bash python manage.py runserver # 输出:Starting development server at http://127.0.0.1:8000/

  7. 浏览器验证
    - 访问http://127.0.0.1:8000/login/→ 应看到简洁的登录表单;
    - 访问http://127.0.0.1:8000/register/→ 应看到注册表单;
    - 访问http://127.0.0.1:8000/admin/→ 输入刚才创建的superuser账号,应能进入Django Admin后台,看到Users列表。

4.2 注册与登录的完整链路验证

让我们亲手走一遍用户生命周期:

  1. 注册新用户
    - 打开http://127.0.0.1:8000/register/
    - 输入用户名testuser,密码SecurePass123!,再次输入相同密码;
    - 点击“注册”。页面应跳转到/login/,并显示绿色提示:“账户 testuser 创建成功!”;
    -验证:打开db.sqlite3文件(可用DB Browser for SQLite工具),查询auth_user表,找到testuser记录,查看password字段,内容应为bcrypt_sha256$...开头的长字符串,而非明文。

  2. 登录验证
    - 在/login/页面,输入testuserSecurePass123!
    - 点击“登录”。页面应跳转到/(即home视图,本项目中可设为重定向到/admin/或自定义首页);
    -验证:在浏览器开发者工具(F12)的Application → Storage → Cookies中,查找127.0.0.1域名下的sessionidcookie,其值应与数据库django_session表中的session_key匹配。

  3. 登出与状态清除
    - 访问/logout/(或点击页面上的登出链接);
    - 页面跳转回/login/
    -验证:再次打开Cookies面板,sessionidcookie已被删除;尝试直接访问/admin/,应被重定向到/login/?next=/admin/

4.3 数据库操作:SQLite文件的日常管理

db.sqlite3是你的用户数据库,掌握它的基本操作,能让你游刃有余:

  • 查看用户列表(命令行)
    bash sqlite3 db.sqlite3 sqlite> .tables # 输出:auth_group auth_group_permissions auth_permission auth_user ... sqlite> SELECT id, username, email, is_active FROM auth_user; # 查看所有用户及其状态

  • 禁用/启用用户(通过Admin后台)
    登录http://127.0.0.1:8000/admin/→ 点击Users→ 找到目标用户 → 取消勾选Active复选框 →Save。此后该用户无法再登录,authenticate()会返回None

  • 重置密码(命令行)
    如果忘记了superuser密码,无需修改数据库:
    bash python manage.py changepassword admin # 按提示输入新密码

  • 重置整个数据库(开发时常用)
    bash rm db.sqlite3 python manage.py migrate python manage.py createsuperuser # 一切回到初始状态

5. 常见问题与排查技巧实录:那些踩过的坑与独家心得

5.1 经典404错误:URL路径与视图不匹配

现象:浏览器访问http://127.0.0.1:8000/login/,返回Page not found (404)

排查步骤
1. 检查根urls.py是否包含path('', include('login.urls'))
2. 检查login/urls.pypath('login/', ...)的路径是否与浏览器地址栏完全一致(注意末尾斜杠);
3. 运行python manage.py show_urls(需先安装django-extensions)查看所有已注册URL,确认/login/是否存在。

实操心得:Django的URL匹配是严格区分大小写和斜杠的。path('Login/', ...)path('login/', ...)是两个不同路径。建议全部使用小写,并在path()中统一加末尾斜杠(Django默认APPEND_SLASH=True,会自动重定向)。

5.2 登录后无法保持状态:“登录成功,但刷新就掉线”

现象:输入账号密码,点击登录,页面跳转到首页,但几秒后又自动跳回登录页;或在Admin后台能看到用户在线,但自己写的视图中request.user.is_authenticatedFalse

根本原因SessionMiddleware未启用,或MIDDLEWARE顺序错误。

验证方法
- 在任意视图中添加print(request.session.session_key),如果输出None,说明session未创建;
- 检查settings.pyMIDDLEWARE是否包含'django.contrib.sessions.middleware.SessionMiddleware',且位置在'django.middleware.csrf.CsrfViewMiddleware'之前。

实操心得:我曾在一个项目中因复制粘贴错误,把SessionMiddleware写成了'django.contrib.sessions.middleware.SessionMiddleWare'(W大写了),导致session始终为None。调试时打印request.META,发现HTTP_COOKIE中根本没有sessionid,这才定位到中间件加载失败。

5.3 密码哈希失效:数据库里存的是明文

现象:在db.sqlite3中查询auth_user表,password字段内容是mypassword123这样的明文。

原因:在创建用户时,没有使用form.save()User.objects.create_user(),而是直接user.password = raw_password

修复方案
- 对于已存在的明文密码,可通过Django shell重置:
```bash
python manage.py shell

from django.contrib.auth import get_user_model
User = get_user_model()
u = User.objects.get(username=’testuser’)
u.set_password(‘NewSecurePass123!’)
u.save()
`` - 今后务必使用create_user()form.save()`。

5.4 CSRF验证失败:表单提交报403 Forbidden

现象:注册或登录时,浏览器控制台报403 Forbidden,Django日志显示Forbidden (CSRF token missing or incorrect)

排查清单
- 检查模板中是否有{% csrf_token %}
- 检查settings.pyMIDDLEWARE是否包含CsrfViewMiddleware
- 检查CSRF_COOKIE_SECURE设置:如果DEBUG=False且未使用HTTPS,需设为False,否则浏览器不会发送CSRF cookie;
- 检查CSRF_TRUSTED_ORIGINS:如果通过Nginx反向代理访问,需将代理域名加入此列表。

实操心得:在本地开发时,DEBUG=TrueCSRF_COOKIE_SECURE默认为False,所以通常没问题。但一旦部署到生产环境(DEBUG=False),必须配置CSRF_COOKIE_SECURE = True并启用HTTPS,否则CSRF保护会失效。这是从开发到上线最容易翻车的点。

5.5 表单错误不显示:用户不知道哪里填错了

现象:输入错误密码,点击登录,页面刷新,但没有任何错误提示。

原因:视图中未将form对象传递给模板,或模板中未正确渲染{{ form.non_field_errors }}

验证方法
- 在login_view中,确保return render(request, 'login/login.html', {'form': form})
- 在login.html中,确保有{{ form.non_field_errors }}且位于<form>标签内。

实操心得:Django表单的错误渲染是“懒加载”的。只有当form.is_valid()False时,form.errors才会被填充。所以,如果视图中if form.is_valid():分支后直接return redirect(),而else分支忘了return render(..., {'form': form}),那么form.errors永远不会被传递到模板,用户就永远看不到错误。

6. 后续扩展与定制化建议:让这个小系统真正为你所用

这个项目不是终点,而是一个坚实可靠的起点。根据你的实际需求,可以沿着几个方向平滑扩展:

  • 添加邮箱验证(增强安全性)
    不需要引入django-allauth。只需在register_view中,创建用户后不立即登录,而是生成一个带签名的验证链接(用django.core.signing),发送到用户邮箱。用户点击链接后,调用user.is_active = True并保存。这能有效防止机器人批量注册。

  • 集成简单权限控制(区分用户角色)
    Django内置的GroupPermission模型足够应付多数场景。例如,创建一个Editor组,赋予change_article权限;在视图中用@permission_required('myapp.change_article')装饰器,或在模板中用{% if perms.myapp.change_article %}控制按钮显示。

  • 美化前端(不破坏现有逻辑)
    static/css/style.css是样式入口。你可以用Bootstrap替换原生CSS,只需确保表单<input>name属性不变(如name="username"),Django视图就能继续正常接收数据。所有样式变更都在static/目录下,与后端逻辑完全隔离。

  • 迁移到生产数据库(无缝升级)
    当项目需要更高并发时,只需修改settings.py中的DATABASES配置:
    python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'myproject', 'USER': 'myuser', 'PASSWORD': 'mypass', 'HOST': 'localhost', 'PORT': '5432', } }
    然后运行python manage.py migrate,Django会自动在PostgreSQL中重建所有表结构,数据零丢失。

我个人在实际使用中发现,这个项目的最大价值,不在于它实现了什么,而在于它剔除了所有模糊地带。每一行代码的目的清晰可见,每一个配置项的影响范围明确可控。当你把db.sqlite3拖进DB Browser,亲眼看到密码被哈希、session被创建、用户被禁用,那种“掌控感”是任何教程都无法替代的。它教会你的不是某个API的用法,而是如何像一个真正的工程师那样,从需求出发,权衡利弊,选择最简单有效的工具,并亲手验证每一个环节的正确性。这,才是动手实践的终极意义。

本文还有配套的精品资源,点击获取

简介:直接运行就能用的Django用户认证小项目,带完整的HTML登录/注册页面、密码加密存储、CSRF防护和会话保持功能。前端是纯HTML+CSS写的简洁表单,不依赖JavaScript框架;后端用Django内置auth模块处理用户创建、登录验证和登出逻辑,所有用户数据存进自带的db.sqlite3文件里。项目结构清晰,包含login和user两个应用,已配置好URL路由、视图函数、模板路径和基础样式,只要安装requirements.txt里的依赖(主要是Django),执行python manage.py runserver就能启动服务,浏览器打开localhost:8000/login即可测试账号登录流程。支持普通用户名密码注册与登录,登出后自动清除会话,适合想动手理解Django认证机制的新手练习,也适合嵌入到小型内部工具或原型系统中快速加个登录门槛。没有接入微信、手机号或第三方OAuth,完全离线可用,代码风格贴近Django官方教程写法。


本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 15:31:16

Claude Opus 4.7深度解析:长上下文、自主检查与多模态语义编织

1. 项目概述&#xff1a;这不是一次普通升级&#xff0c;而是一次工作流重构的信号 “Claude Opus 4.7深夜炸场”——这个标题里没有一个字是夸张。我凌晨两点收到内部测试通道推送时&#xff0c;第一反应不是点开更新日志&#xff0c;而是立刻关掉正在跑的三个并行任务&#x…

作者头像 李华
网站建设 2026/6/20 15:18:58

基于Arnold变换的图像加密原理与Matlab实现详解

1. 项目概述&#xff1a;当图像遇上混沌——Arnold变换的加密魔法在数字信息无处不在的今天&#xff0c;图像作为信息的重要载体&#xff0c;其安全性问题日益凸显。无论是个人隐私照片、商业设计图纸&#xff0c;还是医疗影像资料&#xff0c;一旦在传输或存储过程中被非法窃取…

作者头像 李华
网站建设 2026/6/20 15:09:56

Python毕设项目: 基于 Django 框架的校园二手交易平台的设计与实现 面向高校的二手物品买卖交易管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/20 15:02:47

从SQL注入到权限提升:一次Web渗透测试实战案例剖析

1. 项目概述&#xff1a;一次非典型的“安全测试”之旅最近在和一些做安全研究的朋友交流时&#xff0c;聊到了一个挺有意思的现象&#xff1a;那些专门用来坑人的诈骗网站&#xff0c;其自身的安全性往往也脆弱得惊人。这就像一个偷东西的小偷&#xff0c;自己家的门锁却形同虚…

作者头像 李华