django 的登陆注册详解

首先,创建一个django项目 创建一个app,这里以app01来表示

1.打开settings 开始配置文件:

​ 1.1将app01添加到app配置中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.BooktestConfig',
]

​ 1.2.修改数据库配置,配置成自己的

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'表名',
        'HOST':'ip地址',
        'USER':'root', 数据库用户名
        'PASSWORD':'数据库密码',
    }
}

​ 1.3.修改pycharm中的语言文字

LANGUAGE_CODE = 'zh-hans'

​ 1.4.添加静态文件路径

STATICFILES_DIRS =[
    os.path.join(BASE_DIR,'static',)
]           拼接    当前项目地址的绝对路径 + static 静态文件名

2.打开urls.py文件开始配置url路径:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
从app01中导入views文件 函数
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^register/', views.register, name='register'), 配置注册路径
    url(r'', views.login,name='login'),
]配置登陆路径,打开即是登陆页面

3.考虑设计表结构:

from django.db import models

role_choices = (('user','用户'),
                ('manage','管理员'))

#用户表
class User(models.Model):
    username=models.EmailField(max_length=32,verbose_name='用户名',unique=True)     email类型的用户名   unique 确认唯一
    password=models.CharField(max_length=32,verbose_name='密码')
    user_id=models.CharField(max_length=32,verbose_name='用户校园id')
    user_name=models.CharField(max_length=32,verbose_name='用户姓名')
    role_name=models.CharField(max_length=32,choices=role_choices,default='user',verbose_name='角色名称')         
    choices选择=选择的值   default 默认选择用户
phone=models.BigIntegerField(blank=True,null=True,verbose_name='手机号')

4.在views中开始写登陆函数:

from django.shortcuts import render,HttpResponse,redirect,reverse
from  booktest import models
import hashlib

def login(request):
    if request.method=='GET':  判断发送的请求是否是get请求
        return render(request,"login1.html")
                       是的话返回登陆页面
    elif request.method=='POST':
        判断发送的请求是否是post请求
        username=request.POST.get('username')
        获取前端发送过来的账号
        password=request.POST.get('password')
        获取前端发过来的密码
        md5 = hashlib.md5()
        md5.update(password.encode('utf-8'))
        password=md5.hexdigest()
        使用hashlib md5来给password进行加密
        if models.User.objects.filter(username=username,password=password):
            判断获取到的账号和密码与数据库比对 是否一致
            return  HttpResponse('登陆成功')
        一致则返回页面(写着登陆成功的页面)
        else: 
            return  render(request,'login1.html',{'error':'用户名或密码错误'})   不一致则返回登陆页面,给用户提醒说用户名或密码有误

5.写出登陆页面(或者从(jq22.com中爬取一个页面))

在templates文件下创建login.html登陆页面
在该项目文件下创建一个static文件夹,用来存放各种静态文件
在static文件下创建文件夹css,js,imgs,等静态文件夹
在login.html中敲代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>登陆</title>
    {% load static %}      导入静态文件  
    <link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}"> 
    使用ctrl +r来进行替换,进行查找替换静态文件的路径,防止爬取的css,js出现路径找不到的问题
    <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
    同上
    <link rel="stylesheet" type="text/css" href="{% static 'css/animate-custom.css' %}">
    同上
</head>
<body>
<div class="container">

    <header>
    </header>
    <section>
        <div id="container_demo">
            <div id="wrapper">
                <div id="login" class="animate form">
                    <form action=""  method="post" autocomplete="on">
        #找到form标签  action='' 提交到当前的路径下 method='post' 提交方法为post方法
                        {% csrf_token %}  使form可以提交post请求
                        <h1>Log in</h1>
                        <p>
                            <label for="username" class="uname" data-icon="u"> Your email or username </label>   提示用户名
                            <input id="username" name="username" required="required" type="text"     
                                   placeholder="请输入账号">
                        </p> 提示输入账号
                        <p>
                            <label for="password" class="youpasswd" data-icon="p"> Your password </label>   提示密码
                            <input id="password" name="password" required="required" type="password"
                                   placeholder="请输入密码">
                        </p> 提示输入密码
                        <p>{{ error }}</p>  后端验证出错返回报错在这里展现
                        <p class="keeplogin">
                            <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping">
                            <label for="loginkeeping">Keep me logged in</label>
                        </p>
                        <p class="login button">
                            <input type="submit" value="Login">
                        </p> 提交post请求  必须 type='submit'
                        <p class="change_link">
                            还没有注册 ?
                            <a href="{% url 'register' %}" >加入我们</a>                          a标签 跳转到注册页面
                        </p>
                    </form>
                </div>
                </div>
        </div>
    </section>
</div>

</body>
</html>

6.写注册模块

