[py]flask实现用户cmdb
人最难做到的就是跟自己学习, 总是学习别人的, 沉淀, 过一段时间忘了刚学到的, 在向别人学习, 而非看看自己的沉淀, 殊不知, 世界上最亲近,最默契的人是自己.
用户cmdb功能概述
之前学flask做了个cmdb的东西.当初作为学习的一个思路.
久而久之就忘掉了, 整理一下放上来. 可见时间是把杀猪刀, 稍不留神就让你背负着忘掉的东西,回顾它, 然后反过来浪费时间. 这就是搞这些的烦恼.
根据后端存储可分为3个节点, 这点和那个txl项目: python写一个通讯录step by step V3.0有点类似,不过那个没flask, 这个是简化前端版.
- 支持登录
- crud数据库来实现用户的增删改查
功能如下

- 打开首页让登录,输入正确用户名密码后, 出现欢迎界面
- 界面可以增加用户
- 可以删除用户
- 可以更新用户密码
- 可以退出
第一阶段, 后端用文件存储
fileutils.py
file_dict = {}
# file -> dict
def read_file():
    with open("users.txt") as f:
        for line in f.readlines():
            user, pwd = line.split()
            file_dict[user] = pwd
    return file_dict
# dict -> file
def write_file():
    tmp = []
    for user, pwd in file_dict.items():
        tmp.append("%s %s" % (user, pwd))
    with open("users.txt", "w") as f:
        f.write("\n".join(tmp))
因为用户名密码是要对应起来, 因此这里考虑用了dict. 所以解决dict到文件之间的存储. 注意: 只有字符串才能写入文件.
app.py
#!/usr/bin/env python
# coding=utf-8
from flask import Flask, render_template, request, redirect, flash, session, url_for
import fileutils
app = Flask(__name__)
app.secret_key = "1992"
@app.route("/head")
def get_header():
    user_agent = request.headers.get("User-Agent")
    Cookie = request.headers.get("Cookie")
    return "{{ session.username }}------- %s" % Cookie
@app.route("/")
def login():
    if "username" in session:
        return redirect("/list")
    else:
        return render_template("login.html")
@app.route("/loginaction")
def login_action():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    fileutils.read_file()
    if fileutils.file_dict.has_key(user) and pwd == fileutils.file_dict[user]:
        session['username'] = user
        session['password'] = pwd
        return redirect("/list")
    else:
        flash("user or pwd is error")
        return render_template("login.html")
@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect("/")
@app.route("/list")
def show_user():
    print session
    if "username" in session:
        user_list = fileutils.read_file()
        return render_template("list.html", user_list=user_list.items())
    else:
        return redirect("/")
@app.route("/adduser")
def add_user():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    fileutils.read_file()
    if user in fileutils.file_dict:
        return redirect("/list")
    else:
        fileutils.file_dict[user] = pwd
        fileutils.write_file()
        return redirect("/list")
@app.route("/del")
def del_user():
    user = request.args.get("user")
    fileutils.read_file()
    fileutils.file_dict.pop(user)
    fileutils.write_file()
    return redirect("/list")
@app.route("/update")
def update_user():
    user = request.args.get("user")
    fileutils.read_file()
    pwd = fileutils.file_dict[user]
    return render_template("update.html", user=user, pwd=pwd)
@app.route("/updateaction")
def update_action():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    print user, pwd
    fileutils.read_file()
    print fileutils.file_dict
    fileutils.file_dict[user] = pwd
    print fileutils.file_dict
    fileutils.write_file()
    return redirect("/list")
app.run(debug=True)
第二阶段, 后端用pickcle模块
pickle可以直接将dict处理后写入文件, 也可以直接从文件读成dict, 写入方便, 读出来也不需要做额外处理就可以用了.
第三阶段, 后端用pickcle模块
后端使用mysql
create database bbs;
use bbs;
create table users(user varchar(40), pwd varchar(80));
insert into users values('admin','123456');
app.py
#!/usr/bin/env python
# coding=utf-8
from flask import Flask, render_template, request, redirect, flash, session,url_for
import fileutils
import pymysql as mysql
con = mysql.connect(host='127.0.0.1',user='root',passwd='',db='bbs')
cur = con.cursor()
sql = "select * from users"
cur.execute(sql)
con.autocommit(True)
print cur.fetchall()
app = Flask(__name__)
app.secret_key = "1992"
@app.route("/")
def login():
    if "username" in session:
        return redirect("/list")
    else:
        return render_template("login.html")
@app.route("/loginaction")
def login_action():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    cur.execute("select * from users")
    for line in cur.fetchall():
        suser,spwd = line
        print suser,spwd
        if suser == user and spwd == pwd:
            session['username']=user
            return redirect("/list")
    flash("user or pwd is error")
    return render_template("login.html")
@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect("/")
@app.route("/list")
def show_user():
    cur.execute("select * from users")
    if "username" in session:
        user_list = fileutils.read_file()
        return render_template("list.html", user_list=cur.fetchall())
    else:
        return redirect("/")
@app.route("/adduser")
def add_user():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    if user and pwd:
        cur.execute("select * from users")
        for line in cur.fetchall():
            suser,spwd = line
            if suser == user:
                return redirect("/list")
        else:
            cur.execute("insert into users values('%s','%s')"%(user,pwd))
            return redirect("/list")
    else:
        return redirect("/list")
@app.route("/del")
def del_user():
    user = request.args.get("user")
    cur.execute("delete from users where user ='%s';"% user)
    return redirect("/list")
