Flask知识点整理(一)

1.编写helloworld

"""
编写最简单的flask程序,7行代码

"""""
#1.从flask模块中导入Flask类
from flask import Flask

#2.通过Flask类创建应用程序对象
#默认参数: __name__,表示当前程序的启动入口,值是__main__, 如果从其他模块调用过来的值是模块名字demo02helloworld
#默认参数:static_folder, 静态资源文件夹,默认是static
#默认参数: static_url_path, 静态资源访问路径, /static
#默认参数: template_folder, 模板文件夹,默认是:templates
app = Flask(__name__)

print(__name__)
print(app.static_folder)
print(app.static_url_path)
print(app.template_folder)


#使用app装饰器,绑定路由路径,绑定视图函数
@app.route('/haha')
def hello_world():

    return "helloworld"

#程序启动入口
if __name__ == '__main__':
    #默认参数: host,IP地址127.0.0.1
    #默认参数: port, 5000
    app.run()

2.url_map

url_map: 存放在所有使用应用装饰绑定的,路径和视图函数
格式: app.url_map,返回的是一个map集合,表示的视图函数和路径之间的映射关系

from flask import Flask

app = Flask(__name__)


@app.route('/index')
def index2():
    return "<h1>首页内容</h1>"


@app.route('/index3')
def index3():
    return "<h1>商品内容</h1>"


def index4():
    return "<h1>hahaha</h1>"


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

map中的数据格式, 其中static是默认的,其余的是在使用@app.route装饰器之后,才会加到map中的.
格式如下:

Map([<Rule '/index3' (HEAD, GET, OPTIONS) -> index3>,
 <Rule '/index' (HEAD, GET, OPTIONS) -> index2>,
 <Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>])

3.路由和视图函数的关系

  1. 如果一个路由装饰多个视图函数,那么优先访问的是哪个视图函数
    答:先装饰的优先访问

  2. 如果多个路由装饰一个函数, 通过哪些路由路径,可以访问到该视图函数
    答:通过每个路径都可以访问

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "helloworld"


@app.route('/')
def hello_world2():
    return "helloworld2"

@app.route('/index1')
@app.route('/index2')
@app.route('/index3')
def index():

    return "index"

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

4.设置访问方式

如何在访问视图函数的时候指定对应的访问方式? 需要使用methods
格式: @app.route(‘路径’,methods=[“访问方式1”,”访问方式2”,…])
常见的访问方式有: GET,POST,PUT,DELETE
注意点:如果不指定访问方式,默认是GET

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "helloworld"


@app.route('/',methods=["POST","GET","PUT"])
def hello_world2():
    return "helloworld2"


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

5.url_for

url_for: 反解析,可以通过视图函数的名称找到路由路径
格式: url_for(‘视图函数名称’,参数)
参数格式: key = value

from flask import Flask,url_for

app = Flask(__name__)

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

    print(url_for('jingdong'))

    return "我这里没有,找: <a href='%s'>班长</a>"%url_for('jingdong')

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

    return "我是京东,我什么都有"

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

6.redirect 重定向

redirect: 重定向,通过路由路径,找到对应的视图函数.

格式: redirect(‘路径’)

特点: 两次请求
浏览器一旦检查到状态码为: 302(重定向代号)


from flask import Flask,redirect,url_for

app = Flask(__name__)

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

    # return "helloworld"

    # return redirect("/jingdong")
    #返回响应体,携带状态码302, 浏览器检测到之后,自动跳转到响应的指定路径
    return redirect(url_for('jingdong'))


@app.route('/jingdong')
def jingdong():
    return "我是京东,我很快"

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

7. 返回Json数据

如何返回json数据给客户端,一般后端程序和前端之后的数据交互格式都是json.

有两种指定方式:
1. 可以手动去指定Content-Type 为 application/json
2. 可以使用jsonify()方法返回json数据格式, 推荐使用

from flask import Flask, make_response, jsonify

app = Flask(__name__)

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

    # 1.可以手动去指定Content-Type 为 application/json, 创建响应体对象,手动指定格式类型
    # resp =  make_response("helloworld")
    # resp.headers["Content-Type"] = "application/json"

    #2.可以使用jsonify()方法返回json数据格式, 推荐使用
    # dict = {
    #     "name":"zhangsan",
    #     "age":"13"
    # }
    # return jsonify(dict)

    return jsonify(name='banzang',age="13")

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

