Flask请求和表单
一、Flask请求
常见的请求方式
默认页面请求都是get请求
视图函数中request是传递到视图的请求,里面包含请求的各种参数。
常用的请求方式get和post:
1、get:默认是get请求,请求数据以明文形式放在路由上,get的格式是以?开头,键等于值的形式,以&来分割键值对,通常用于向服务器获取资源。
2、post:请求数据隐藏发送,安全系数更高。通常用于向服务器提交资源。
请求对象
对于 Web 应用,客户端发送给服务器的数据交互至关重要。在 Flask 中由全局的 request 对象来提供这些信息。需要导入request
from flask import request
可以通过request的属性,获取请求的信息,常用的属性有:
Request参数 定义 args 接收get请求参数 data 请求体的原始数据 files 接收文件数据 form 接收post请求数据 method 请求方式 referrer 请求来源 url(统一资源定位符) http://127.0.0.1:8000/get_test/?name=hello host 127.0.0.1:8000 host_url http://127.0.0.1:8000/ form表单
1、form表单的get请求
搜索功能
@app.route("/person") def person(): """职员管理页""" # #判断用户是否已经登录了 # if not session.get("logined"): # return "未登录" # 获取get请求参数 person_username = request.args.get("person_username") # 判断 if person_username: # 搜索 person_username_like = "%{}%".format(person_username) person_list = Person.query.filter(Person.username.like(person_username_like)).all() else: # 查所有 person_list = Person.query.all() # 查部门 department_list = Department.query.all() return render_template("person.html", **locals()) # html页面代码 <form role="form" class="col-lg-3" method="get" action="/person"> <div class="form-group input-group"> <input type="text" name="person_username" class="form-control" placeholder="输入要搜索的雇员的名字" value="{{ person_username|default(‘‘,boolean=True) }}"> <span class="input-group-btn"> <button class="btn btn-default" type="submit"> <i class="fa fa-search"></i> </button> </span> </div> </form>
2、form表单post提交
完成职员管理的添加
3、图片上传
为用户添加头像
前端添加上传图片功能
思路:
(1)保存文件
(2)将文件的名字保存到数据库
@app.route("/add/person") def add_person(): """新增职员页面""" # 查询所有职位 position_list = Position.query.order_by(Position.id.desc()).all() return render_template("add_person.html", **locals()) @app.route("/add/person/action", methods=["GET", "POST"]) def add_person_action(): """新增职员处理""" # 请求post请求参数 data = request.form # 根据标签的name属性获取对应的值 username = data.get("username") password = data.get("password") position_id = data.get("position_id") nickname = data.get("nickname") gender = data.get("gender") age = data.get("age") phone = data.get("phone") email = data.get("email") address = data.get("address") # 获取文件对象 photo = request.files.get("photo") # 处理路径 file_name = do_file_name(photo.filename) file_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static/img", file_name) # 保存文件 photo.save(file_path) # 创建对象 per = Person() per.username = username per.password = encryption_md5(password) # 密码加密 per.nickname = nickname per.age = age per.gender = gender per.phone = phone per.email = email per.photo = file_name # 将文件的名字存储到数据库 per.address = address per.position_id = position_id # 新增 per.save() # 重新发送请求-重定向 return redirect("/person")
5、生成文件名字,密码加密,登录装饰器
from flask import session,redirect from functools import wraps import uuid import os import hashlib def do_file_name(file_name): """ 处理文件的名字 :param file_name: 文件名字,比如hello.jpg :return: uuid+filetype,比如80467862-abd6-11ea-9612-7c7a916d9bc3.jpg """ uuid_str = str(uuid.uuid1()) file_type = os.path.splitext(file_name)[1] return uuid_str+file_type def encryption_md5(value): """ 使用md5加密 :param value: 待加密的数据 :return: 加密之后的数据 """ m = hashlib.md5() m.update(value.encode("utf-8")) return m.hexdigest() def login_verify(func): """登录验证装饰器""" @wraps(func) def inner(*args,**kwargs): if not session.get("logined"): # return "未登录" return redirect("/login") else: return func(*args,**kwargs) return inner if __name__ == ‘__main__‘: print(do_file_name("xx.jpg"))