一、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页面代码

value="{{ person_username|default('',boolean=True) }}">

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"))

会话机制

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

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

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

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

会话机制有两个:cookie,session

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

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

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

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

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

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

创建cookie

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

参数

介绍

key

设置的cookie的key。

value

key对应的value。

max_age

改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。

expires

过期时间,是一个datetime类型。

domain

该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。

path

该cookie在哪个路径下有效。

设置,获取,删除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..."

Copyright © 2088 光影峡谷 - 高尔夫模拟游戏活动中心 All Rights Reserved.
友情链接