@app.route("/update")
def update_user():
    user = request.args.get("user")
    cur.execute("select pwd from users where user='%s'"%user)
    pwd = cur.fetchall()[0][0]
    return render_template("update.html", user=user, pwd=pwd)
@app.route("/updateaction")
def update_action():
    user = request.args.get("user")
    pwd = request.args.get("pwd")
    print user, pwd
    cur.execute("update users set pwd='%s' where user = '%s'" % (pwd,user))
    return redirect("/list")
app.run(debug=True)
login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form action="/loginaction">
    user: <input type="text" name="user">
    pwd:  <input type="text" name="pwd">
    <input type="submit"> <br>
    {{ get_flashed_messages()[0] }}<br>
</form>
</body>
</html>
list.html
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>list</title>
</head>
<body>
<h2>welcome <span style="color: pink">{{ session.username }}</span>!</h2>
<h1><a href="/logout">logout</a></h1>
<form action="/adduser">
    user: <input type="text" name="user">
    pwd:  <input type="text" name="pwd">
    <input type="submit" value="添加用户">
</form>
<hr>
<table border="1">
    <tr>
        <th>user</th>
        <th>pwd</th>
        <th>action</th>
    </tr>
    {% for user in user_list %}
    <tr>
        <td>{{ user[0] }}</td>
        <td>{{ user[1] }}</td>
        <td>
            <a href="/update?user={{ user[0] }}">update</a>
            <a href="/del?user={{ user[0] }}">del</a>
        </td>
    </tr>
    {% endfor %}
</table>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>update user </title>
</head>
<body>
<form action="/updateaction">
    user: {{ user }} <input type="text" value="{{ user }}" name="user" hidden="hidden"><br>
    pwd: <input type="text" value="{{ pwd }}" name="pwd">
    <input type="submit">
</form>
</body>
</html>
源码
[py]flask实现用户cmdb的更多相关文章
- flask 开发用户登录注册功能
		flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ... 
- [py]flask操作cookie&django的seesion和cookie机制
		浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ... 
- [py]flask从0到1-模板/增删改查
		flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ... 
- [py]flask蓝图的使用
		参考 flask挺挺轻巧的, 因此玩一玩它. 如果用它做大型点的项目, 就用到了它的蓝图组织项目. 一时半会不太清楚这玩意怎么用, 得撸一撸py基础了. 我搞了个movie小的flask栗子来用用蓝图 ... 
- flask 对于用户登录保持状态 flask_login
		先加载flask_login ext.py 在app下的__init__.py 进行引用把,我就不写了 login_manager = LoginManager() # 如果没有登录则重定向到该蓝图 ... 
- Flask 扩展 用户会话
		pip install flask-login 接下来创建扩展对象实例: from flask import Flask from flask_login import LoginManager ap ... 
- [py]flask动态展示主机内存图
		echarts基础 需要借助这个图来绘制,动态内存图. 绘制步骤 写py脚本来入库日志 选取合适的echart,并观察图所需的数据格式 用flask返回这个静态的echarts 用flask写接口返回 ... 
- django views.py视图 获取用户请求相关信息以及请求头
		请求的其他信息 用户发来请求时候,不仅发来数据,也把请求头也发过来 在views.py 怎么找请求数据? request是一个对象,这个对象封装很多信息,可以先查这个对象的类 print(type(r ... 
- flask开发用户管理系统wtf版
		#coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ... 
随机推荐
- DateTime数据类型保存问题(DateTime2)
			DateTime And DateTime2 问题: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值 原因: EF中model存在datetime类型的字段, ... 
- vs必备快捷键整理
			.格式化代码:Ctrl+E,D .格式化部分代码:选中代码->Ctrl+K,F.或者Ctrl+E,F. .折叠cs文件所有方法:Ctrl+M,O .打开或折叠所有代码:Ctrl+M,L (打开或 ... 
- Shell find命令详解
			查找文件find ./ -type f 查找目录find ./ -type d 查找名字为test的文件或目录find ./ -name test 查找名字符合正则表达式的文件,注意前面的‘.*’(查 ... 
- 通俗大白话来理解TCP协议的三次握手和四次分手
			通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手. 引用网上的一些通俗易懂的例子,虽然不太正确,后面会指 ... 
- Python Extension Packages 下载
			Python Extension Packages下载 这个下载源资源丰富,python支持版本从2.x到3.7,从win32到win64位都有支持,是非常好资源. 特别留下记号备查. Index b ... 
- Android SAX、DOM、Pull解析xml文件剖析与案例讲解
			XML介绍 XML(Extensible Markup Language) 即可扩展标记语言,与HTML一样,都是SGML(Standard Generalized Markup Language,标 ... 
- EXPLAIN 具体含义 ( type possible_key key key_len ref )
- LeetCode 44 Wildcard Matching(字符串匹配问题)
			题目链接:https://leetcode.com/problems/wildcard-matching/?tab=Description '?' Matches any single chara ... 
- linux shell脚本中 mode=${1:-sart}  filename=${fileuser:-"filename"}
			$1代表第二个参数m=${1:-start}表示如果$1存在且不为空,m就是$1如果$1不存在或为空,那么m就是start filename=${fileuser:-"filename&qu ... 
- ASP.NET Session 简单超实用使用总结
			一.概述 Session用于存储特定的用户会话所需的信息 . Session对象的引入是为了弥补HTTP协议的不足,HTTP协议是一种无状态的协议. Session中文是“会话”的意思,在ASP.NE ... 
