flask框架1

flask框架1

文章目录

  • flask框架1
      • 一. flask介绍
      • 二. 虚拟环境 (重点)
      • 三. 基本使用
        • 3.1 第一个flask程序
        • 3.2 路由的基本定义
        • 3.3 请求对象
          • 3.3.1 基本数据
          • 3.3.2 查询字符串 (重点)
          • 3.3.3 请求体 (重点)
        • 3.4 响应
          • 3.4.1 自定义响应对象
          • 3.4.2 返回json (重点)
          • 3.4.3 重定向
          • 3.4.4 自定义状态码
        • 4. 异常处理
      • 四. 状态保持 (重点)
        • 4.1 cookie
        • 4.2 session

一. flask介绍

二. 虚拟环境 (重点)

  • 虚拟环境: 独立的python环境, 可以有效的避免框架的多版本冲突问题
    flask框架1_第1张图片
  • 三个命令:
    • 创建虚拟环境 mkvirtualenv -p python3 env20
    • 退出虚拟环境 deactivate
    • 进入虚拟环境 workon env20
    • 查看所有的虚拟环境 workon 双击tab

mac安装虚拟环境: https://www.jianshu.com/p/dc7ec6a303e3

三. 基本使用

3.1 第一个flask程序

  • 安装第三方包 pip install flask==0.10.1
  • 查看已安装的包 pip freeze
from flask import Flask


# 1.创建web应用
app = Flask(__name__)


@app.route("/")   # 绑定路由: 当访问指定的URL时, 会调用对应的视图函数
def index():  # 首页展示
    a = 10 / 20
    return "首页"


if __name__ == '__main__':
    # 2. 运行web应用 (运行flask内置的测试服务器, 接收将请求并转发给web应用)
    # 参数: 1> 绑定的ip  2> 监听的端口  3> 是否开启调试模式
    # 万能ip  0.0.0.0  可以同时接收本机/局域网/外网的请求
    # 开启调试模式 1> 可以在网页上显示python错误  2> 更新代码后, 会自动重启服务器
    app.run(host="0.0.0.0", port=8000, debug=True)

3.2 路由的基本定义

  • POSTMAN: WEB开发的调试工具
from flask import Flask

app = Flask(__name__)


# methods参数用于设置路由支持的请求方式
@app.route('/', methods=['POST', 'GET'])  # 路由必须以路径分隔符 / 开头
def index():

    return "index"


if __name__ == '__main__':
    # 记录了所有的路由规则(URL 支持的请求方式 视图函数的名字)
    print(app.url_map)
    app.run(debug=True)

3.3 请求对象

3.3.1 基本数据
# 常用属性 url method headers
print(request.url)  # 请求的URL
print(request.method) # 本次请求的请求方式
print(request.headers)  # 本次的请求头  类字典对象
print(request.headers["Host"])
print(request.headers.get("Host"))  # 键不存在, 不会报错 推荐
3.3.2 查询字符串 (重点)
  # 获取查询字符串   一般用于GET传递数据    类字典对象
  print(request.args.get("name"))
3.3.3 请求体 (重点)
  • 键值对数据 如form表单发出的默认post
print(request.form.get("name"))
  • 文件 如照片, 头像
file = request.files.get("avatar")  # type: FileStorage
# 保存到本地
file.save("image1.jpg")
  • 文本数据 如 html, json
# 获取文本数据  bytes  类字符串对象  包含二进制数据
# 编码 文本数据 -> 二进制   str1.encode("utf-8") = bytes1
# 解码  二进制 -> 文本数据   bytes2.decode("utf-8") = str2
data = request.data
# print(data)
# print(type(data))
str1 = data.decode("utf-8")
print(str1)
print(type(str1))

3.4 响应

3.4.1 自定义响应对象
from flask import Flask, make_response

app = Flask(__name__)


# 自定义响应对象
@app.route('/')
def index():

    # 视图函数返回值可以是str/bytes, 但最终都会被flask框架包装为Response响应对象
    # return "index"

    # 可以手动包装响应对象  作用: 自定义响应报文
    response = make_response("index")
    print(response.headers)  # 类字典对象  可以取值和赋值
    return response


