相关资料链接(1):https://zhangliseo.com/3479.html
相关资料链接(2):https://blog.csdn.net/moxiaomomo/article/details/26412267
(1)步骤:打开cmd(w+r,输入cmd),输入“django-admin startproject manage_user”,我建立的是“untitled1”
(1.2)在untitled1上建立一个view.py,方便调试主程序
from .method_sql import *
"""
This is the first time I've used django to create a user management interface
"""
import pymysql
conn = pymysql.connect(host="localhost",user="root",password = "123",charset="utf8")
#连接mysql
cursor = conn.cursor()
sql = "use user_management;"
cursor.execute(sql)
#执行sql语句,返回值交给ret
"""
这时进入我建立的数据库
"""
sql = "select * from user;"
cursor.execute(sql)
#进入我建立好的user表中
a = cursor.fetchall()
a = list(a)#将元组的类型(不可改类型)改为列表类型(可改类型)
ac = []#建立好一个列表,为后台传数据做好准备
ac_one = ['name','age','id','province','password']
ac_one_type = {"name":'str','age':'int',"id":"int","province":"str","password":"int"}
ac_two = []
#print(a)
for x in a:
x = list(x)#将第二层面的tuple改为list
#print(x)
ac.append(x)
print(ac)#最终数据--------传给view.py
ac_final ={'sss':ac}
@csrf_exempt
def yonghuguanli(request):
if "POST"==request.method:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
name = request.POST.get('username')
password =request.POST.get('password')
#获取用户名,密码
print(name,password)
if name and password :#判断用户是否输入
for x in a:
if name in x and password in x:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
print(ac) # 最终数据--------传给view.py
ac_final = {'sss': ac}
return render(request,'manage.html',ac_final)
return render(request,'hello.html',{'name':'密码错误!!!'})
else:
return render(request,'hello.html',{'name':'请输入密码或者用户名!!!'})
else:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
print(ac) # 最终数据--------传给view.py
ac_final = {'sss': ac}
return render(request, 'manage.html', ac_final)
def add(request):
if request.method == "POST":
name = request.POST.get('name')
age = request.POST.get('age')
id = request.POST.get('id')
province = request.POST.get('province')
password = request.POST.get('password')
password_new = request.POST.get('password_new')
if password==password_new:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
for x in a:
if name in x:
error = {'er': '有这个人!!!'}
return render(request, 'add.html', error)
add_user(name,age,id,province,password)
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
return render(request,'manage.html',ac_final)
else:
error = {'er':'密码确认不对!!!请重新输入!!!'}
return render(request,'add.html',error)
else:
error = {'er': '欢迎'}
return render(request,'add.html',error)
def delete(request):
if request.method == "POST":
name = request.POST.get('name')
password = request.POST.get('password')
password_new = request.POST.get('password_new')
if password_new ==password:
delete_user(name,password)
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
return render(request,'manage.html',ac_final)
else:
error = {'er': '密码确认不对!!!请重新输入!!!'}
return render(request,'delete.html',error)
else:
error = {'er': '欢迎'}
return render(request,'delete.html',error)
def fix(request):
if request.method == "POST":
name = request.POST.get('name')
title = request.POST.get('title')
value = request.POST.get('value')
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
for x in a:
if name in x:
#print(name,title,value)
fix_user(name,title,value)
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
return render(request,'manage.html',ac_final)
error = {'er': '没有这个名字在内,请重新输入!!!'}
return render(request, 'fix.html', error)
else:
error = {'er': '欢迎'}
return render(request,'fix.html',error)
def login(request):
ret2 = {'name':'welcome to my login screen'}
return render(request,'hello.html',ret2)
(1.3)增删减改功能设计(命名method_sql.py)
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.template import loader
from django.http import HttpResponse
from django.urls import path
from django.shortcuts import render, redirect
import pymysql
conn = pymysql.connect(host="localhost",user="root",password = "123",charset="utf8")
#连接mysql
cursor = conn.cursor()
sql = "use user_management;"
cursor.execute(sql)
#执行sql语句,返回值交给ret
"""
这时进入我建立的数据库
"""
sql = "select * from user;"
cursor.execute(sql)
#进入我建立好的user表中
a = cursor.fetchall()
a = list(a)#将元组的类型(不可改类型)改为列表类型(可改类型)
ac = []#建立好一个列表,为后台传数据做好准备
ac_one = ['name','age','id','province','password']
ac_two = []
#print(a)
for x in a:
x = list(x)#将第二层面的tuple改为list
#print(x)
ac.append(x)
print(ac)#最终数据--------传给view.py
for x in ac:
ac_two.append({ac_one[0]:x[0],ac_one[1]:x[1],ac_one[2]:x[2],ac_one[3]:x[3],ac_one[4]:x[4]})
#print(ac_two)
a3 ={1:ac}
#print(a3)
def add_user(name,age,id,province,password):
sql = "use user_management;"
cursor.execute(sql)
for x in ac:
if name in x:
print( "error!!!")
break
sql = 'insert into user (name,age,id,province,password) values (%s,%s,%s,%s,%s);'
cursor.execute(sql,(name,age,id,province,password))
conn.commit()
def delete_user(name,password):
sql = "use user_management;"
cursor.execute(sql)
for x in ac:
if name in x and password in x:
sql = 'delete from user where name = %s;'
cursor.execute(sql,(name))
conn.commit()
def fix_user(name,title,value):
sql = "use user_management;"
cursor.execute(sql)
sql = 'update user set %s = %s where name = %s;'
print(title,value,name)
print(sql,(title,value,name))
cursor.execute(sql % (title,value,name))
conn.commit()
(1.4)add.html(增加界面) delete.html(删减页面) fix.html(修改界面)hello.html(登陆界面) manage.html(用户管理界面)
(1.4.1)add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>增加</title>
</head>
<body>
<form action ="{% url 'add_user' %}" method="POST">
{% csrf_token %}
<table class="table" style="border-style:none;width: 50%" >
<tr>
<td style="border-style:none" >姓名:</td>
<td style="border-style:none"><input name="name"></td>
</tr>
<tr>
<td style="border-style:none">年龄:</td>
<td style="border-style:none"><input name="age"></td>
</tr>
<tr>
<td style="border-style:none">学号:</td>
<td style="border-style:none"><input name="id"></td>
</tr>
<tr>
<td style="border-style:none">省份:</td>
<td style="border-style:none"><input name="province"></td>
</tr>
<tr>
<td style="border-style:none">密码:</td>
<td style="border-style:none"><input name="password"></td>
</tr>
<tr>
<td style="border-style:none">重复密码:</td>
<td style="border-style:none"><input name="password_new"></td>
</tr>
{{ er }}
<tr>
<td colspan="2" style="border-style:none" ><input type="submit" value="添加" style="width:100px;height:40px;"></td>
</tr>
</table>
</form>
</body>
</html>
(1.4.2)delete.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>删除</title>
</head>
<body>
<form action ="{% url 'delete_user' %}" method="POST">
{% csrf_token %}
<table class="table" style="border-style:none;width: 50%" >
<tr>
<td style="border-style:none" >姓名:</td>
<td style="border-style:none"><input name="name"></td>
</tr>
<tr>
<td style="border-style:none">密码:</td>
<td style="border-style:none"><input name="password"></td>
</tr>
<tr>
<td style="border-style:none">确认密码:</td>
<td style="border-style:none"><input name="password_new"></td>
</tr>
{{ er }}
<tr>
<td colspan="2" style="border-style:none" ><input type="submit" value="删除" style="width:100px;height:40px;"></td>
</tr>
</table>
</form>
</body>
</html>
(1.4.3) fix.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
</head>
<body>
<form action ="{% url 'fix_user' %}" method="POST">
{% csrf_token %}
<table class="table" style="border-style:none;width: 50%" >
<tr>
<td style="border-style:none" >姓名:</td>
<td style="border-style:none"><input name="name"></td>
</tr>
<tr>
<td style="border-style:none">请输入修改的title:</td>
<td style="border-style:none"><input name="title"></td>
</tr>
<tr>
<td style="border-style:none">输入修改值:</td>
<td style="border-style:none"><input name="value"></td>
</tr>
<tr>
<td colspan="2" style="border-style:none" ><input type="submit" value="修改" style="width:100px;height:40px;"></td>
</tr>
{{ er }}
</table>
</form>
</body>
</html>
(1.4.4) hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录注册界面</title>
</head>
<form action ="{% url 'manage_user' %}" method="POST">
<body>
<form name="formname" method="post" action="/hello/manage/">
{% csrf_token %}
用户:<input type="text" name="username" placeholder="请输入用户名"><br>
密码:<input type="password" name="password" placeholder="请输入密码"><br>
提交:<input type="submit" name="提交"><br>
<p>{{ name }}</p>
<br>
</form>
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0"
width=100% height=86
src="http://music.163.com/outchain/player?type=2&id=28263184&auto=1&height=66"></iframe>
</body>
</form>
</html>
(1.4.5) manage.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>user_manager</title>
</head>
<form action ="{% url 'manage_user' %}" method="POST">
<body>
<table class="table" >
<thead>
<tr >
<td >姓名</td>
<td >年龄</td>
<td >学号</td>
<td >省份</td>
<td >密码</td>
<td colspan="2"> </td>
</tr>
</thead>
<tbody>
{% for stuinfo in sss %}
<tr >
<td >{{ stuinfo.0 }}</td>
<td >{{ stuinfo.1 }}</td>
<td >{{ stuinfo.2}}</td>
<td >{{ stuinfo.3 }}</td>
<td >{{ stuinfo.4 }}</td>
</tr>
{% endfor %}
</tbody>
<tbody>
<tr >
<td ><a href ='http://127.0.0.1:8000/add/'>增加</a></td>
<td ><a href ='http://127.0.0.1:8000/delete/'>删除</a></td>
<td ><a href='http://127.0.0.1:8000/fix/'> 修改</a></td>
<td colspan="2"> </td>
</tr>
</tbody>
</table>
</body>
</form>
</html>
(1.5)nav.css 和 tables.css
(1.5.1) nav.css
*{
margin: 0;
padding: 0;
}
.nav{
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
background-color: #333;
position: fixed;
top: 0;
width: 100%;
}
.nav li{
float: left;
}
.nav li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
}
.nav li a:hover:not(.active) {
background-color: #111;
}
.active {
background-color: #4CAF50;
}
(1.5.2) tables.css
.table{
margin-top:50px;width:100% ;border:solid #add9c0; border-width:1px 0px 0px 1px;}
.table tr td {
border:solid #add9c0; border-width:0px 1px 1px 0px; padding:10px 0px;font-size:18px;align:center;}
.table tr td input{
width: 250px; height: 30px;font-size:18px
}
(1.6)以上html和css统一放入新创建的templates文件夹中,并且要修改settings.py和urls.py的路径
(1.6.1)settings.py
'DIRS': [BASE_DIR+"/templates",]
(1.6.2)urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from . import view
urlpatterns = [
path('',view.yonghuguanli,name='manage_user'),
path('hello/',view.login,name='hello_user'),
path('add/',view.add,name = 'add_user'),
path('delete/',view.delete,name = 'delete_user'),
path('fix/',view.fix,name = 'fix_user')
]
(2)展示界面:
(2.1):登录界面
(2.1.2)当然 首先判断用户是否输入,名字是否在数据库中,密码是否相匹配
def yonghuguanli(request):
if "POST"==request.method:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
name = request.POST.get('username')
password =request.POST.get('password')
#获取用户名,密码
print(name,password)
if name and password :#判断用户是否输入
for x in a:
if name in x and password in x:
sql = "select * from user;"
cursor.execute(sql)
# 进入我建立好的user表中
a = cursor.fetchall()
a = list(a) # 将元组的类型(不可改类型)改为列表类型(可改类型)
ac = [] # 建立好一个列表,为后台传数据做好准备
ac_one = ['name', 'age', 'id', 'province', 'password']
ac_one_type = {"name": 'str', 'age': 'int', "id": "int", "province": "str", "password": "int"}
ac_two = []
# print(a)
for x in a:
x = list(x) # 将第二层面的tuple改为list
# print(x)
ac.append(x)
print(ac) # 最终数据--------传给view.py
ac_final = {'sss': ac}
return render(request,'manage.html',ac_final)
return render(request,'hello.html',{'name':'密码错误!!!'})
else:
return render(request,'hello.html',{'name':'请输入密码或者用户名!!!'})
(2.2)进入界面
(2.3)点击增加:
(2.3.1) 首先判断名字是否在数据库中,其次判断各个数据类型是否正确,mysql讲究数据类型,密码与重复密码是否相等
(2.3.2)显示界面:
(2.4)点击删除
(2.4.1)判断姓名是否在数据库,密码是否正确,确认密码与密码是否正确
(2.4.2)显示界面:
(3)注意事项:
(3.1)在使用mysql时,
conn.commit() 是必不可少的,目的是向数据库提交数据,如果没有commit(),库中字段已经向下移位但内容没有写进,可是自动生成的ID会自动增加,否则要发生‘死锁’-----timerunout
(3.2)在urls.py中,name的作用--------------------改变登录链接,一个跳转方法
(3.3)
django.views.decorators.csrf import csrf_exempt
@csrf_exempt
403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。
防止登陆网页hello.html出现403 forbidden,防止数据露出
(3.4)pymysql中%s的使用
sql = 'insert into user (name,age,id,province,password) values (%s,%s,%s,%s,%s);' cursor.execute(sql,(name,age,id,province,password))
(4)比较django和tornado的异同处
【1】都是web服务器,都提供模板功能,都支持MySQL,mongodb,oracle数据库
【2】django属于超高的开发效率,但并发不如tornado高,在html变量的使用与tornado的使用大不同
【3】在django中,usrls,settings,view。。都分开使用编程,比tornado变化性强,而且传入html的数据必须是字典型的数据,这时MySQL就比mongodb好用了,相比tornado有点 ‘固执’,而且html查找变量是使用 “.”的方法去寻找变量,而tornado可以直接用python字典查找方法就可以了
【3.1】django传数据的方式有两种:
return render(request,'hello.html',{'name':'密码错误!!!'})
return HttpRequest({{'name':'密码错误!!!'}})
【3.2】tornado传数据的方式:
self.render()
【3.3】django获取数据的方式(大多数):
name = request.POST.get('name')
【3.4】tornado获取数据的方式:
user = self.get_argument("user")
【4】django中小型的网站,tornado适合访问量较高的小网站,django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。tornado为了高效实现Comet/后端异步调用HTTP接口,是直接内嵌了HTTP服务器。
【5】总而来说,Django模板的设计哲学是彻底的将代码、样式分离;asp.net提倡将代码/模板分离,但技术上还是可以混合;而Django则是从根本上杜绝在模板中进行编码、处理数据的可能。Tornado本身是单线程的异步网络程序,它默认启动时,会根据CPU数量运行多个实例;充分利用CPU多核的优势。
(5)总结
本人从开发管理系统用时一个下午加一个晚上,给我的感觉django相比比tornado要难上手一些,主要实现开始的一些数据处理,mysql的链接,sql代码的执行格式问题,以及网页跳转注意的一些要点,以及在html上对传入的变量的一些修改,这点与tornado差异太大了,一个是使用.获取数据,另一个是使用python语句就可以了。