8.给路由传参

  • 在访问视图函数的时候,如何传递数据类型格式
  • 格式: @app.route(‘/路径/<数据类型:变量名>’)
    • 数据类型种类:
      • int 表示整数
      • float 表示小数
      • path 表示字符串类型,如果不写默认就是path
"""


"""""
from flask import Flask

app = Flask(__name__)

@app.route('/<int:num>')
def int_num(num):

    return "the num is %s"%num

@app.route('/<float:num>')
def float_num(num):

    return "the num is %s"%num

@app.route('/<path:num>')
def path_num(num):

    return "the num is %s"%num


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

9.正则匹配路由

之所以int,float,path可以过滤不同的数据类型,是因为系统已经包含了这些类型的转换器(添加到默认的转换器列表中)

需求: 希望能够有过滤三位整数的转换器
当系统提供的转换器满足不了需求的时候,使用自定义转换器
* 格式:
* 1.自定义类,继承自BaseConverter
* 2.编写init方法,接收两个参数,一个给父类初始化,一个子类自己
* 3.将自定义转换器类添加到默认的转换器列表中


"""

"""""

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 1.自定义类,继承自BaseConverter
class  MyRegexConverter(BaseConverter):
        #规则固定死了,不够灵活,应该交给视图函数自己
        # regex = '\d{3}'

        # 2.编写init方法,接收两个参数,一个给父类初始化,一个子类自己
        def __init__(self,url_map,regex):
            #初始化父类空间
            super(MyRegexConverter, self).__init__(url_map)
            #初始化子类自己的规则
            self.regex = regex

        #to_python方法, 在此拦截,过滤数据,编码工作
        #在匹配到路径之后,执行视图函数之前
        def to_python(self, value):
            print("value = %s"%value)
            return int(value) + 10


# 3.将自定义转换器类添加到默认的转换器列表中
#添加自定义转换器列表到,默认转换器列表中
app.url_map.converters["re"] = MyRegexConverter

#输出默认的转换器列表
# print(app.url_map.converters)

#过滤三位整数
@app.route("/<re('\d{3}'):num>")
def hello_world(num):

    print("hello_world")

    return "the num is %s"%num

#过滤手机号
@app.route("/<re('1[345678]\d{9}'):mobile>")
def get_phone_num(mobile):

    return "the mobile is %s"%mobile


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

10 异常捕获

abort(代号): 主动跑出异常,停止该视图函数的执行

@app.errorhandler(代号/异常对象), 装饰函数,处理对应的异常页面,配合abort使用

from flask import Flask, abort

app = Flask(__name__)

@app.route('/<int:age>')
def hello_world(age):

    #判断如果年龄小于13岁,
    if age < 13:
        abort(404)


    raise(Exception('Big ERROR'))

    return "helloworld"

@app.errorhandler(404)
def page_not_found(e):

    print(e)
    return "服务器搬家了!!"

@app.errorhandler(Exception)
def big_error(e):

    return "服务器内部产生严重问题了!!"

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

11.配置debug

在运行程序的时候,每当改变代码之后能不能不需要重新启动就可以部署呢?
在app.run中可以设置host port
可以设置启动模式: debug=True
* 好处:
* 1. 代码改变之后程序不需要重新启动
* 2. 服务器内部出错之后,在界面有友好提示

from flask import Flask

app = Flask(__name__)

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

    # print('helloworld')

    1/0

    return "helloworld"

if __name__ == '__main__':
    #参数host : 127.0.0.1 / 0.0.0.0可以在同一台电脑通过虚拟机访问
    #参数port: 5000
    #参数debug: False

    app.run(host='0.0.0.0',port=5001,debug=True)

12.request

request: 里面封装的是核请求参数有关的内容,比如: 请求路径,请求方式,请求参数等等.

from flask import Flask,request

app = Flask(__name__)

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

    print(request.url)
    print(request.method)
    print(request.args)

    return "helloworld"

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

猜你喜欢

转载自blog.csdn.net/weixin_40420525/article/details/80884393