Bootstrap

flask框架

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)

运行后浏览器访问效果:

image-20210930111144237

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)

运行结果:

image-20210930112609676

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)

发送请求:

image-20210930115220028

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)

运行结果:

image-20210930121715374

视图响应案例:

"""
返回视图函数
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)

运行结果:

image-20210930150436454

5 模拟项目

一个完整的flask项目是分为三个部分的:

  • static:css、图片
  • templates:html
  • run.py:服务

案例如图所示:

image-20210930151126052

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)

登录成功如图:

image-20210930153406067

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)

运行结果:

image-20210930155251107

;