6.1 先在url地址中写入
url(r'^register/', views.register, name='register'),
6.2 在views函数文件下写入注册模块
#注册模块
from django import  forms
from django.core.exceptions import ValidationError
import hashlib

class Regform(forms.ModelForm):
    re_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'确认密码'}))
    自定义数据,用来进行确认密码专门定义
    class  Meta:
        model = models.User    对那个数据库中的类
        fields = '__all__'      所有的数据
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)  继承父类的
        #自定义的操作
        self.fields['username'].widget.attrs['placeholder'] = '用户名'
        self.fields['password'].widget=forms.PasswordInput(attrs={'placeholder':'密码'})
        self.fields['user_id'].widget.attrs['placeholder'] = '用户校园id'
        self.fields['user_name'].widget.attrs['placeholder'] = '用户姓名'
        self.fields['role_name'].widget.attrs['placeholder'] = '角色名称'
        self.fields['phone'].widget.attrs['placeholder'] = '手机号'

    def clean(self):      创建一个全局钩子
        self._validate_unique = True   #在数据库中校验唯一性
        password = self.cleaned_data.get('password','')  
        这里的('password','')有秘密: 是如果获取到的密码为空,就选择'',防止二次密码都不输造成下面的加密出现错误
        re_password = self.cleaned_data.get('re_password')  
        判断两次密码是否一致
        if password == re_password:
            md5=hashlib.md5()
            md5.update(password.encode('utf-8'))
            self.cleaned_data['password'] = md5.hexdigest()
                修改获取到的密码进行hashlib加密
            return self.cleaned_data  将数据传出
        self.add_error('password',"两次密码不一致")  不一致则将该报错加入到错误中 该错误是全局的错误
        raise  ValidationError('两次密码不一致') 传出错误,该错误是输入密码哪里的报错

这么一堆就是使用了modleform模块来定义了一个Regform类,使得注册模块更加简便     
        
def register(request):
    form_obj=Regform()      实例化Regform对象
    if request.method =='POST':   判断是post请求
        form_obj = Regform(request.POST)   将获取到的数据传递给实例化好的对象中去,做验证
        if form_obj.is_valid():  是否通过了验证
            form_obj.save()   通过了验证 就将数据存储在数据库中
            return redirect('login') 跳转到登陆页面
    return  render(request,'register.html',{'form_obj':form_obj})
	否则就返回注册页面 携带的实例化form_obj的对象传输给注册页面
    
其中的Regform类这一堆太多了,所以在app01这个项目下新增了一个forms.py文件,
将这一堆放入这里面,再将Regform导入到views文件下即可,注意所需模块的导入

7.写注册页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <title>注册</title>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/demo.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
    <link rel="stylesheet" type="text/css" href="{% static 'css/animate-custom.css' %}">
    <style>
        select {
             100%;
            margin-top: 4px;
            padding: 10px 5px 10px 32px;
            color: #b2b2b2;
        }
    </style>
</head>
<body>
<div class="container">

    <header>
    </header>
    <section>
        <div id="container_demo">
            <div id="wrapper">
                <div id="login" class="animate form">
                    <form action=""  method="post" autocomplete="on" novalidate>   novalidate 不进行前端校验
                        {% csrf_token %}
                        <div>
                            {{ form_obj.username }}  数据库内的用户名
                        </div>
                        <div>
                            {{ form_obj.username.errors.0 }}
                        </div> 数据库内的用户名报错了在这里显示
                        <div>
                            {{ form_obj.password }}
                        </div>
                        <div>
                            {{ form_obj.password.errors.0 }}
                        </div>
                        <div>
                            {{ form_obj.re_password }}
                        </div>
                        <div>
                            {{ form_obj.re_password.errors.0 }}
                        </div>
                        <div>
                            {{ form_obj.user_name }}
                        </div>
                        <div>
                            {{ form_obj.user_name.errors.0 }}
                        </div>
                        <div>
                            {{ form_obj.user_id }}
                        </div>
                        <div>
                            {{ form_obj.user_id.errors.0 }}
                        </div>
                        <div>
                            {{ form_obj.role_name }}
                        </div>
                        <div>
                            {{ form_obj.role_name.errors.0 }}
                        </div>
                        <div>
                            {{ form_obj.phone }}
                        </div>
                        <div>
                            {{ form_obj.phone.errors.0 }}
                        </div>
                        <p class="login button">
                            <input type="submit" value="Login">
                        </p>
                        <p class="change_link">
                            <a href="{% url 'login' %}" class="to_register">返回登陆</a>
                        </p>
                    </form>
                </div>
                </div>
        </div>
    </section>
</div>

</body>
</html>

好了!

原文地址:https://www.cnblogs.com/lingege/p/12417167.html