Django注册、登录(session)的超级简单版

这就是一个Demo基本功能都实现了 ,这套玩意让我对Django的整体套路有了更好的理解。

我的代码没有使用Model,自己建库、自己写sql 封装数据库代码结果返回json。其实与Model的getall的方法返回json的套路一样的。

这里还封装了一个MD5加密的类 。用来给密码进行MD5的加密。

我没有使用Django自带的Form功能,我看网上的文章都是Form把验证码给返回到前端。我的前端基本都是原生html,故验证码功能还没搞定。

common目录里的类,我前面的文章基本都可以找到的。

work目录里的类这是封装了administrator表的操作。(这里需要建立一个数据库表,表是3个字段id,username,password,id是主键、username的索引是唯一型索引)

我一般会把对业务类的表的操作、或者对业务的操作,放到work这个目录

config这个目录主要是配置文件,我这里用了ini的配置文件。这个操作我之前的文章也有的。

先看下目录结构
在这里插入图片描述

封装Administrator表的操作

#!/usr/bin/python3
#coding=utf-8

from common.MysqlHelper import MysqlHelper #这个类在我之前的文章里有

class AdminInfoHelper():

    def __init__(self,username,ip,port,dbname,dbuser,dbpassword):
        self.username = username
        self.ip = ip
        self.port = port
        self.dbname = dbname
        self.dbuser = dbuser
        self.dbpassword = dbpassword

    def get_admin_info(self):
        mysqlhelper = MysqlHelper(self.ip,self.port,self.dbname,self.dbuser,self.dbpassword)
        sql = "select * from administrator where username = '%s'"%(self.username)
        json_info = mysqlhelper.get_all(sql)
        for dict in json_info:
            if dict is not None:
                return dict
            else:
                return None
        mysqlhelper.close()

    def register_admin_info(self,password):
        mysqlhelper = MysqlHelper(self.ip, self.port, self.dbname, self.dbuser, self.dbpassword)
        sql = "insert into administrator (username,password) value ('%s','%s')"%(self.username,password)
        mysqlhelper.insert(sql)
        mysqlhelper.close()

md5加密的类

#!/usr/bin/python3
#coding=utf-8

import hashlib

class EncryptionHelper():
    def __init__(self,string_need_to_encrypt):
        self.string_need_to_encrypt = string_need_to_encrypt

    def genearteMD5(self):
        hl = hashlib.md5()
        hl.update(self.string_need_to_encrypt.encode(encoding='utf-8'))
        return hl.hexdigest()

urls.py

from django.urls import path, include
from demo_login_app import views

urlpatterns = [
    path('',views.index),
    path('index/',views.work),
    path('register/',views.register),
    path('login/',views.login),
    path('logout/',views.logout),
]

views.py

from django.shortcuts import render, redirect

import configparser
from common.OperationPasswordHelper import EncryptionHelper
from work.AdminInfo import AdminInfoHelper

引入配置文件

config = configparser.ConfigParser()
config.read('config/config.ini')

#admin
ip = config.get('admin-database','ip')
sport = config.get('admin-database','port')
port = int(sport)
dbname = config.get('admin-database','dbname')
dbuser = config.get('admin-database','dbuser')
dbpassword = config.get('admin-database','dbpassword')
def index(request):
    return render(request,'login.html')

#注册代码
def register(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        admin = AdminInfoHelper(username,ip,port,dbname,dbuser,dbpassword)
        dict_info = admin.get_admin_info()
        if dict_info is not None:
            return render(request, 'register.html', {'dict_info': dict_info['username']+' 已存在'})
        else:
            encry = EncryptionHelper(password)
            db_password = encry.genearteMD5()
            admin.register_admin_info(db_password)
            return render(request, 'register.html', {'dict_info':'注册成功,可以登录'})

    return render(request, 'register.html')

#登录并存session代码
def login(request):

    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')
        admin = AdminInfoHelper(username, ip, port, dbname, dbuser, dbpassword)
        dict_info = admin.get_admin_info()
        if dict_info is not None:
            encry = EncryptionHelper(password)
            db_password = encry.genearteMD5()
            if db_password == dict_info['password']:
                request.session['is_login'] = True
                request.session['user_id'] = dict_info['id']
                request.session['user_name'] = dict_info['username']
                return redirect('/index/')
            else:
                return render(request, 'login.html', {'dict_info': '密码不正确'})
        else:
            return render(request, 'login.html', {'dict_info': '用户不存在'})

    return render(request, 'login.html')

#登出代码
def logout(request):
    if not request.session.get('is_login', None):
        return redirect("/login/")
    request.session.flush()
    return render(request,'login.html')

#这个是主页的,不能让人不登录没session就跳进来
def work(request):
    username = request.session.get('user_name')
    if username is None:
        return render(request, 'login.html',{'dict_info': '你尚未登录,请登录系统'})
    else:
        request.session['user_name'] = username
        return render(request,'index.html')
request.session['is_login'] = True
request.session['user_id'] = dict_info['id']
request.session['user_name'] = dict_info['username']

这3行就是存session ,存个状态、ID、用户名。这个在cookie里的,我们登录后,跳转到index.html就要把这个状态带出来,还有个登出的逻辑就完事了
在这里插入图片描述

templates

templates/login.html
templates/register.html

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
 <div style="margin: 15% 40%;">
      {% if dict_info %}
          <div>{{ dict_info }}</div>
      {% endif %}
        <h1>欢迎登录!</h1>
       <form action="/login/" method="post">
           {% csrf_token %}
            <p>
                <label for="id_username">用户名:</label>
                <input type="text" id="id_username" name="username" placeholder="用户名" autofocus required />
            </p>
            <p>
                <label for="id_password">密码:</label>
                <input type="password" id="id_password" placeholder="密码" name="password" required >
            </p>
            <input type="submit" value="确定">&nbsp;<a href="/register/">新用户注册</a>&nbsp;<a href="/reset_password/">忘记密码?</a>
        </form>
    </div>
</body>
</html>

我的首页就是登录页面。通过点击新用户注册去跳注册页面的。我也是后来才明白,/register/这个东西就相当于去找路由了。或者说去请求接口了。忘记密码重置密码下一篇文章再讲。

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
<div style="margin: 15% 40%;">
    {% if dict_info %}
          <div>{{ dict_info }}</div>
      {% endif %}
        <h1>欢迎注册!</h1>
       <form action="/register/" method="post">
           {% csrf_token %}
            <p>
                <label for="id_username">用户名:</label>
                <input type="text" id="id_username" name="username" placeholder="用户名" autofocus required />
            </p>

            <p>
                <label for="id_password">密码:</label>
                <input type="password" id="id_password" placeholder="密码" name="password" required >
            </p>
            <input type="submit" value="确定">
        </form>
    </div>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
<h1>{{ request.session.user_name }}!  欢迎回来!</h1>
<p>
    <a href="/logout/">登出</a>
</p>

打完收工。哪里不懂,可以私我。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值