当前位置: 首页 > news >正文

Django实战项目-学习任务系统-用户登录

第一步:先创建一个Django应用程序框架代码

1,先创建一个Django项目

django-admin startproject mysite将创建一个目录,其布局如下:mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py

2,再创建一个Django应用

python manage.py startapp study_system将创建一个目录,其布局如下:study_systemstudy_system/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.py详情操作参考《编写你的第一个 Django 应用程序》相关文章。
https://mp.weixin.qq.com/s?__biz=Mzg2NDk2MTY3OA==&mid=2247483730&idx=1&sn=0cab44a659067ad145f55a2553c25f4e&chksm=ce6014b3f9179da5b4cf08d43fc13819d2941c7287b234b99beb3722a29e7b863df62e2bbf97&token=737388&lang=zh_CN#rd 

 

第二步:编写第一个功能-用户登录

1,数据库设置
修改 settings.py 配置信息,采用mysql数据库
文件目录结构:
./mysite/mysite/settings.py

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'world',"USER": "root","PASSWORD": "123456","HOST": "127.0.0.1","PORT": "3306","OPTIONS": {"init_command": "SET default_storage_engine=INNODB", },}
}

 

2,创建模型

编辑模型文件:
./mysite/study_system/models.py

from django.db import modelsclass StudyUser(models.Model):user_id = models.AutoField(primary_key=True, verbose_name='用户ID')username = models.CharField(max_length=50, verbose_name='用户名')password = models.CharField(max_length=50, verbose_name='密码')email = models.EmailField(max_length=100, verbose_name='邮箱')phone_num = models.CharField(max_length=20, verbose_name='手机号码')role = models.IntegerField(verbose_name='角色', choices=((1, '系统管理员'), (2, '辅导员'), (3, '学生')))parent_id = models.IntegerField(verbose_name='辅导员用户ID', null=False)created_time = models.DateTimeField(verbose_name='创建时间')update_time = models.DateTimeField(verbose_name='更新时间')class Meta:verbose_name = '学习用户表'verbose_name_plural = '学习用户表'# 用于模型的数据库表的名称db_table = "study_users"


3,激活模型

3.1. 修改 settings.py 配置信息:
./mysite/mysite/settings.py

