码迷,mamicode.com
首页 > 其他好文 > 详细

Flask基本使用

时间:2020-08-17 17:18:57      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:标记   port   客户端   删除   odi   实现   headers   regex   开发   

1.Flask路由 

1.1 定义路由 

from flask import Flask

app = Flask(__name__)

# 1.路由对应的URL必须以/开头
# 2.通过app的url_map属性获取所有的路由规则 (URL资源段 支持的请求方式 视图函数标记)
# 3.可以通过route方法的methods参数指定路由支持的请求方式
@app.route(/hello, methods=[post, get])
def index():
    return "index"


if __name__ == __main__:
    print(app.url_map)

    # 获取路由信息
    # for rule in app.url_map.iter_rules():
    #     print(rule.rule, rule.methods, rule.endpoint)

    app.run(debug=True)

1.2 路由变量:  传递URL路径参数, 实现动态URL

from flask import Flask

app = Flask(__name__)

# 路由变量: 传递URL路径参数
# 格式: /user/<路由变量名>
@app.route(/user/<userid>)
def index(userid):  # 必须定义同名形参接收路由变量的值
    print(userid)
    return "index"


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

1.3 路由转换器: 对URL传递的参数进行格式校验, 类似Django设置URL时的正则表达式参数

from flask import Flask

app = Flask(__name__)

# 路由转换器: 对路由变量进行格式校验  条件不满足返回404
# 格式: /user/<路由转换器名:路由变量>
@app.route(/user/<int:userid>)  # int: 内置转换器, 要求1-n个整数
def index(userid):
    print(userid)
    return "index"


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

1.4 自定义转换器: 开发者还可以自定义转换器, 更加灵活的校验路由变量

# 自定义转换器:
# 1.定义转换器类, 继承BaseConverter
# 2.设置regex属性 (正则匹配规则)
# 3.添加自定义转换器

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 1.定义转换器类:继承自BaseConverter
class MobileConverter(BaseConverter):
    # 2.设置regex属性(匹配规则)
    regex = 1[3-9]\d{9}$  # 不要设置开头的^


# 3.添加自定义转换器: 往app,url_map.cpnverters添加转换器
app.url_map.converters[mob] = MobileConverter


@app.route(/user/<mob:mobile>)
def index(mobile):
    print(mobile)
    return "index"


if __name__ == __main__:
    # 获取所有的转换器 {转换器名: 转换器类}
    # print(app.url_map.converters)
    app.run(debug=True)

 

2. Flask请求: flask的请求数据通过 request 对象来获取

  技术图片

from flask import Flask, request
from werkzeug.datastructures import FileStorage

app = Flask(__name__)


@app.route(/, methods=[get, post])
def index():
    # 获取请求的基础数据
    # print(request.url)  # 请求的URL
    # print(request.method)  # 本次请求的请求方式
    # print(request.headers)  # 获取请求头信息  类字典对象

    # print(request.headers[‘Host‘])
    # print(request.headers.get(‘Host‘))  # 建议使用get方法, 键不存在不报错

    # 请求传递数据 1> URL路径 -> 路由变量  2> 查询字符串 get  3> 请求体  post  4> 请求头 -> request.headers

    # 获取查询字符串 -> request.args  xx?name=zs&age=20  类字典对象
    # print(request.args.get(‘name‘))
    # print(request.args.get(‘age‘))

    # 请求体:   键值对(表单)   文本(json/xml)  文件(图片/音频)

    # 获取post键值对 -> request.form  类字典对象
    # print(request.form.get(‘username‘))

    # 获取post文本数据 -> request.data / request.json
    # print(request.data)  # 返回bytes类型
    # print(request.json.get(‘age‘))  # request.json直接将json字符串转为字典

    # 获取post文件 -> request.files  类字典对象
    file = request.files.get("avatar")  # type: FileStorage
    # print(type(file))  # 返回 FileStorage文件对象
    # 将文件保存到本地
    file.save(123.jpg)

    # 获取文件的二进制数据
    # img_bytes = file.read()
    # print(img_bytes)

    return "index"


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

 

3. Flask响应

3.1 访问静态资源

设置步骤:

① 将静态资源放入到 项目的 static 文件夹中
② 通过内置的静态资源的访问路由, URL路径格式为 /static/<filename>
        如 static目录放入文件 123.jpg, 则访问URL为 http://127.0.0.1:5000/static/123.jpg

Flask对象的初始化参数 也可以 修改静态资源的存储和访问路径

from flask import Flask

app = Flask(__name__,  # 导入名称, flask会根据该参数查询静态文件的存储路径
            # 官方建议直接使用__name__, 表示从当前目录中查询静态文件存储路径
            static_folder="static1",  # 设置静态文件的存储目录
            static_url_path=/res/img,  # 设置静态文件的URL访问路径 如 127.0.0.1:5000/res/img/123.jpg
            )


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

3.2 设置响应数据:

Flask中设置响应数据主要有两种方式:
    设置多个返回值
    自定义响应对象