if __name__ == '__main__':
    app.run(debug=True)
3.4.2 返回json (重点)
# 返回json
@app.route('/demo1')
def demo1():
    # json 是一种常用的数据交换格式  本质 带有格式的字符串  {}  []  xml
    dict1 = {"name": "zs", "age": 20}

    # dict -> json字符串
    json_str = json.dumps(dict1)
    # print(json_str)
    # print(type(json_str))

    # json字符串 -> dict
    dict2 = json.loads(json_str)
    print(type(dict2))

    # return json_str

    # flask中内置了jsonify语法, 可以自动将dict转为json字符串, 并且设置响应的content-type为 applictiion/json
    # return jsonify(dict1)
    return jsonify(name="zs", age=20)  # 也支持关键字实参形式来设置, 但是数据必须是内置类型
3.4.3 重定向
# 重定向: 跳转到网络的另一个位置   如:页面跳转  a href  js  window.location.href
@app.route('/demo2')
def demo2():
    # return redirect("http://www.baidu.com")
    # return redirect("/demo1")

    # url_for获取视图函数的URL
    # url1 = url_for("demo")
    # print(url1)
    
    # return "demo2"
    
    # 开发中经常让redirect和url_for进行联用   有利于代码升级和重构
    return redirect(url_for("demo"))
3.4.4 自定义状态码
# 自定义状态码   作用: 方便快速排错
@app.route('/demo3')
def demo3():
    # 设置第二个返回值, 用于自定义状态码 
    return "demo3", 700

4. 异常处理

  • flask中封装了对于http错误的异常处理和主动抛出
from flask import Flask, abort

app = Flask(__name__)


@app.route('/')
def index():
    # a = 10 / 0

    abort(404)   # 主动抛出http错误
    return "index"


# errorhandler可以捕获http错误, 还可以捕获系统内置错误
@app.errorhandler(404)
def error_404(e):  # 必须设置形参来接收具体的错误信息

    return "您访问的页面去浪迹天涯了... %s" % e


@app.errorhandler(ZeroDivisionError)
def error_zero(e):
    return "除数不能为0"


if __name__ == '__main__':
    app.run(debug=True)

四. 状态保持 (重点)

  • 用户的访问状态进行记录的机制, 如 用户是否观看过帮助信息, 用户是否已经登录, 用户的搜索记录等

4.1 cookie

  • 特点:
    • 将数据保存在客户端
    • 浏览器会自动将该网站的cookie数据发给服务器
  • 场景: 一般存放一些不太重要的数据, 可以减轻服务器的存储压力

flask框架1_第2张图片
flask框架1_第3张图片

  • cookie设置过期时间

  • max-age

    • -1: 浏览器关闭时删除cookie 默认值
    • 0: 立即删除cookie
    • 正数: max-age=5, 表示5秒后删除cookie
      flask框架1_第4张图片
  • cookie细节

    • 只要cookie保存了数据, 无论访问网站的哪个路由, 浏览器都会自动携带cookie数据
    • 同源策略: 浏览器只会将cookie发送给对应的网站(ip/域名是否一致)
    • cookie也可以前端进行设置

4.2 session

  • 特点:

    • 将数据保存在服务端
    • session机制是需要依赖cookie机制(sessionid需要保存到cookie中)
  • 场景: 一般存放一些重要/敏感的数据, 安全性更高
    flask框架1_第5张图片

  • 登录的基本实现

from flask import Flask, request, redirect, url_for

app = Flask(__name__)


@app.route('/')
def index():

    return "首页"


# 用户登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    # 判断是否为GET请求
    if request.method == 'GET':  # 显示页面
        # 读取网页内容, 返回html字符串
        with open("login.html") as f:
            html_str = f.read()
            return html_str

    # POST处理  提交数据
    # 获取参数
    username = request.form.get("username")
    password = request.form.get("password")
    # 校验密码
    if username == "laowang" and password == "123":
        # 如果登录成功, 跳转到首页
        return redirect(url_for("index"))
    else:
        return "登录失败"



if __name__ == '__main__':
    app.run(debug=True)
  • session实现免密码登录

flask框架1_第6张图片

你可能感兴趣的:(python,python,flask框架)