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(统⼀资源定位符)
host127.0.0.1:8000
host_url
form表单
1、form表单的get请求
搜索功能
@ute("/person")
def person():
"""职员管理页"""
# #判断⽤户是否已经登录了
# if ("logined"):
# return "未登录"
# 获取get请求参数
person_username = ("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)将⽂件的名字保存到数据库
@ute("/add/person")
def add_person():
"""新增职员页⾯"""
# 查询所有职位
position_list = der_by(Position.id.desc()).all()
return render_template("add_person.html", **locals())
@ute("/add/person/action", methods=["GET", "POST"])
def add_person_action():
"""新增职员处理"""
# 请求post请求参数
data = request.form
# 根据标签的name属性获取对应的值
username = ("username")
password = ("password")
getsavefilename
position_id = ("position_id")
nickname = ("nickname")
gender = ("gender")
age = ("age")
phone = ("phone")
email = ("email")
address = ("address")
# 获取⽂件对象
photo = ("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.phone = phone
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.de("utf-8"))
return m.hexdigest()
def login_verify(func):
"""登录验证装饰器"""
@wraps(func)
def inner(*args,**kwargs):
if ("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
1. 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在哪个域名中有效。⼀般设置⼦域名,⽐如ample。
path该cookie在哪个路径下有效。
1. 设置,获取,删除cookie
@ute("/set/cookie")
def set_cookie():
"""cookie设置"""
# 创建响应
response = make_response("")
# 设置cookie
response.set_cookie("mycookie1", "laowang", max_age=60 * 10)
# 返回响应
return response
@ute("/get/cookie")
def get_cookie():
"""cookie获取"""
# 获取cookie
mycookie1 = ("mycookie1")
print("mycookie1:", mycookie1)
return ""
@ute("/delete/cookie")
def delete_cookie():
"""cookie删除"""
# 创建响应
response = make_response("")
# 设置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实现的
@ute("/set/session")
def set_session():
"""session设置"""
session["logined"] = "⽼王"
return ""
@ute("/get/session")
def get_session():
"""session获取"""
("logined"))
return ""
@ute("/delete/session")
def delete_session():
"""session删除"""
# 删除
session.pop("logined")
# del session["logined"]
# 清空
# session.clear()
return ""
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论