3.2.1 三个返回值: Flask中 视图函数的返回值可以设置三个, 分别对应 响应体, 响应状态码, 响应头

from flask import Flask, redirect, url_for

app = Flask(__name__)


@app.route(/demo1)
def demo1():
    # 返回值:  响应体, 响应状态码, 响应头
    return demo1, 400, {A: 40}

3.2.2 自定义响应对象: 视图函数返回的 str / bytes 类型数据会被包装为 Response 响应对象, 也可以 创建响应对象来 自定义响应头 等信息

# 自定义响应对象
@app.route(/demo2)
def demo2():
    # 视图函数的返回值可以为str/bytes类型, 并且flask内部会将其包装为Response响应对象
    # return ‘hello flask‘

    # 创建响应对象     设置响应头时,需要手动创建响应对象
    response = make_response(hello flask)  # type: Response ==>指定了response的类型从而使headers能被点出来
    # 设置响应头
    response.headers[B] = 10
    return response


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

3.3 返回Json:

  不推荐使用 json.dumps() 直接返回, 返回的数据要符合 HTTP 协议规范, JSON 需要指定 content-type:application/json

  接口需要返回 JSON 数据,在 Flask 中可以直接使用 jsonify() 生成一个 JSON 的响应

from flask import Flask, make_response, Response, jsonify

app = Flask(__name__)


@app.route(/demo3)
def demo3():

    dict1 = {name: zs, age: 20}
    # 字典转json字符串
    # return json.dumps(dict1)

    # 可以将字典转json字符串, 并且设置响应头的content-type为application/json
    # return jsonify(dict1)
    return jsonify(name=zs, age=20)  # 也支持关键字实参的形式


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

3.4 重定向: flask中通过 redirect() 实现重定向功能

from flask import Flask, redirect

app = Flask(__name__)


@app.route(/demo3)
def demo3():

    return jsonify(name=zs, age=20)  


@app.route(/demo4)
def demo4():
    # 重定向到指定网站
    # return redirect(‘http://www.baidu.com‘)
    # 重定向到自己的路由   只需要URL资源段
    return redirect(/demo3)


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

 

4 状态保持: Cookie 和 Session

4.1 Cookie

特点:
    将数据保存在 客户端 (用户的电脑上), 可以减轻服务器压力
    访问网站时, 浏览器会 自动 将该网站的cookie数据发送给服务器
使用场景:
    保存一些 不太重要的数据 

代码示例:

from flask import Flask, make_response, Response, request

app = Flask(__name__)


@app.route(/)
def index():
    # 后端设置cookie:  通过响应体的set_cookie字段

    # 创建响应对象
    response = make_response(index)  # type: Response

    # 设置响应头的set_cookie字段  value必须是str/bytes类型
    response.set_cookie(per_page, 10, max_age=86400)

    # 删除cookie   本质: 设置max-age=0
    # response.delete_cookie(‘per_page‘)

    # 返回响应对象
    return response

@app.route(/demo1)
def demo1():
    # 获取cookie:  浏览器会自动通过请求头的cookie字段来传递cookie数据

    # request.cookies 直接获取到字典形式的cookie数据
    print(request.cookies.get(per_page))

    return demo1


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

4.2 Session

特点:
    将数据保存在 服务端 (服务器的数据库中), 安全性更高
使用场景:
    保存一些 重要/敏感的数据

代码示例:

from datetime import timedelta
from flask import Flask, session

app = Flask(__name__)
# 设置应用秘钥   会被用于session签名
app.secret_key = test
# 设置session过期时间   默认31天
app.permanent_session_lifetime = timedelta(days=14)


@app.route(/)
def index():
    # session是一个类字典对象, 对其取值/赋值 就可以实现session数据的读写

    # 记录session数据
    session[username] = zs

    # 设置session支持过期时间
    session.permanent = True

    # 删除session数据
    # session.pop(‘username‘)

    return "index"


@app.route(/demo1)
def demo1():

    # 获取session数据
    name = session.get(username)
    print(name)
    return demo1

 

5. 异常处理: flask对 HTTP错误 进行了封装, 可以捕获http错误, 也可以主动抛出http错误

from flask import Flask, abort
# flask对http错误进行了封装, 可以捕获http错误也可以主动抛出http错误

app = Flask(__name__)

# 捕获http错误
@app.errorhandler(404)
def error_404(error):  # 一旦进行捕获, 要求必须定义形参接收具体错误信息
    return "<h3>您访问的页面去浪迹天涯了</h3> %s" % error


# 还可以捕获系统内置错误
@app.errorhandler(ZeroDivisionError)
def error_zero(error):
    return 除数不能为0


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

    abort(500)  # 主动抛出异常 (只能抛出http错误)
    return "index"


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

 

 

 

    

    

Flask基本使用

标签:标记   port   客户端   删除   odi   实现   headers   regex   开发   

原文地址:https://www.cnblogs.com/yqyn-study/p/13504187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!