14.web开发之flask-3

表单处理

main.py

@app.route('/chuli', methods=['POST'])
def chuli():
    if request.method == 'POST':
        # uname和passwd是前端的name字段里的字符
        username = request.form.get('uname')
        password = request.form.get('passwd')
        print("用户名提交了" + username + "密码提交了" + password)
    return render_template('/chuli.html')

@app.route('/test1')
def test1():
    return render_template('test1.html')

test1.html

<!-- action表示提交到哪个页面 -->
<form method="post" action="/chuli">
    用户名:<input type="text" name="uname" /><br>
    密码:<input type="password" name="passwd" /><br>
    <input type="submit" value="点我提交" />
</form>

chuli.html

<body>
处理完毕
</body>

流程:用户访问/test1 路由跳转到test1.html中提交用户名和密码,交到/chuli路由下,chuli函数通过提取前端输入并print到控制台,同时转到chuli.html向前端返回处理完毕的字样

测试时请使用无痕窗口,因为前端容易留下缓存,可能影响结果

数据库操作(查)

在此之前先用phpstudy搭建数据库haha和表table1

fetchone查询

main.py

import pymysql

@app.route('/chuli', methods=['POST'])
def chuli():
    if request.method == 'POST':
        # uname和passwd是前端的name字段里的字符
        username = request.form.get('uname')
        password = request.form.get('passwd')
        print("用户名提交了" + username + "密码提交了" + password)

    # 打开数据库
    db = pymysql.connect(host="localhost", user="root", password="root", db="haha")
    # 创建游标对象,相当于指针指向数据库,指向哪就做什么事
    cursor = db.cursor()

    # sql语句
    sql = "SELECT * FROM table1"

    # 通过指针执行sql语句
    cursor.execute(sql)

    # 确认执行
    db.commit()

    # 数据执行sql语句后已经保存到这个cursor中,需要接收
    list1 = []
    for i in range(5):
        # 将指针内的数据一条一条拿出来
        data = cursor.fetchone()

        print(data)
		
		db.close()
    return render_template('/chuli.html')

此时是以元组的形式输出,并不是我们想要的

image

强制类型转换并列表输出,是一个大列表包含一个小列表,可以获得第二个用户的用户名

for i in range(5):
    # 将指针内的数据一条一条拿出来
    data = cursor.fetchone()
    # 强制类型转换
    li = list(data)
    # 列表拼接
    list1.append(li)
print(list1)
# 输出第二个列表的第二个数据
print(list1[1][1])
db.close()

image

不能使用list1+=li,因为会连在一起

image

fetchall查询

fetchone 语句一个一个取出,我们是知道有多少,如果事先不知道的话要对整个数据库进行查找需要使用fetchall语句

for item in cursor.fetchall():
        # item本身是一个元组,转换成字典形式存储
        dict = {'用户名': item[1], '密码': item[2]}
      list1.append(dict)

print(list1[1]["名字"])
db.close()

image

返回json格式数据

db.close()后添加代码,并注释掉之前的return语句

result = json.dumps(list1, sort_keys=True, ensure_ascii=False)
return result

sort_key=True:告诉编码器按照字典排序(a到z)输出
ensure_ascii=False:避免返回数据对中文编码

image

数据库的增删改以及模板输出

增删改

# sql语句,通过三个双引号扩大语句编写位置
sql = """
INSERT INTO table1(username,password) VALUES('test3','999999')
"""
try:
    # 通过指针执行sql语句
    cursor.execute(sql)
    # 确认执行
    db.commit()
except:
    # 执行失败就回滚,还原数据且不执行
    db.rollback()

db.close()

增语句还可以通过变量传递

sql = """
    INSERT INTO table1(username,password) VALUES('%s','999999')
    """ % 'test4'

删和改都在sql变量中修改即可

利用jinja模板获取数据库输出

main.py

sql = "SELECT * FROM table1 where id < 5"
cursor.execute(sql)
db.commit()
list1 = []
for item in cursor.fetchall():
    # 用list和dict存储利于之后数据修改和脱敏处理
    dict = {'name':item[1],'password':item[2]}
    list1.append(dict)

print(list1)
db.close()
return render_template('/chuli.html',list1=list1)

chuli.html

<body>
处理完毕
<hr>
{% for line in list1 %}
<li>{{line.name}}</li>
<li>{{line.password}}</li>
{% endfor %}
</body>

image

posted @ 2022-04-18 16:05  icui4cu  阅读(31)  评论(0编辑  收藏  举报