# –*– coding: utf-8 –*–
# @Time : 2019/7/6 09:47
# @Author : Damon_duanlei
# @FileName : hello_flask.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
from flask import Flask
# 创建flask的应用对象
# __name__ 当前模块名,传入模块名指明整个工程的总目录
# 默认此目录中的 static为静态目录, templates为静态目录
app = Flask(__name__)
# 装饰器的作用是将路由映射到视图函数 index
@app.route("/")
def index():
"""定义视图函数"""
return "index page"
@app.route("/hello")
def hello_flask():
return " Hello Flask
"
if __name__ == '__main__':
# 启动flask
app.run()
app = Flask(__name__,
static_url_path="/python", # static_utl_path 访问静态资源的前缀 默认值static
static_folder="/static", # static_folder 静态文件目录, 默认值static
template_folder="/template" # template_folder 模板目录,默认template
)
在 Flask 程序运行的时候,可以给 Flask 设置相关配置,比如:配置 Debug 模式,配置数据库连接地址等等,设置 Flask 配置有以下三种方式:
from flask import current_app
# 程序加载配置方式
# 1.使用配置文件
app.config.from_pyfile("config.cfg")
# 2.从对象导入(常用)
class Config(object):
DEBUG = True
app.config.from_object(Config)
# 3.直接操作app.config 的字典对象
app.config["DEBUG"] = True
# 读取配置参数
# 直接操作config的字典对象
app.config.get()
# 通过 current_app获取参数
curren_app.config.get()
可以指定运行的主机IP地址,端口,是否开启调试模式
app.run(host="127.0.0.1", port=5000, debug=True)
查看所有的路由使用 **app.url_map
if __name__ == '__main__':
print(app.url_map)
# 启动flask
app.run(debug=True)
运行结果:
Map([<Rule '/hello/flask' (HEAD, OPTIONS, GET) -> hello_flask>,
<Rule '/hello' (HEAD, OPTIONS, GET) -> hello_flask>,
<Rule '/' (HEAD, OPTIONS, GET) -> index>,
<Rule '/static/' (HEAD, OPTIONS, GET) -> static>])
# –*– coding: utf-8 –*–
# @Time : 2019/7/7 10:50
# @Author : Damon_duanlei
# @FileName : url_demo.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
from flask import Flask, redirect, url_for
# 创建flask的应用对象
# __name__ 当前模块名,传入模块名指明整个工程的总目录
# 默认此目录中的 static为静态目录, templates为静态目录
app = Flask(__name__)
@app.route("/")
def index():
"""定义视图函数"""
return "index page"
# 一个视图函数对应多个路由
@app.route("/hello/flask")
@app.route("/hello")
def hello_flask():
return " Hello Flask
"
# 通过methods指定访问的限定方式
@app.route("/postonly", methods=["POST"])
def post_only():
return "post only page"
# 同一路由装饰多个视图函数
@app.route("/methods", methods=["POST"])
def post_method():
return "post method page"
@app.route("/methods", methods=["GET"])
def get_method():
return "GET method page"
# 使用url_for进行反解析
@app.route("/login")
def login():
# 登录逻辑......
# 使用url_for 函数, 可以通过视图函数的名字找到视图函数对应的url路径
url = url_for("hello_flask")
return redirect(url)
if __name__ == '__main__':
print(app.url_map)
# 启动flask
app.run()
有时需要将同一类 URL 映射到同一个视图函数处理, 比如, 使用同一个视图函数来显示不同用户的个人信息.
代码示例:
# –*– coding: utf-8 –*–
# @Time : 2019/7/7 14:57
# @Author : Damon_duanlei
# @FileName : converter_demo.py
# @BlogsAddr : https://blog.csdn.net/Damon_duanlei
from flask import Flask, redirect, url_for
# 创建flask的应用对象
# __name__ 当前模块名,传入模块名指明整个工程的总目录
# 默认此目录中的 static为静态目录, templates为静态目录
app = Flask(__name__)
@app.route("/")
def index():
"""定义视图函数"""
return "index page"
# 转换器
# 转换器有以下类型
# string 接受字符串 除"/"
# int 接受整数
# float 接受浮点数
# path 和默认转换器相似, 但是接受斜线
@app.route("/user/" )
@app.route("/user/" ) # 不指定转换器类型时 使用默认string类型
def user(user_id):
return "user id is {}".format(user_id)
# 自定义转换器(提取手机号为例)
# 导入 BaseConverter
from werkzeug.routing import BaseConverter
# 1.定义自己的转换器
class MobileConverter(BaseConverter):
def __init__(self, url_map):
# 调用父类的初始化方法
super().__init__(url_map)
self.regex = "13[0-9]{9}" # 以此为例
#
# 2.将自定义的转换器添加到flask的app.url_map.converters
app.url_map.converters["mobile"] = MobileConverter
# 3.使用自定义的转换器
@app.route("/call/" )
def call_phone(mobile_number):
return "call phone number {}".format(mobile_number)
# 定义正则转换器
class RegexConverter(BaseConverter):
def __init__(self, url_map, regex):
super().__init__(url_map)
self.regex = regex
def to_python(self, value):
# 转换器提取到参数后会将参数传到 to_python中进行用户自定义的逻辑处理
# 将处理后的值返回给视图函数
pass
return "处理后的参数"
def to_url(self, value):
# 当重定向使用 url_for 时,入重定向到的视图函数使用转换器获取参数
# 如 url = url_for("call_phone",mobile_number="xxx")时
# 传入的参数先进入 to_url 方法处理,将处理结果返回给 call_phone 视图函数
pass
return "处理后的参数"
app.url_map.converters["re"] = RegexConverter
# 将匹配的正则表达式以参数行驶传入
@app.route("/callnumber/" )
def send_email(number):
return "call number to {}".format(number)
if __name__ == '__main__':
# 启动flask
app.run(debug=True)