• django实现用户的注册、登录、注销功能


    创建django项目的步骤:Django项目的创建步骤-CSDN博客

    一、前置工作

    配置数据库,设置数据库引擎为mysql

    1、在settings文件中找到DATABASES, 配置以下内容
    DATABASES = {
        "default": {
            'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
            'NAME': 'django_test',  # 连接的数据库, 一定要存在
            'HOST': '127.0.0.1',  # mysql的ip地址, 这里是本地
            'PORT': 3306,  # mysql的默认端口
            'USER': 'root',  # mysql的用户名
            'PASSWORD': 'xxx'  # mysql的密码
        }
    }

    可能会提示以下内容:

    安装即可: pip install mysqlclient -i  https://pypi.tuna.tsinghua.edu.cn/simple

    二、编写用户模型

    django中使用ORM来存数据到数据库

    ORM模型(对象关系映射):

     一个 模型类对应数据库中的一张表

    一个属性对应数据库中的一个字段

    用户表的字段:用户名、密码(可以自己扩展)

    1、用户模型

    2、创建好模型后要执行迁移数据的命令:

    生成迁移文件:python manage.py  makemigrations

    迁移生效(同步到数据库):python manage.py  migrate

    3、迁移成功后,migrations文件夹下会出现迁移文件,该文件记录着模型的相关信息,001表示第一次迁移.

    三、编写表单校验,以注册表单校验为例

    使用django自带的Form类来实现校验

    1、对字段的校验,这里只截了用户名的校验,其他字段都差不多

    2、对整个表单的校验:

    User需要从models.py文件中导入

    3、form表单中自定义的其他方法:

    四、编写前端页面,纯html,文件写在templates文件夹中

    使用了模板的方式嵌入数据

    超链接的跳转连接:{% url "命名空间:路由的name值" %},有命名空间一定要标注命名空间,没有则:{% url "路由的name值" %}

    1、index.html

    2、register.html

    form.non_field_errors:表当校验时,表单的错误,就是forms.py文件中的

    raise  forms.ValidationError("错误信息")。

    form.errors.username: 表单校验时,用户名的错误,就是forms.py文件中的error_messages信息,密码校验也是如此。

    3、login.html


     

    五、编写视图类来实现登录、注册功能

    如果是get请求就执行get方法,是post请求就执行post方法,在form标签中的methos方法中可以指定。

    form.is_valid():用来校验表单,校验成功返回True, 失败则返回False。

    post的方法的实例化表单对象:实例化表单对象时一定要加request.POST,否则拿不到数据。

    redirect:  重定向到其他视图函数。

    form对象:实例化表单对象,用来进行表单的各种存在,校验,错误信息等待

    request.session['username'] = request.POST['username']:  设置session值为用户名(其他值也可以)

    六、编写首页和注销视图函数
    1、首页函数

    request.session.get():通过注册时设置的session中来获取用户,通过这个判断是否有登录的用户,可以与前端交互,有的话就显示注销,没有的话显示注册和登录

    2、注销函数

    清除session值即可

    七、编写路由
    1、在主路由中include分路由,并设置命名空间

    命名空间:当有多个应用时建议用, 能更好的区分各个应用,使用namespace关键字设置

    2、在app下创建一个urls.py文件,编写以下内容

    注意:一定要加app_name, 视图类一定要加.as_view()

    八、django自带的管理后台

    使用python manage.py createtsuperuser创建超级用户

    1、在admin.py文件中注册模型

    list_display:在后台管理中要显示的字段

    admin.site.site_header:后台管理的标题

    2、在模型(models.py)中添加

    3、使用注册的超级用户登录

    九、具体的文件
    1、models.py
    1. from django.db import models
    2. class User(models.Model):
    3. # 定义变量,对应数据库的表的字段
    4. # username参数:参数1:后台管理显示的内容,参数2:最大长度, CharField类型必须指定,参数3:不能为空,参数4:唯一
    5. username = models.CharField('用户名', max_length=10, null=False, unique=True)
    6. password = models.CharField('密码', max_length=255, null=False)
    7. # create_time参数:参数2:记录数据第一次创建的时间,自动记录到数据库
    8. create_time = models.DateTimeField('注册时间', auto_now_add=True)
    9. # 设置后台管理
    10. class Meta:
    11. app_label = 'app' # 属于那个app
    12. verbose_name = '用户'
    13. verbose_name_plural = verbose_name
    14. # 输出对象时用到的
    15. def __str__(self):
    16. return self.username
    2、forms.py
    1. from django import forms
    2. from .models import User
    3. class RegisterForm(forms.Form):
    4. # 用户名
    5. username = forms.CharField(
    6. required=True, # 不能为空,必须
    7. max_length=10, # 最大长度
    8. min_length=4, # 最小长度
    9. error_messages={
    10. 'required': "不能为空",
    11. 'max_length': "长度不能大于10",
    12. 'min_length': "长度不能小于4",
    13. }
    14. )
    15. # 密码
    16. password = forms.CharField(
    17. required=True, # 不能为空,必须
    18. max_length=16, # 最大长度
    19. min_length=8, # 最小长度
    20. error_messages={
    21. 'required': "不能为空",
    22. 'max_length': "长度不能大于16",
    23. 'min_length': "长度不能小于8",
    24. }
    25. )
    26. # 校验
    27. def clean(self):
    28. # 获取输入的用户名
    29. username = self.cleaned_data.get('username')
    30. user = User.objects.filter(username=username) # 获得一个查询集,可以理解为一个列表
    31. # 用户存在
    32. if user.exists():
    33. raise forms.ValidationError("用户已存在")
    34. return self.cleaned_data
    35. # 存入数据库
    36. def save(self):
    37. username = self.cleaned_data.get('username')
    38. password = self.cleaned_data.get('password')
    39. # 存入数据库
    40. user = User(username=username, password=password)
    41. user.save()
    42. class LoginForm(forms.Form):
    43. # 用户名
    44. username = forms.CharField(
    45. required=True, # 不能为空,必须
    46. max_length=10, # 最大长度
    47. min_length=4, # 最小长度
    48. error_messages={
    49. 'required': "不能为空",
    50. 'max_length': "长度不能大于10",
    51. 'min_length': "长度不能小于4",
    52. }
    53. )
    54. # 密码
    55. password = forms.CharField(
    56. required=True, # 不能为空,必须
    57. max_length=16, # 最大长度
    58. min_length=8, # 最小长度
    59. error_messages={
    60. 'required': "不能为空",
    61. 'max_length': "长度不能大于16",
    62. 'min_length': "长度不能小于8",
    63. }
    64. )
    65. # 校验
    66. def clean(self):
    67. # 获取输入的信息
    68. username = self.cleaned_data.get('username')
    69. password = self.cleaned_data.get('password')
    70. user = User.objects.filter(username=username) # 获得一个查询集,可以理解为一个列表
    71. if user.exists():
    72. if user[0].password != password:
    73. raise forms.ValidationError("密码错误")
    74. else:
    75. raise forms.ValidationError("用户不存在")
    76. return self.cleaned_data
    3、admin.py
    1. from django.contrib import admin
    2. from .models import User
    3. # Register your models here.
    4. @admin.register(User)
    5. class UserAdmin(admin.ModelAdmin):
    6. list_display = ['id', 'username', 'create_time']
    7. admin.site.site_header = 'django后台管理'
    4、views.py
    1. from django.shortcuts import render, HttpResponse, redirect
    2. from django.views import View
    3. from .models import User
    4. from .forms import RegisterForm, LoginForm
    5. # Create your views here.
    6. def index(request):
    7. username = request.session.get('username', default=0) # 通过session获取用户名,给默认值防止报错
    8. user = User.objects.filter(username=username).first()
    9. return render(request, 'index.html', {'user': user})
    10. class RegisterView(View):
    11. def get(self, request):
    12. form = RegisterForm()
    13. return render(request, 'register.html', {'form': form})
    14. def post(self, request):
    15. form = RegisterForm(request.POST)
    16. if form.is_valid():
    17. form.save()
    18. return redirect('app:login')
    19. return render(request, 'register.html', {'form': form})
    20. class LoginView(View):
    21. def get(self, request):
    22. form = LoginForm()
    23. return render(request, 'login.html', {'form': form})
    24. def post(self, request):
    25. form = LoginForm(request.POST)
    26. print("登录")
    27. if form.is_valid():
    28. # 设置session
    29. request.session['username'] = request.POST['username']
    30. return redirect('app:index')
    31. return render(request, 'login.html', {'form': form})
    32. # 注销
    33. def Logout(request):
    34. request.session.clear() # 清除session
    35. return redirect('app:index')
    5、app中的urls.py
    1. from django.urls import path
    2. from .views import *
    3. app_name = 'app'
    4. urlpatterns = [
    5. path('', index, name='index'), # 首页
    6. path('register/', RegisterView.as_view(), name='register'), # 注册
    7. path('login/', LoginView.as_view(), name='login'), # 登录
    8. path('logout', Logout, name='logout'), # 注销
    9. ]
    6、主路由urls.py
    1. from django.contrib import admin
    2. from django.urls import path, include
    3. urlpatterns = [
    4. path("admin/", admin.site.urls),
    5. path('', include('app.urls', namespace='app'))
    6. ]
    7、index.html
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>首页title>
    6. head>
    7. <body>
    8. {% if user %}
    9. <h1>欢迎{{ user.username }}进入首页!!!h1>
    10. <a href="{% url 'app:logout' %}">注销a>
    11. {% else %}
    12. <h1>请注册或登录h1>
    13. <a href="{% url 'app:register' %}">注册a>
    14. <a href="{% url 'app:login' %}">登录a>
    15. {% endif %}
    16. body>
    17. html>
    8、register.html
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>注册title>
    6. head>
    7. <body>
    8. <h3>注册h3>
    9. <a href="{% url 'app:login' %}">登录a>|
    10. <a href="{% url 'app:index' %}">首页a>
    11. <form action="{% url 'app:register' %}" method="post">
    12. {% csrf_token %}
    13. <div><p style="color: red">{{ form.non_field_errors }}p>div>
    14. <div>
    15. <lable>用户名lable>
    16. <label>
    17. <input type="text" name="username">
    18. label>
    19. <p style="color: red">{{ form.errors.username }}p>
    20. div>
    21. <div>
    22. <lable>密码lable>
    23. <label>
    24. <input type="password" name="password">
    25. <p style="color: red">{{ form.errors.password }}p>
    26. label>
    27. div>
    28. <button type="submit">注册button>
    29. form>
    30. body>
    31. html>
    9、login.html
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>登录title>
    6. head>
    7. <body>
    8. <h3>登录h3>
    9. <a href="{% url 'app:register' %}">注册a>|
    10. <a href="{% url 'app:index' %}">首页a>
    11. <form action="{% url 'app:login' %}" method="post">
    12. {% csrf_token %}
    13. <div><p style="color: red">{{ form.non_field_errors }}p>div>
    14. <div>
    15. <lable>用户名lable>
    16. <label>
    17. <input type="text" name="username">
    18. <p style="color: red">{{ form.errors.username }}p>
    19. label>
    20. div>
    21. <div>
    22. <lable>密码lable>
    23. <label>
    24. <input type="password" name="password">
    25. <p style="color: red">{{ form.errors.password }}p>
    26. label>
    27. div>
    28. <button>登录button>
    29. form>
    30. body>
    31. html>

  • 相关阅读:
    MinIO图片正常上传不可查看,MinIO通过页面无法设置桶为public
    Linux进阶-文件
    SpringBoot 自动扫描第三方包及spring.factories失效的问题
    浅析影响银行小微信贷业务精细化发展的六大要素
    ZYNQ_project:key_beep
    论文学习记录随笔 多标签之LSML
    C和指针 第3章 语义“陷阱” 3.5 空指针并非字符串
    在TMP中计算书名号《》高度的问题
    信息学奥赛一本通:1108:向量点积计算
    HBase完全分布式搭建 | 集群建表测试
  • 原文地址:https://blog.csdn.net/chenchun0458/article/details/140446630