Flask框架学习笔记

代码来自于网课中(老师名字需要求证后贴出)

安装Flask:

pip install flask==1.0.4

一、第一个简易程序

注意此处不可以使用from flask import *,需要理解例子中__name__的含义。

from flask import Flask

# __name__魔法对象,表示当前的模块的名字
# 模块名,flask以这个模块所在的目录为总目录,默认这个目录中的static为静态目录,templates为模板目录
# 当前_name_在hello.py文件里,根目录为HelloFlask,传的是根目录的static及templates
# 创建flask的应用对象
app = Flask(__name__)


# 在装饰器中绑定路径,.route()带参函数
@app.route("/")
def index():
    """定义的视图函数"""
    return "Hello"


if __name__ == '__main__':
    # .run()简易测试服务器
    app.run()

运行结果图:
运行结果图

二、关于if __name__ == '__main__':

Python的包

Python的包有两种:

  1. 带有__init__.py文件的目录
  2. 当前目录下的*.py文件。

当两者同名存在时,目录的优先级高于文件,文件会被隐藏而不可被使用

魔术变量

类似C语言的宏,该宏由编译器定义,在运行时,根据环境自动调整变量的值。Python中常见的魔术变量有__name__、__file__等。

  • __file__为当前文件的完整文件路径;
  • __name__为当前文件的包名,特别的,当以该文件启动时,该文件作为主包存在,主包的名称始终为:'__main__'

eg

运行demo.py文件打印出来的是写死的'__main__';作为导入的包,以hello作为启动文件,运行到import demo时,打印出来的是'demo',即包名。

三、实例化一个Flask对象

构造方法

    def __init__(
        self,
        import_name,
        static_url_path=None,
        static_folder='static',
        static_host=None,
        host_matching=False,
        subdomain_matching=False,
        template_folder='templates',
        instance_path=None,
        instance_relative_config=False,
        root_path=None
    ):

几个重要的参数

  • import_name: 包名,即当前应用从哪个包启动,以哪个包为根目录,一般情况下使用__name__,即以当前运行文件所在目录为根目录。
  • static_url_path: 指定访问静态目录的文件时,路由地址的前缀,默认为'/static',即访问静态目录文件时,需要使用http://主机域名或IP:端口号/static/<path:filename>来访问。
  • static_folder: 指定静态文件所在目录,默认为'static'
  • template_folder: 指定模板文件所在目录,默认为'templates'
app = Flask(
	__name__,
	static_url_path="/python",  # 访问静态资源的url前缀,默认值是/static
	static_folder="static",     # 静态文件的目录,默认值就是static
	template_folder="templates" # 模板文件的目录,默认值就是templates
)

四:配置文件

1、使用配置文件

(1)建立文件名为Config.cfg的配置文件:

DEBUG = True

(2)使用配置文件:
一般使用第二种:

1.使用配置文件
# app.config.from_pyfile("config.cfg")

2.使用对象配置参数
class Config(object):
    DEBUG = True
app.config.from_object(Config)

3.直接操作config的字典对象
 app.config["DEBUG"] = True
from flask import Flask


app = Flask(__name__,
            static_url_path="/python",  # 访问静态资源的url前缀,默认值是static
            static_folder="static",     # 静态文件的目录,默认值就是static
            template_folder="templates"  # 模板文件的目录,默认值就是templates
            )


# 配置参数的使用方式
# 1.使用配置文件
# app.config.from_pyfile("config.cfg")

# 2.使用对象配置参数
class Config(object):
    DEBUG = True


app.config.from_object(Config)

# 3.直接操作config的字典对象
# app.config["DEBUG"] = True


# 在装饰器中绑定路径,.route()带参函数
@app.route("/")
def index():
    """定义的视图函数"""
    a = 1/0   # 运行文件时调用配置文件DEBUG
    return "Hello Flask"


if __name__ == '__main__':
    # .run()简易测试服务器
    app.run()

运行hello.py文件时出现Debugger is active,成功调用配置文件
在这里插入图片描述访问127.0.0.1:5000
在这里插入图片描述

2、读取配置文件

读取配置文件的方法:
1、通过全局变量app读取
print(app.config.get("ITCAST"))
2、通过current_app读取,导入current_app,作为app的代名词
print(current_app.config.get("ITCAST"))
from flask import Flask
from flask import current_app

app = Flask(__name__,
            static_url_path="/python",  # 访问静态资源的url前缀,默认值是static
            static_folder="static",     # 静态文件的目录,默认值就是static
            template_folder="templates"  # 模板文件的目录,默认值就是templates
            )


# 配置参数的使用方式
# 1.使用配置文件
# app.config.from_pyfile("config.cfg")

# 2.使用对象配置参数
class Config(object):
    DEBUG = True
    ITCAST = "python" # 作为读取配置文件的参数


app.config.from_object(Config)

# 3.直接操作config的字典对象
# app.config["DEBUG"] = True


# 在装饰器中绑定路径,.route()带参函数
@app.route("/")
def index():
    """定义的视图函数"""
    # a = 1/0
    # 读取配置文件的方法
    # 1、通过全局变量app读取
    # print(app.config.get("ITCAST"))
    # 2、通过current_app读取,导入current_app,作为app的代名词
    print(current_app.config.get("ITCAST"))
    return "Hello Flask"


