第一个Flask程序
# coding:utf-8
from flask import Flask # 创建flask的应用对象 app = Flask(__name__) @app.route("/") def index(): 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.视图中使用配置参数,两种方式
class Config(object): DEBUG = True ITCAST = "python"
@app.route("/") def index(): """定义的视图函数""" # 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"]) def hello(): return "hello 1" @app.route("/hello", methods=["GET"]) def hello2(): return "hello 2"
4.2.3 同一视图多个路由装饰器
@app.route("/hi1") @app.route("/hi2") def hi(): return "hi page"
4.2.4 利用methods限制访问方式
@app.route('/sample', methods=['GET', 'POST'])
4.2.5 使用url_for进行反解析
from flask import Flask, current_app, redirect, url_for @app.route("/index") def index(): """定义的视图函数""" return "hello flask" @app.route("/login") def login(): # url = "/" # 使用url_for的函数,通过视图函数的名字找到视图对应的url路径 url = url_for("index") return redirect(url)
4.2.5 动态路由
# 转换器 # 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
4.2.5 自定义转换器
from flask import Flask from werkzeug.routing import BaseConverter # 1. 定义自己的转换器 class Regex_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/<re(r"[a-z]{3}"):id>') def hello_itcast(id): return 'hello %s' %id from flask import Flask from werkzeug.routing import BaseConverter # 1. 定义自己的转换器 class MobileConverter(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/<re(r'1[34578]\d{9}'):mobile_num>") 还可以定义这样的路由 @app.route("/send/<mobile:mobile_num>") def send_sms(mobile_num): return "send sms to %s" % mobile_num
转换器进阶:
from werkzeug.routing import BaseConverter #BaseConverter中有两个方法to_python,to_url class RegexConverter(BaseConverter): """""" def __init__(self, url_map, regex): # 调用父类的初始化方法 super(RegexConverter, self).__init__(url_map) # 将正则表达式的参数保存到对象的属性中,flask会去使用这个属性来进行路由的正则匹配 self.regex = regex def to_python(self, value): """""" print("to_python方法被调用") # return "abc" # value是在路径进行正则表达式匹配的时候提取的参数 return value def to_url(self, value): """使用url_for的方法的时候被调用""" print("to_url方法被调用") # return "15811111111" return value @app.route("/send/<re(r'1[34578]\d{9}'):mobile_num>") def send_sms(mobile_num): return "send sms to %s" % mobile_num @app.route("/index") def index(): url = url_for("send_sms", mobile_num="18922222222") # /send/18922222222 return redirect(url)