这就是一个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="确定"> <a href="/register/">新用户注册</a> <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>
打完收工。哪里不懂,可以私我。