第一个Flask程序
# coding:utf-8
from flask importFlask#创建flask的应用对象
app = Flask(__name__)
@app.route("/")defindex():return 'hello'
if __name__ == "__main__":''''''app.run()
F:\PythonBegin\flaskVir>python hello.py
4.1 Flask创建app对象
4.1.1 初始化参数
import_name:
static_url_path: 访问静态资源的URL前缀,默认是static
例:http://127.0.0.1:5000/static/hello.html
app = Flask(__name__,
static_folder='static',
static_path='python',
template_folder='templates')
访问时为:http://127.0.0.1:5000/python/hello.html
static_folder: 默认‘static’
template_folder: 默认‘templates’
4.1.2 配置参数
1.使用配置文件
DEBUG = True -----> config.cfg
app.config.from_pyfile(“config.cfg”) 或app.config.from_object()
2.使用类对象 配置参数
class Config(object):
DEBUG = True
ITCAST = "python"
app.config.from_pyfile(Config)
3.直接操作config字典对象
app.config('DEBUG') = True
4.视图中使用配置参数,两种方式
classConfig(object):
DEBUG=True
ITCAST= "python"
@app.route("/")defindex():"""定义的视图函数"""
#a = 1 / 0
#读取配置参数
#1. 直接从全局对象app的config字典中取值
#print(app.config.get("ITCAST"))
#2. 通过current_app获取参数
print(current_app.config.get("ITCAST"))
5.app.run的使用
if __name__ == '__main__':#启动flask程序#app.run()
app.run(host="0.0.0.0", port=5000, debug=True)
4.2 路由
4.2.1 app.url_map 查看所有路由
if __name__ == '__main__':#通过url_map可以查看整个flask中的路由信息
print(app.url_map)#启动flask程序
app.run(debug=True)
4.2.2 同一路由装饰多个视图函数
路径和请求方式一样时,会先匹配第一个,
当请求方式不一样时,会按请求方式寻找路径
@app.route("/hello", methods=["POST"])defhello():return "hello 1"@app.route("/hello", methods=["GET"])defhello2():return "hello 2"
4.2.3 同一视图多个路由装饰器
@app.route("/hi1")
@app.route("/hi2")defhi():return "hi page"
4.2.4 利用methods限制访问方式
@app.route('/sample', methods=['GET', 'POST'])
4.2.5 使用url_for进行反解析
from flask importFlask, current_app, redirect, url_for
@app.route("/index")defindex():"""定义的视图函数"""
return "hello flask"@app.route("/login")deflogin():#url = "/"
#使用url_for的函数,通过视图函数的名字找到视图对应的url路径
url= url_for("index")return redirect(url)
4.2.5 动态路由
#转换器#127.0.0.1:5000/goods/123#@app.route("/goods/")
@app.route("/goods/") #不加转换器类型, 默认是普通字符串规则(除了/的字符)
defgoods_detail(goods_id):"""定义的视图函数"""
return "goods detail page %s" % goods_id
4.2.5 自定义转换器
from flask importFlaskfrom werkzeug.routing importBaseConverter#1. 定义自己的转换器
classRegex_url(BaseConverter):def __init__(self,url_map,*args):
super(Regex_url,self).__init__(url_map)
self.regex=args[0]
app= Flask(__name__)
app.url_map.converters['re'] =Regex_url
@app.route('/user/')defhello_itcast(id):return 'hello %s' %idfrom flask importFlaskfrom werkzeug.routing importBaseConverter#1. 定义自己的转换器
classMobileConverter(BaseConverter):def __init__(self, url_map):
super(MobileConverter, self).__init__(url_map)
self.regex= r'1[34578]\d{9}'
#2. 将自定义的转换器添加到flask的应用中
app.url_map.converters["re"] =RegexConverter
app.url_map.converters["mobile"] =MobileConverter#127.0.0.1:5000/send/18612345678#@app.route("/send/") 还可以定义这样的路由
@app.route("/send/")defsend_sms(mobile_num):return "send sms to %s" % mobile_num
转换器进阶:
from werkzeug.routing import BaseConverter #BaseConverter中有两个方法to_python,to_url
classRegexConverter(BaseConverter):""""""
def __init__(self, url_map, regex):#调用父类的初始化方法
super(RegexConverter, self).__init__(url_map)#将正则表达式的参数保存到对象的属性中,flask会去使用这个属性来进行路由的正则匹配
self.regex =regexdefto_python(self, value):""""""
print("to_python方法被调用")#return "abc"
#value是在路径进行正则表达式匹配的时候提取的参数
returnvaluedefto_url(self, value):"""使用url_for的方法的时候被调用"""
print("to_url方法被调用")#return "15811111111"
returnvalue
@app.route("/send/")defsend_sms(mobile_num):return "send sms to %s" %mobile_num
@app.route("/index")defindex():
url= url_for("send_sms", mobile_num="18922222222")#/send/18922222222
return redirect(url)