request请求: request对象中保存了一次http请求中的一切信息。包括:data、form、args、cookies、headers、method、url、files。
- data:记录请求的数据,并转换成字符串
- form:记录请求中的表单数据
- args:记录请求中的查询参数
- cookies:记录请求中的cookie信息
- headers:记录请求中的报文头信息
- method:记录请求中的http方法
- url:记录请求的url地址
- files:记录请求上传的文件
from flask import Flask, request
app = Flask(__name__)
# request中包含了前端发送过来的所有请求数据
@app.route("/index", methods=["GET", "POST"])
def index():
# 通过request.form可以直接提取请求体中的表单格式的数据,是一个类似字典的对象,可以当做字典一样操作
# get()方法只能拿到多个同名参数的第一个
name = request.form.get("name") # request.form["name"]这种形式也能获取数据,但是你要确定这个键是存在的,否则会报错,所以获取字典的键值,建议使用get的方式
age = request.form.get("age")
# getlist()方法可以拿到所有的同名的数据,返回一个列表
name_list = request.form.getlist("name")
# data提取请求体中非表单格式形式的数据
print(f"request.data:{request.data.decode('utf-8')}")
# args是用来提取url中的参数(查询字符串),也是一个类字典的对象
city = request.args.get("city")
country = request.args.get("country")
print(f"request.method={request.method}\n"
f"request.headers={request.headers}\n"
f"request.cookies={request.cookies}\n"
f"request.form={request.form}\n"
f"request.args={request.args}\n"
f"request.files={request.files}\n"
f"request.url={request.url}\n")
return f"hello name={name}, age={age}, name_list={name_list}, city={city}, counter={country}"
@app.route("/upload", methods=["POST", "GET"])
def upload():
file_obj = request.files.get("pic")
if file_obj:
file_obj.save("./demo.png")
else:
return "Find no file!"
return "Upload successfully!"
if __name__ == "__main__":
print(app.url_map)
app.run()
request课题获取请求体里的所有数据,使用postman模拟浏览器请求,执行上段程序,运行结果如下:
1、访问127.0.0.1:5000/index?city=nanjing,body中包含的数据都是表单数据,其中包含了多个同名参数name
2、访问127.0.0.1:5000/upload上传文件,上面表单数据的格式text类型,这里的是file类型注意request.files.get的键名要与表单里的键名一致
3、模拟浏览器发送cookie信息,这里postman的模拟过程如下:
4、访问127.0.0.1:5000/index?country=China&city=nanjing,body中包含的数据都是非表单数据(json格式的数据),使用request.data获取这些数据,并对所有类型数据进行打印输出,结果如下:
构造相应信息、元祖法、make_response
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
# 使用元组。返回自定义响应信息,return ×××, ××× ... Python会自动将这些参数打包成一个元组返回,别人收到的也是一个元组
# 响应信息分别是:响应体, 状态码, 响应头,响应头的格式是:[("键1", "值1"), ("键2", "值2"), (...)]
# return "Index page", 200, [("Ubuntu", "Python"), ("City", "Beijing")]
# 响应头的格式也可以是字典
# return "Index Page", 200, {"Linux": "Python", "City": "Shanghai"}
# 状态码也可以是非标准的http码
# return "Index Page --2", 666, {"XXOO": "xxoo", "haha": "lala"}
# 给状态码添加状态信息,格式:"状态码 状态信息",状态信息不能为中文
# return "Index Page --3", "666 very good" , {"name": "zhangsan", "age": 18}
# 响应信息的顺序不能变,但是 响应体, 状态码, 响应头不一定全写,只能从后往前删
return "Index Page --4", "777 lalala"
@app.route("/index")
def response():
# 使用make_response返回响应体信息
res = make_response("Response Page!")
res.status = "666 very six"
res.headers["name"] = "Big Head"
return res
if __name__ == "__main__":
app.run(debug=True)
运行结果如下:
使用元组返回自定义的响应信息
1、状态码为非标准的http码:
2、给状态码添加状态信息:
使用make_response返回响应体信息
3、make_response 响应体信息运行结果
abort函数: 异常处理
from flask import Flask, abort, Response
app = Flask(__name__)
@app.route("/")
def index():
# abort函数可以提前终止视图函数
# 方式一:传递状态码信息,必须是标准的http状态码(常用)
abort(404)
print("-----haha-----")
return "Index Page"
# 方式二:传递响应体信息
# res = Response("Not Found", 404, {"name": "zhangsan"}) # Response也可以返回响应体信息
# abort(res) # abort 相当于return
# print("-----haha-----")
# return "Index Page"
@app.errorhandler(404)
def handle_404_error(err):
# 自定义异常处理
# 这个函数的返回值会是前端用户最终看到的结果
return f"出现了404错误,错误信息是:{err}"
if __name__ == '__main__':
app.run()
运行结果如下:
1、直接使用abort传递状态码信息:
2、使用abort传递响应体信息
3、abort配合自定义的异常处理函数:
与前端交互
from flask import Flask, jsonify
import json
app = Flask(__name__)
@app.route("/")
def index():
data = {
"name": "zhangsan",
"age": 18,
"city": "Beijing",
"country": "china"
}
# # json.dumps(字典):将Python中的字典转换成json字符串【json就是字符串】
# # json.loads(json字符串):将json字符串转换为Python中的字典
# json_str = json.dumps(data)
# # 虽然已经将字典转换成json字符串了,但是响应头里的Content-Type并不是json,还需要设置
# return json_str, 200, {"Content-Type": "application/json"}
# jsonify()可以帮助我们转换json数据并设置响应头Content-Type: application/json
# 方式一:将字典传入jsonify
return jsonify(data)
# 方式二:直接以关键字的形式传参
# return jsonify(name="lisi", age=18, city="shanghai")
if __name__ == '__main__':
app.run()
运行结果如下:
cookie值的设置、获取与删除
首先简单的介绍一下cookie,在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并登录成功后,第二次请求服务器依然不知道当前请求的是哪个用户。cookie的出现解决了这个问题,第一次登录后服务器会返回一些数据(cookie)给浏览器,然后浏览器保存到本地,当用户第二次请求的时候,就会自动把上次请求存储的cookie数据自动的携带给服务期,服务器通过携带的数据就能判断当前用户是哪一个了。cookie存储的数量是有限的,因此只能存储一些小量的数据。
还有一个跟cookie很像的东西就是session,都是为了存储用户的相关信息,不同的是:cookie是存储在本地浏览器,二session存储在服务器。存储在服务器的数据会更加安全,不易被窃取。但是存储在服务器也有一个弊端,就是会占用服务器资源。但是服务器发展到现在,存储一些session是绰绰有余的。
cookie和session结合使用: 在如今的市场和企业中,一般存储方式有两种:
- 1、存储服务器端:通过cookie存储一个session_id,然后具体的信息保存到session中,如果用户已经登录,则服务器会在cookie中保存一个session_id,下次请求时,会把session_id携带上来,服务器根据session_id 和 session库中获取session数据,就能知道该用户到底是谁了。专业术语叫:sever side session
- 2、将session加密,然后存储到cookie中,专业术语叫:client side session,Flask就是采用的这种方式,也可以替换成其他方式。
Flask中的cookie是通过response对象来操作的,可以在response返回之前通过response.set_cookie 来设置。这个方法有几个参数需要注意:
- key:设置的cookie的key。
- value:key对应的value。
- max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期。
- expires:过期时间,应该是一个datetime类型。
- domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com。
- path:该cookie在哪个路径下有效。
使用:
- 获取:request.cookies.get(key, ‘默认值’)
- 设置:resp.set_cookie(key, value, max_age=整数)
- 删除:resp.delete_cookie(key)
from flask import Flask, make_response, request
app = Flask(__name__)
# 设置cookie值
@app.route("/")
def set_cookie():
res = make_response("Set cookie")
# 设置cookie值,默认有效期是临时cookie,浏览器关闭即失效,设置几个写几个
res.set_cookie("Username", "zhangsan")
res.set_cookie("Password", "123456")
# max_age 设置有效期,单位 秒
res.set_cookie("City", "Nanjing", max_age=3600)
return res
# 直接在响应头中设置cookie
@app.route("/set_cookie")
def set_cookie_2():
res = make_response("Set cookie --2")
# 其实set_cookie真正做的是在响应头里加了一个"Set-Cookie",可以直接操作响应头设置cookie值
res.headers["Set-Cookie"] = "Username=laowang"
return res
# 获取cookie值
@app.route("/get_cookie")
def get_cookie():
cookie = request.cookies.get("Username")
return f"The username in cookie is {cookie}"
# 删除cookie值
@app.route("/delete_cookie")
def delete_cookie():
res = make_response("Delete cookie")
res.delete_cookie("Username")
return res
if __name__ == '__main__':
app.run()
运行结果如下:
1、设置cookie值,set_cookie方法
2、访问127.0.0.1:5000/,设置cookie值,再访问127.0.0.1:5000/get_cookie时,请求体中会带上服务器设置的cookie值
3、获取cookie值
4、删除Username 的这个cookie值,再次访问127.0.0.1:5000/get_cookie时发现请求头里的这个cookie值已经没有了
session的设置、获取与删除
from flask import Flask, session
app = Flask("__name__")
# Flask默认是把session保存到cookie里,这样是不安全的,所以需要设置秘钥字符串,否则会报错
app.config["SECRET_KEY"] = "qwertyuiopasdfghjk"
@app.route("/")
def login():
# session 可以当做字典一样设置键值对
session["name"] = "zhangsan"
session["password"] = "zhangsan1234"
return "login success"
@app.route("/index")
def index():
# 获取session数据
name = session.get("name")
password = session.get("password")
return f"Hello, {name}, password={password}"
@app.route("/delete_session")
def delete_session():
# 删除session值
try:
session.pop("name")
session.pop("password")
return "Session is deleted"
except:
return "The session has been deleted!"
if __name__ == '__main__':
app.run()
运行结果如下:
1、设置session值
2、获取session值
访问相同地址时,cookie里面都会带有这个session值
3、删除session值