Flask请求

本文介绍了Flask框架中的请求方式,包括GET和POST请求,并详细讲解了如何处理表单数据。同时,探讨了Flask的会话机制,包括cookie和session的工作原理、优缺点及使用方法,强调了session在安全性上的优势。
一、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提交
在这里插入图片描述
完成职员管理的添加

代码实现:

@user_bl.route("/add/person/action", methods=["GET", "POST"])
@login_verify
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(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")

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"))
  • 会话机制
    在这里插入图片描述

    会话:数据交互的一次过程,在web开发中,从浏览器发起请求到浏览器关闭,这样的一次交互叫做会

    话,在当次交互的过程中有很多状态和数据需要记录,但是所有的http都是无状态的,当次请求和上一

    次请求以及下一次请求,没有任何关系,请求者身份默认都是匿名的,这样的访问缺乏连续性,导致在

    同一个网站中无法识别用户的身份,对web开发有很大的局限,所以后来有了web开发的会话技术

  • 会话机制有两个:cookie,session

cookie

在这里插入图片描述

  1. cookie是浏览器发送请求的时候,服务器下发送的保存在浏览器端用户识别用户的一些小文件

    cookie的出现让浏览器访问有了很多的持续性,可以有身份的访问,但是也带来了安全隐患,

    cookie是保存在本地,很容易被盗用和修改

    cookie的特点:cookie是保存到浏览器客户端的,安全性较差,所以一般用来存储非敏感数据,比如记录用户,客户端的浏览器记录等等。

    路径默认是/,网站的根目录

    cookie会再次发给同样的url,如果cookie是/,所有子url都可以访问,反之不行

  • 创建cookie

    response.set_cookie(键,值,有效期)

    参数介绍
    key设置的cookie的key。
    valuekey对应的value。
    max_age改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
    expires过期时间,是一个datetime类型。
    domain该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。
    path该cookie在哪个路径下有效。
  1. 设置,获取,删除cookie
@app.route("/set/cookie")
def set_cookie():
    """cookie设置"""
    # 创建响应
    response = make_response("set_cookie...")
    # 设置cookie
    response.set_cookie("mycookie1", "laowang", max_age=60 * 10)
    # 返回响应
    return response


@app.route("/get/cookie")
def get_cookie():
    """cookie获取"""
    # 获取cookie
    mycookie1 = request.cookies.get("mycookie1")
    print("mycookie1:", mycookie1)
    return "get_cookie..."


@app.route("/delete/cookie")
def delete_cookie():
    """cookie删除"""
    # 创建响应
    response = make_response("delete_cookie...")
    # 设置cookie
    response.delete_cookie("mycookie1")
    # 返回响应
    return response

2、session

在这里插入图片描述

由于cookie下发到客户本地,本身存在着比较大的安全问题,所有又有session技术对cookie进行弥补,session本身和cookie的作用相似,但是,session将具体的校验内容保存到服务器端,下发给用户的只是一个session_id

我们举个例子:

​ 奶茶店,退出一种活动,会员活动,充100块钱,可以购买11杯原价10元的奶茶。店员有两种选择:

1、 下发凭证给用户,用户携带凭证来获取奶茶。

2、 下发凭证给用户,凭证上时一串编号,对应编号,在服务台的计算机当中记录用户的信息。

session技术类似上面的第二种校验方式,这种方式将用户身份信息保存在服务器上,通常是服务器的数据库中。用户获取一个随机编码的编号。用户请求携带编号,然后服务器根据编号查找用户信息,识别身份,这种识别的技术就叫做session,session比cookie更加安全,但是:

1、 session_id是通过cookie下发的,也就是说session技术需要依赖cookie技术

2、 session本身保存数据库当中,校验需要操作数据库,频繁的校验会导致数据库压力变大。

session是依赖于cookie实现的

@app.route("/set/session")
def set_session():
    """session设置"""
    session["logined"] = "老王"
    return "set session..."


@app.route("/get/session")
def get_session():
    """session获取"""
    print(session.get("logined"))
    return "get session..."


@app.route("/delete/session")
def delete_session():
    """session删除"""
    # 删除
    session.pop("logined")
    # del session["logined"]
    # 清空
    # session.clear()
    return "delete session..."
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值