if __name__ == '__main__':
    # .run()简易测试服务器
    app.run()

在这里插入图片描述

五、run()使用

app.run()只能使用Running on 后面的ip地址进行访问,host=本机ip地址,可以用本机ip进行访问或者host=0.0.0.0,可以使用两个ip进行访问,此次只能带DEBUG参数,其他参数不可以。

app.run(host="0.0.0.0", port=5000,DEBUG = True)

六、获取路由信息

1、通过app.url_map()查看整个flask的路由信息

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    """定义的视图函数"""
    return "Hello Flask"


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

在这里插入图片描述

2、post请求

@app.route("/post_only", methods=["POST"]) # 指定为post请求方式
@app.route("/post_only", methods=["GET", "POST"])  # GET和POST访问方式
from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    """定义的视图函数"""
    return "Hello Flask"


@app.route("/post_only", methods=["POST"]) # 指定为post请求方式
def post_only():
    return "post only page"


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

在这里插入图片描述在这里插入图片描述

3、相同的url访问不同的视图函数

遇到相同的访问路径,不指明访问方式的时候只会hello1,从上往下执行,覆盖hello2;当指名访问方式的时候,hello1 methods=post,hello2 methods = get时,访问出现hello2

@app.route("/hello")
def hello1():
    return "hello1"


@app.route("/hello")
def hello2():
    return "hello2"

在这里插入图片描述

4、不同的url访问相同的视图函数

@app.route("/way1")
@app.route("/way2")
def hello():
    return "同一个 hello"

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5、重定向接口&通过方法名获得其对应的URL地址

导入redirect, url_for,建议使用方法二,便于改路径

# 通过方法名获得其对应的URL地址
@app.route("/get_url_name")
def interface_de_method():
    from flask import url_for
    return url_for("interface_hello")
# 重定向接口
@app.route("/redirect")
def interface_redirect():
    from flask import redirect
    return redirect("/hello")

运用url_for进行反解析

@app.route("/login")
def login():
    # 方法一:写死路径
    # url = "/"
    # 方法二:使用url_for的函数,通过视图函数的名字找到视图对应的url路径
    url = url_for("index")

    return redirect(url)

from flask import Flask, redirect, url_for

app = Flask(__name__)


@app.route("/")
def index():
    """定义的视图函数"""
    return "Hello Flask"


@app.route("/login")
def login():
    # 方法一:写死路径
    # url = "/"
    # 方法二:使用url_for的函数,通过视图函数的名字找到视图对应的url路径
    url = url_for("index")

    return redirect(url)


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

使用127.0.0.1:50000/login进行访问时,会进行跳转至127.0.0.1网页
在这里插入图片描述

6、自定义转换器在路由中提取参数

注意:此处需要多看。

from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)

app.config['DEBUG'] = True 
#debug模式,不用手动重启,代码修改后Ctrl+S就会自动重新运行

# 转换器 127.0.0.1:5000/goods/123


# @app.route("/goods/<int:goods_id>")
@app.route("/goods/<goods_id>")  # 不加转换器类型,为普通的字符串规则,除/之外的字符
def goods_detail(goods_id):
    """定义的视图函数"""
    return "goods detail  page %s" % goods_id


# 1、自定义自己的转换器
class RegexConverter(BaseConverter):
    """
    定义类的方式定义转换器,继承BassConverter
    """

    def __init__(self, url_map, regex):
        # 调用父类的初始化方法
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象的属性中,flask会使用这个属性去进行正则表达式匹配
        self.regex = regex


# 2、将自定义的转换器添加到flask的应用中


app.url_map.converters["re"] = RegexConverter

# 3、使用转换器
# 127.0.0.1:5000/send/15345678901


# 反斜杠必须两个;如果不想写两个,就前面加r,表示不转义
@app.route(r"/send/<re(r'1[34578]\d{9}'):mobile>")
def send_sms(mobile):
    return "send sms to %s" % mobile


if __name__ == '__main__':
    HOST = "127.0.0.1"
    PORT = 5000
    DOMAIN = "http://" + HOST + ":" + str(PORT)

    # print(app.url_map)
    # 打印路由信息表
    for item in app.url_map.iter_rules():
        print(" *", DOMAIN + str(item))
    # end for
    print()

    app.run()

在这里插入图片描述to_python提前参数的过程:15345678901与正则表达式进行匹配,正确则提取参数至to_python函数,可在此函数中对数字进行操作,如:以某种规则进行筛选,return至send_sms函数,进行打印。to_python,to_url函数可以不写有默认操作。
在这里插入图片描述to_url提取参数的过程:to_url()使用url_for()函数时被调用,18922222222提取数字进入to_url函数value中,返回至替换正则转换表达式中,再传至redirect中。
在这里插入图片描述

7、打印路由信息表

此处代码来自于此链接

if __name__ == '__main__':
    HOST = "127.0.0.1"
    PORT = 5000
    DOMAIN = "http://" + HOST + ":" + str(PORT)

    # 路由信息
    # print(app.url_map)
    for item in app.url_map.iter_rules():
        print(" *", DOMAIN + str(item))
    # end for
    print()

    # 启动应用
    app.run(host=HOST, port=PORT)

效果图为:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章