代码来自于网课中(老师名字需要求证后贴出)
文章目录
安装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的包有两种:
- 带有
__init__.py
文件的目录 - 当前目录下的
*.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)
效果图为: