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
    host127.0.0.1:8000
    host_urlhttp://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"))