Flask
1 flask简介
我们之所以在浏览器中输入localhost:8080然后就可以把webapps下面的项目文件以浏览器的方式打开,功臣在与tomcat。python语言写的项目,转换为web,Flask框架
轻量级web应用框架。
环境准备:
pip install flask
2 项目
2.1 创建一个flask对象
创建一个flask程序对象,当客户端发送消息到web服务器时,web服务器可以把消息给Flask实例。
app = Flask(__name__)
2.2 构造实例对象从url到python函数的映射关系
@app.route('/login')
def login():
return "你好,欢迎到来"
2.3 启动服务
app.run(debug=True, port=8899)
2.4 案例
from flask import Flask
# step1:创建一个应用实例
app = Flask(__name__)
# step2:url到python视图函数的映射关系---添加静态路由
@app.route('/login')
def login():
return "你好,欢迎到来"
# step3:启动服务
# debug:调试模式打开
# port:随便写一个,要求当前端口没有占用
app.run(debug=True, port=8899)
运行后浏览器访问效果:
3 路由
<name>
路由分类:
- 静态路由:在app.route(urel地址)不带参数的
- 动态路由:在app.route(url地址/<name>),带参数的
动态路由案例:
"""
动态路由
"""
from flask import Flask
app = Flask(__name__)
# 动态路由登录
# 密码设置为整数
@app.route('/login/<username>/<int:password>')
def login(username,password):
return f"你好{username},欢迎到来"
if __name__ == '__main__':
app.run(debug=True, port=8899)
运行结果:
4 http的请求和响应
4.1 请求
请求的方法:
a)request.method : 获取本次请求的请求方式(GET / POST等)
b)request.headers:获取请求信息头的相关信息
c)request.path:获取请求的资源具体路径(不带参数)
d)request.full_path:获取完整的请求资源具体路径(带参数)
e)request.url: 获取完整的请求地址,从协议开始
f)request.args : 获取以get请求方式提交的数据
g)request.form : 获取以post请求方式提交的数据
h)request.files:获取上传的文件,用save进行保存
i)request.cookies:获取cookies中的相关信息
案例:
"""
请求
"""
from flask import Flask,request
app = Flask(__name__)
# 动态路由登录
@app.route('/login/<username>/<int:password>')
def login(username,password):
print(f"请求头为:{request.headers.get('Accept-Encoding')}")
print(f"请求的url为:{request.path}")
print(f"请求的url为:{request.full_path}")
print(f"请求的method:{request.method}")
return f"你好{username},欢迎到来"
if __name__ == '__main__':
app.run(debug=True, port=8899)
结果如下:
请求头为:gzip, deflate, br
请求的url为:/login/admin/123 # 路径
请求的url为:/login/admin/123? # 全路径= 路径 + params
请求的method:GET
案例:发送带get请求数据的url
"""
带get参数的服务
"""
"""
请求
"""
from flask import Flask,request
app = Flask(__name__)
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
return f"你发送的get请求的参数为:{username},{pwd},你好,欢迎到来"
if __name__ == '__main__':
app.run(debug=True, port=8899)
发送请求:
4.2 响应
响应分类:
- 数据响应:文本响应,比如login-pass;json响应,比如会员查询的结果,一条会员信息就是json串中的一个成员
- 页面响应:返回就是一个页面,就是视图函数
文本响应案例:
"""
返回文本
"""
from flask import Flask,request
app = Flask(__name__)
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
content = f"你发送的get请求的参数为:{username},{pwd},你好,欢迎到来"
return content # 返回文本
if __name__ == '__main__':
app.run(debug=True, port=8899)
json响应案例:
"""
返回json
"""
from flask import Flask, request, jsonify
app = Flask(__name__)
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
data = {"username": username, "password": pwd}
return jsonify(data) # 返回结果为json串
if __name__ == '__main__':
app.run(debug=True, port=8899)
运行结果:
视图响应案例:
"""
返回视图函数
1. 通过get访问首页
2. 显示输入用户名和密码后,点击登录触发post请求
3. 返回post的信息
4. 输入错误的信息:给出一个链接,可以提示点击后重新登录?
"""
from flask import Flask, request, jsonify
app = Flask(__name__)
# get请求
# 获取登录页面
# 输入信息,点击登录
# 登录成功
@app.route('/login.html', methods=['GET','POST'])
def login():
str = '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>用户登录</h2>
<form action="/login.html" method="post">
用户名:<input name="username" placeholder="请输入用户名"><br>
密 码:<input name="password" placeholder="请输入密码"><br>
<input type="submit" name="login" value="登录"><br>
</form>
</body>
</html>
'''
if request.method == "GET":
return str # 返回结果为json串
else:
input_username = request.form.get("username") # 获取输入框输入的用户名
input_password = request.form.get("password") # 获取输入框输入的密码
if input_username=="admin" and input_password == '123':
return r"登录成功<br><img src='e:\aaa.jpg'>"
else:
return "<h1>登录失败<a href='/login.html'>请重新登录</a></h1>"
if __name__ == '__main__':
app.run(debug=True, port=8899)
4.3 make_response构造响应结果
make_response()有三个参数:
- 字符串
- 状态码
- 响应头
登录成功,响应200,并且把用户的信息添加到响应头中,如果失败,就返回400的错误案例:
"""
make_response
登录
"""
from flask import Flask, request, jsonify,make_response
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
if username == 'admin' and pwd == '123':
response = make_response(jsonify({"success": True, "msg": "登录成功"}), 200,
{"userinfo": "username={};password={}".format(username,pwd)})
else:
response = make_response(jsonify({"success": False, "msg": "登录失败"}), 1000)
return response
if __name__ == '__main__':
app.run(debug=True, port=8899)
运行结果:
5 模拟项目
一个完整的flask项目是分为三个部分的:
- static:css、图片
- templates:html
- run.py:服务
案例如图所示:
6 cookie和session
6.1 cookie
cookie的相关的方法:
- 设置cookie:response.set_cookie(key, value, mas_age=)
- 获取cookie:response.get_cookie(key)
- 删除cookie:response.get_cookie()
在一个demo中创建两个视图函数,一个是登录的,如果登录成功,我们就把cookie添加到浏览器中,一个是homt/page视图,如果有cookie那么就显示欢迎光临,如果没有cookie就显示请去登录:
"""
make_response
登录
"""
from flask import Flask, request, jsonify,make_response
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
if username == 'admin' and pwd == '123':
response = make_response(jsonify({"success": True, "msg": "登录成功"}), 200,
{"userinfo": "username={};password={}".format(username,pwd)})
# 如果登录成功,就去设置cookie,将登录的用户名和密码放进cookie
response.set_cookie("username", username, max_age=60)
response.set_cookie("password", pwd, max_age=60)
else:
response = make_response(jsonify({"success": False, "msg": "登录失败"}), 1000)
return response
@app.route('/home',methods=['GET'])
def homepage():
#获取cookie里面的用户名
username = request.cookies.get("username")
if username:
response = make_response('<h1>{},欢迎你来到首页!</h1>'.format(username))
else:
response = make_response('<h1>亲,你还没有登录哦!</h1>')
return response
if __name__ == '__main__':
app.run(debug=True, port=8899)
登录成功如图:
6.2 session
session拥有的方法有三个:
- 设置session:session[key] = value
- 获取session:session.get[key]
- 删除session:del session ; session.pop[key]
在一个demo中创三个视图函数,一个是登录的,如果登录成功,我们就把session添加到浏览器中,一个是homt/page视图,如果有session那么就显示欢迎光临,如果没有session就显示请去登录,一个是logout视图,用来清除session,代码如下:
"""
在一个demo中创三个视图函数,一个是登录的,
如果登录成功,我们就把session添加到浏览器中,一个是homt/page视图,
如果有session那么就显示欢迎光临,如果没有session就显示请去登录,
一个是logout视图,用来清除session
"""
import os
from flask import Flask, request, jsonify, make_response, session
app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False
app.secret_key = os.urandom(24)
# get请求
@app.route('/login', methods=['GET'])
def login():
username = request.args["username"]
pwd = request.args["password"]
if username == 'admin' and pwd == '123':
response = make_response(jsonify({"success": True, "msg": "登录成功"}), 200,
{"userinfo": "username={};password={}".format(username,pwd)})
# 如果登录成功,就去设置session,将登录的用户名和密码放进session
session['username'] = username
session['password'] = pwd
else:
response = make_response(jsonify({"success": False, "msg": "登录失败"}), 1000)
return response
@app.route('/home',methods=['GET'])
def homepage():
#获取session里面的用户名
username = session.get("username")
if username:
response = make_response('<h1>{},欢迎你来到首页!</h1>'.format(username))
else:
response = make_response('<h1>亲,你还没有登录哦!</h1>')
return response
@app.route('/logout',methods=['GET'])
def logout():
rsp = make_response(jsonify({"msg": "暂未登录"}))
#如果存在cookie,清除session里面的值
if session.get("username") and session.get("password"):
session.pop('username')
session.pop('password')
rsp = make_response(jsonify({"success": True, "msg": "退出成功"}))
return rsp
if __name__ == '__main__':
app.run(debug=True, port=8899)
运行结果: