基于django和mysql设计一个用户管理系统,列出与tornado和mongodb的异同处

相关资料链接(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语句就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值