INSTALLED_APPS = ["study_system.apps.StudySystemConfig", #添加的应用'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]


3.2. 运行 makemigrations 命令(记得进入 manage.py 所在目录):
$ python manage.py makemigrations study_system

生成如下文件:
./mysite/study_system/migrations/0001_initial.py

3.3. 再运行 sqlmigrate 命令(记得进入 manage.py 所在目录):
sqlmigrate 命令采用迁移名称并返回其模型建表SQL语句:
$ python manage.py sqlmigrate study_system 0001

3.4. 最后再运行 migrate 命令(记得进入 manage.py 所在目录):
$ python manage.py migrate
实现在数据库中创建这些模型表结构。


4,编写用户登录视图

4.1. 编辑视图代码:
./mysite/study_system/views.py

# 登录首页视图
def index(request):context = {}return render(request, "study_system/index.html", context)# 通用视图模型,FormView , 表单视图
class LoginView(FormView):template_name = 'study_system/index.html'form_class = LoginForm# 设置成功登录后的重定向URL# success_url = 'home/'success_url = reverse_lazy('study_system:home')  # 修改为完整的 URL# 登录表单校验def form_valid(self, form):username = form.cleaned_data['username']password = form.cleaned_data['password']# 内置用户权限认证方法,不管用# user = authenticate(username=username, password=password)user = self.validate_user(username, password)if user:# 设置 sessionself.request.session['username'] = usernameself.request.session['role'] = user.role'''在登录视图类中,当用户通过验证并且认证成功时,调用 super().form_valid(form) 方法会触发 Django 的默认行为,其中包括登录用户并将登录状态信息与请求相关联。这样,request.user 对象将被设置为已认证的用户,并且 request.user.is_authenticated 将返回 True。'''return super().form_valid(form)else:return self.render_to_response(self.get_context_data(form=form, error_message='用户或密码不匹配,登录失败.'))# 校验用户密码是否存在def validate_user(self, username, password):try:# 根据用户名和密码查询用户user = StudyUser.objects.get(username=username, password=password)# print('根据用户名和密码查询用户:'+str(user))return userexcept StudyUser.DoesNotExist:return None# 登录成功主页视图
def home(request):# 响应容器rsp_dict = {}# 获取当前用户名username = request.session.get('username')# 根据用户名获取用户对象cur_user = StudyUser.objects.get(username=username)print('根据用户名查询用户对象:' + str(cur_user))# print('session : '+str(username))rsp_dict['username'] = usernametemplate_name = "study_system/home.html"return render(request, template_name, rsp_dict)


4.2. 编辑表单验证代码:
./mysite/study_system/forms.py

from django import forms# 登录用户表单验证
class LoginForm(forms.Form):username = forms.CharField(max_length=100)password = forms.CharField(widget=forms.PasswordInput)


4.3. 编辑页面模板代码:

4.3.1. 网站首页登录页面
./mysite/study_system/templates/study_system/index.html

<!DOCTYPE html>
<html>
<head>{#    让网页自动适应PC端和移动端#}<meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge">{#    viewport是view portion的意思,用汉语说,就是“可见区域“。所以这个标签是在定义可见区域的规则。#}{#    width=device-width的意思是”宽度自动适配设备屏幕宽度"#}{#    inital-scale=1.0的意思是“宽度默认为设备屏幕的宽度”。#}<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>study system</title><link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css">{#    让网页自动适应PC端和移动端#}<style>.container {max-width: 400px;margin: 0 auto;padding-top: 100px;}</style>
</head>
<body><div class="container"><h1 class="text-center">study system</h1><form method="post" action="{% url 'study_system:login' %}">{% csrf_token %}{#        在Django中提交数据到后端服务的时候,为了安全,要使用CSRF(跨站请求伪造)。#}{#        跨站请求伪造的问题在于,服务器信任来自客户端的数据。#}{#        常规的做法是在template模板HTML文件中的form表单 中添加 {% csrf_token %} 可以实现安全提交。#}{#        当我们使用from表单标签来发送请求时,如果需要csrftoken认证,那么必须将它写到我们的form表单标签里面,里面的任意位置。#}{#        生成的隐藏标签为:#}{#        <input type="hidden" name="csrfmiddlewaretoken" value="WVHKQeAuMS4RGqyLybryIBAfacDa1Dp7PEaB3Badv3y0fvLqydX36xAVen6z3oS4">#}<div class="form-group"><input type="text" class="form-control" id="username" name="username" placeholder="username"></div><div class="form-group"><input type="password" class="form-control" id="password" name="password" placeholder="password"></div><div class="form-group"><button type="submit" class="form-control btn-primary">登录账号</button></div><div class="form-group"><a href="{% url 'study_system:register' %}" class="form-control btn-link text-right">注册账户</a></div><!-- 在 body 标签中添加一个隐藏的弹框 --><div class="form-group" id="errorModal" style="display: none;"><p id="alert" class="alert alert-warning">{{ error_message }}</p></div></form>
</div><script src="/static/study_system/jquery1.3.3/jquery.min.js"></script><!-- 在登录页面的合适位置调用弹框 -->
{% if error_message %}<script>$(document).ready(function () {// 设置错误消息内容$("#alert").text("{{ error_message }}");// 显示弹框$("#errorModal").show();});</script>
{% endif %}
</body>
</html>

4.3.2. 网站登录成功用户主页面
./mysite/study_system/templates/study_system/home.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>study system</title><script src="/static/study_system/jquery1.3.3/jquery.min.js"></script><link rel="stylesheet" href="/static/study_system/bootstrap3/css/bootstrap.min.css"><style type="text/css">.content_html {width: 100%;height: auto;margin: 0.2em auto 0.2em auto;border: 0.1em solid #68FE61;}</style>
</head>
<body>
<div>{% include "study_system/common/head.html" %}<div class="content_html">主内容区域</div>
</div>
</body>

4.3.3. 网站登录成功用户菜单页面
./mysite/study_system/templates/study_system/common/head.html

<div><!-- 头部logo区 --><div align="center"><a href="/study_system/home/">study system</a></div><!-- 头部菜单区 -->{#两端对齐的导航元素#}<ul class="nav nav-pills nav-justified"><li class="menu-head"><a href="#">任务管理</a></li><li class="menu-head"><a href="#">定时任务管理</a></li><li class="menu-head"><a href="#">兑换物品管理</a></li><li class="menu-head"><a href="#">用户管理</a></li><li class="menu-head"><a href="#"><strong>欢迎: {{ request.session.username }}</strong> 退出</a></li></ul>
</div>

4.4. 编辑应用 urls 配置代码:
./mysite/study_system/urls.py

from django.urls import path
from . import views
from .views import LoginViewapp_name = 'study_system'urlpatterns = [# 登录注册首页urlpath('', views.index, name='index'),path('login/', LoginView.as_view(), name='login'),path('home/', views.home, name='home'),
]


4.5. 编辑项目 urls 配置代码:
./mysite/mysite/urls.py

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("study_system/", include("study_system.urls")),    # 应用urlspath('admin/', admin.site.urls),    # admin后台管理 urls
]

第三步:运行测试-用户登录功能

 -------------------------------------------------------------end -------------------------------------------------------------

相关文章:

Django实战项目-学习任务系统-用户登录

第一步&#xff1a;先创建一个Django应用程序框架代码 1&#xff0c;先创建一个Django项目 django-admin startproject mysite将创建一个目录&#xff0c;其布局如下&#xff1a;mysite/manage.pymysite/__init__.pysettings.pyurls.pyasgi.pywsgi.py 2&#xff0c;再创建一个…...

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解&#xff0c;没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列&#xff0c;借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节&#xff08;不含代码&#xff09;可…...

做外贸独立站选Shopify还是WordPress?

现在确实会有很多新人想做独立站&#xff0c;毕竟跨境电商平台内卷严重&#xff0c;平台规则限制不断升级&#xff0c;脱离平台“绑架”布局独立站&#xff0c;才能获得更多流量、订单、塑造品牌价值。然而&#xff0c;在选择建立外贸独立站的过程中&#xff0c;选择适合的建站…...

echarts的bug,在series里写tooltip,不起作用,要在全局先写tooltip:{}才起作用,如果在series里写的不起作用就写到全局里

echarts的bug&#xff0c;在series里写tooltip&#xff0c;不起作用&#xff0c;要在全局先写tooltip&#xff1a;{show:true}才起作用&#xff0c;如果在series里写的不起作用就写到全局里 series里写tooltip不起作用&#xff0c;鼠标悬浮在echarts图表上时不显示提示 你需要…...

jmeter分布式压测

一、什么是压力测试&#xff1f; 压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试&#xff0c;属于性能测试的范畴。 压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行被测软件系统&#xff…...

consulmanage部署

一、部署consul 使用yum方式部署consul yum install -y yum-utils yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo yum -y install consul 执行以下命令获取uuid密钥并记录下来 uuidgen 编辑consul配置文件 vi /etc/consul.d/consul.h…...

大数据软件项目的验收流程

大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目验收计划制定&#xff1a; 在…...

《第一行代码Andorid》阅读笔记-第一章

这篇文章是我自己的《第一行代码Andorid》的阅读笔记&#xff0c;虽然大量参考了别人已经写好的一些笔记和代码但是也有自己的提炼和新的问题在里面&#xff0c;我也会放上参考文章链接。 学习重点 Android系统的四大组件&#xff1a; &#xff08;1&#xff09;活动&#xff…...

Educational Codeforces Round 146 (Rated for Div. 2)(VP)

写个题解 A. Coins void solve(){ll n, k; cin >> n >> k;bl ok true;if (n &1 && k %2 0) ok false;print(ok ? yes : no); } B. Long Legs void solve(){db x, y; cin >> x >> y;if (x < y) swap(x, y);int t1 ceil(sqrt(x))…...

9.30国庆

消息队列完成进程间通信 #include <myhead.h>#define size sizeof(msg_ds)-sizeof(long) //正文大小//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }msg_ds;//创建子线程构造体 void *task1(void *arg) {//创造第二个key值ke…...

java基础-第4章-面向对象(二)

一、static关键字 静态&#xff08;static&#xff09;可以修饰属性和方法。 称为静态属性&#xff08;类属性&#xff09;、静态方法&#xff08;类方法&#xff09;。 静态成员是全类所有对象共享的成员。 在全类中只有一份&#xff0c;不因创建多个对象而产生多份。 不必创…...

flex加 grid 布局笔记

<style> .flex-container { display: flex; height: 100%; /* 设置容器的高度 */ } .wide { display: flex; padding: 10px; border: 1px solid lightgray; text-align: center; justify-content: …...

最高评级!华为云CodeArts Board获信通院软件研发效能度量平台先进级认证

9月26日&#xff0c;华为云CodeArts Board获得了中国信通院《云上软件研发效能度量分级模型》的先进级最高级评估&#xff0c;达到了软件研发效能度量平台评估的通用效能度量能力、组织效能模型、项目效能模型、资源效能模型、个人效能模型、研发效能评价模型、项目管理域、开发…...

图像上传功能实现

一、后端 文件存放在images.path路径下 package com.like.common;import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annot…...

03_Node.js模块化开发

1 Node.js的基本使用 1.1 NPM nodejs安装完成后&#xff0c;会跟随着自动安装另外一个工具npm。 NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。 2020年3月17日&…...

Nginx支持SNI证书,已经ssl_server_name的使用

整理了一些网上的资料&#xff0c;这里记录一下&#xff0c;供大家参考 什么是SNI&#xff1f; 传统的应用场景中&#xff0c;一台服务器对应一个IP地址&#xff0c;一个域名&#xff0c;使用一张包含了域名信息的证书。随着云计算技术的普及&#xff0c;在云中的虚拟机有了一…...

Hive【Hive(六)窗口函数】

窗口函数&#xff08;window functions&#xff09; 概述 定义 窗口函数能够为每行数据划分 一个窗口&#xff0c;然后对窗口范围内的数据进行计算&#xff0c;最后将计算结果返回给该行数据。 语法 窗口函数的语法主要包括 窗口 和 函数 两个部分。其中窗口用于定义计算范围…...

Met no ‘TRANSLATIONS’ entry in project

这里写自定义目录标题 问题描述&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 多工程项目&#xff0c;执行完update Translation生成了.ts文件&#xff0c;也用翻译工具翻译完了&#xff0c;执行release时&#xff0c;报错“Met no ‘TRANSLATIONS’ entry in proje…...

Leetcode901-股票价格跨度

一、前言 本题基于leetcode901股票价格趋势这道题&#xff0c;说一下通过java解决的一些方法。并且解释一下笔者写这道题之前的想法和一些自己遇到的错误。需要注意的是&#xff0c;该题最多调用 next 方法 10^4 次,一般出现该提示说明需要注意时间复杂度。 二、解决思路 ①…...

“传统文化宣传片+虚拟人动捕设备”前景如何?

在数字化时代的发展下&#xff0c;动捕设备的加入&#xff0c;让传播传统文化的虚拟人更具生动表现&#xff0c;拉近人们与传统文化的距离&#xff0c;通过虚拟人动作捕捉动画宣传片&#xff0c;引起更多人对传统文化的关注与传承。 *图片源于网络 深圳文博会创意短片《嗨ICIF…...

节假日moc服务数据:解决用户99%的IT问题

Hi~ 伙伴们&#xff0c;这个国庆假期过得怎么样? 节后第一个工作日如期而至&#xff0c; 忙碌是消除倦怠的最佳良药。 回顾8天假日moc工程师的一组服务数据&#xff0c; 处理事件184起&#xff0c;工单23条。 其中&#xff0c;较为典型案例如下&#xff1a; 1、福建某附属医院…...

WOL唤醒配置(以太网、PHY、MAC)

目录 wol 以太网 MAC PHY RMII 通信配置 总结 wol Wake-on-LAN简称WOL&#xff0c;WOL&#xff08;网络唤醒&#xff09; 是一种标准网络协议&#xff0c;它的功效在于让已经进入休眠状态或关机状态的计算机&#xff0c;透过局域网&#xff08;多半为以太网&#xff…...

MySQL复制,约束条件,查询与安全控制

MySQL之复制 复制表 我有一个表 mysql> show tables; ------------------ | Tables_in_school | ------------------ | student | ------------------mysql> select * from student; -------------------------------------------- | id | name | sec |…...

Java ES 滚动查询

滚动查询&#xff08;Scroll Query&#xff09;是 Elasticsearch 提供的一种机制&#xff0c;用于处理大量数据的查询。它允许你在多个请求之间保持“游标”&#xff0c;以便在后续请求中获取更多的结果。 以下是滚动查询的基本工作原理&#xff1a; 1 初始查询: 客户端发送一…...

机器学习算法基础--KNN算法分类

文章目录 1.KNN算法原理介绍2.KNN分类决策原则3.KNN度量距离介绍3.1.闵可夫斯基距离3.2.曼哈顿距离3.3.欧式距离 4.KNN分类算法实现5.KNN分类算法效果6.参考文章与致谢 1.KNN算法原理介绍 KNN&#xff08;K-Nearest Neighbor&#xff09;工作原理&#xff1a; 在一个存在标签的…...

深入探究 C++ 编程中的资源泄漏问题

目录 1、GDI对象泄漏 1.1、何为GDI资源泄漏&#xff1f; 1.2、使用GDIView工具排查GDI对象泄漏 1.3、有时可能需要结合其他方法去排查 1.4、如何保证没有GDI对象泄漏&#xff1f; 2、进程句柄泄漏 2.1、何为进程句柄泄漏&#xff1f; 2.2、创建线程时的线程句柄泄漏 …...

BLE协议栈1-物理层PHY

从应届生开始做ble开发也差不读四个月的时间了&#xff0c;一直在在做上层的应用&#xff0c;对蓝牙协议栈没有过多的时间去了解&#xff0c;对整体的大方向概念一直是模糊的状态&#xff0c;在开发时也因此遇到了许多问题&#xff0c;趁有空去收集了一下资料来完成了本次专栏&…...

光伏储能直流系统MATLAB仿真(PV光伏阵列+Boost DCDC变换器+负载+双向DCDC变换器+锂离子电池系统)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

C++三大特性——继承(上篇)

文章目录 目录 一、继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 一、继承的概念及定义 1.1继承的概念 继承(inherita…...

docker系列(9) - docker-compose

文章目录 9. compose编排9.1 介绍9.2 安装9.3 compose常用命令9.4 实战Springboot部署9.4.1 准备组件配置文件9.4.1.1 redis的配置文件9.4.1.2 MySQL的配置文件9.4.1.3 SpringBoot打包文件 9.4.2 准备docker-compose.yml9.4.3 启动服务9.4.4 测试验证 9.5 实战ElasticsearchKib…...