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 Flaskapp = 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,requestapp = 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,requestapp = 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,requestapp = 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, jsonifyapp = 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, jsonifyapp = 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_responseapp = 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 responseif __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_responseapp = 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,将登录的用户名和密码放进cookieresponse.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 responseif __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 osfrom flask import Flask, request, jsonify, make_response, sessionapp = 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,将登录的用户名和密码放进sessionsession['username'] = usernamesession['password'] = pwdelse: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 rspif __name__ == '__main__':app.run(debug=True, port=8899)
运行结果: