Django用户注册、登录、注销(系统自带)

使用Django自带的用户认证系统编写认证、登录、注销

功能:

使用Django默认的User表

1)注册

  判断是否已存在此用户,存在的话提示报错“用户已存在”;

  判断两次输入的密码是否一致,不一致的话提示报错“密码不一致”。

 实现报错提示的方式有两种:

  第一种:在form表单中使用clean_函数进行定义判断函数,在views中进行的is_valid()判断时进行校验,并获取错误传送到模板中显示在前端。

  第二种:直接在views视图中判断

2)登录

  登录成功,跳转到主页index;

  登录不成功,初始化登录页面;

  跳转到注册页面。

3)主页

  直接访问主页,用户没有登录的话跳转到登录页面; 

  用户已登录显示用户登录名。

4)注销

  清除登录的session,退出登录

项目目录结构:

mysite/setting设置

注册应用:

更改时区和语言设置

from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^djauth/',include('djauth.urls',namespace='djauth')),

]
mysite/urls.py
from django.urls import re_path
from . import views
app_name='djauth'
urlpatterns=[
    re_path(r'^$',views.index),
    re_path(r'register/$',views.register,name="register"),
    re_path(r'login/$',views.login_view,name="login"),
    re_path(r'logout/$',views.logout_view,name="logout"),
]
djauth/urls.py
from django import forms
from django.contrib.auth.models import User
class login_form(forms.Form):
    username=forms.CharField(max_length=30)
    password=forms.CharField(widget=forms.PasswordInput)

class register_form(forms.Form):
    username=forms.CharField(max_length=30,label="姓名")
    email=forms.EmailField()
    password=forms.CharField(widget=forms.PasswordInput,min_length=3,label="密码")
    password_re=forms.CharField(widget=forms.PasswordInput,min_length=3,label="确认密码")

#第一种报错方式,使用form表单,views中捕捉
    # def clean_username(self):
    #     cd=self.cleaned_data
    #     user=User.objects.filter(username=cd['username'])
    #     if user:
    #         raise forms.ValidationError('用户已存在')
    #     return cd['username']
    # def clean_password_re(self):
    #     cd=self.cleaned_data
    #     if cd['password']!=cd['password_re']:
    #         raise forms.ValidationError("密码不一致")
    #     return cd['password_re']
djauth/forms.py
from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
import time
from django.contrib import auth
from django.contrib.auth.models import User
from . import forms
# Create your views here.
def index(request):
    if  request.user.is_authenticated:
        # request.user.username;;获取登录用户名
        print("UserAuth:",request.user.username)
        return render(request,"djauth/index.html")
    else:
        return redirect("/djauth/login/")

def register(request):
    errors=[]
    if request.method=='POST':
        RegisterForm=forms.register_form(request.POST)
        if RegisterForm.is_valid():
    # 第一种报错方式,捕捉form表单的报错
            # Register=RegisterForm.cleaned_data
            #
            # user=User.objects.create_user(username=Register['username'],
            #                               password=Register['password'],
            #                               email=Register['email']
            #                               )
            # user.save()
            # return HttpResponse("注册成功")
        #errors=RegisterForm.errors
        #第二种报错方式,直接在views中判断
            Register=RegisterForm.cleaned_data
            user_exist=User.objects.filter(username=Register['username']).exists()
            if user_exist:
                errors.append("用户已存在")
            if Register['password']!=Register['password_re']:
                errors.append("密码不一致")
            else:
                user=User.objects.create_user(username=Register['username'],
                                      password=Register['password'],
                                      email=Register['email']
                                      )
                user.save()
                return HttpResponse("注册成功")

    RegisterForm=forms.register_form()
    return render(request,"djauth/register.html",{"RegisterForm":RegisterForm,"errors":errors})

def login_view(request):
    error=[]
    curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    if request.method=='POST':
        LoginForm=forms.login_form(request.POST)
        if LoginForm.is_valid():
            Account=LoginForm.cleaned_data
            user=auth.authenticate(username=Account['username'],password=Account['password'])
            if user is not None:
                if user.is_active:
                    auth.login(request,user)
                    return redirect("/djauth/")
                else:
                    error.append("用户无效")
            else:
                error.append("账号或密码错误")
    else:
        LoginForm=forms.login_form()
    return render(request,'djauth/login.html',{"LoginForm":LoginForm,"curtime":curtime,"error":error})

def logout_view(request):
    auth.logout(request)
    return redirect("/djauth/login")
djauth/views.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}
    
    {% endblock %}</title>
</head>
<body>
{% block content %}

{% endblock %}
</body>
</html>
djauth/templates/djauth/base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>首页</h1>
<!--获取登录用户名:request.user.username或user.username-->
{% if request.user.is_authenticated %}
    {{ user.username }}
{% endif %}

<p><a href="{% url 'djauth:logout' %}">退出</a></p>
</body>
</html>
djauth/templates/djauth/index.html
{% extends "djauth/base.html" %}

{% block title %}
Login Page
{% endblock %}

{% block content %}
<h1>Login Page</h1>
    {% if error %}
        {{ error }}
    {% endif %}
    <p>时间:{{ curtime }}</p>
    <form action="" method="post">
    {% csrf_token %}
    {{ LoginForm.as_p }}
    <input type="submit" value="Login">
    </form>
    <p>没有账号?点击<a href="{% url 'djauth:register' %}">注册</a></p>
{% endblock %}
djauth/templates/djauth/login.html
{% extends "djauth/base.html" %}
{% block title %}
Register Page
{% endblock %}

{% block content %}
<h1>Register Page</h1>
    {% if errors %}
        <p>{{ errors }}</p>
    {% endif %}
    <form action="" method="post">
    {% csrf_token %}
    {% for foo in RegisterForm %}
        <p>{{ foo.label_tag }}{{ foo }} {{ errors.foo }}</p>
    {% endfor %}

    <input type="submit" value="注册">
    </form>
{% endblock %}
djauth/templates/djauth/register.html

猜你喜欢

转载自www.cnblogs.com/kikkiking/p/10113154.html