zoukankan      html  css  js  c++  java
  • 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>
    

    好了!

  • 相关阅读:
    第09组 Alpha冲刺(3/4)
    第09组 Alpha冲刺(2/4)
    第09组 Alpha冲刺(1/4)
    数值分析——多项式插值之Lagrange插值
    Deepin下安装搭建latex编写环境
    Deepin下安装Matlab2017a永久版
    数学建模方法-遗传算法(实战篇part 2)
    数学建模方法-遗传算法(实战篇part 1)
    数学建模方法-遗传算法(理论篇)
    Deepin系统下MATLAB中文字体乱码问题解决(加上字体美化)
  • 原文地址:https://www.cnblogs.com/lingege/p/12417167.html
Copyright © 2011-2022 走看看