一个简单的Flask程序
步骤:
1.导入Flask
2.创建Flask应用实例
3.定义视图函数并绑定URL
4.启动服务器
# 导入Flask(从falsk包中导入Flask类)
from flask import Flask
创建Flask类的对象:Flask类源代码规定此处必须要由一个参数:import_name,其余的都有默认值,因此必须要传入参数,但是为什么要传入__name__?
#同时源代码规定这个参数必须要是字符串.__name__在这个文件中就是'__main__',但是不能是python中已有的标准模块名.
# 传入__name__的原因:用来确定程序实例所在的路径,方便访问默认文件夹static,同时对于静态请求的访问和处理更方便.
app = Flask(__name__)
# endpoint:就是指视图函数名的字符串形式
# 定义路由的url地址:括号里必须要由参数(第一个参数是Rule),同时必须要是字符串形式,还要是用/开头.methods可以修改请求方式,但是需要是列表格式。可以放多种请求方式。
@app.route('/' , methods=['POST'])
def hello():
return 'hello world',404
# 启动服务器
# __name__表示当前模块名.如果是在自身模块中,就是__main__如果成为是被导入文件的时候,表示的就是文件名
if __name__ == '__main__':
# 查看路由映射:具有的url地址和试图函数名的关系
print(app.url_map)
app.run(debug=True)
#debug调式模式:帮助定位错误信息,同时可以自动跟踪代码变化。
控制台输出结果为:
Map([<Rule '/' (OPTIONS, GET, HEAD) -> hello>,
<Rule '/static/<filename>' (OPTIONS, GET, HEAD) -> static>])
Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Map和Rule分别是类,Map就是指路由映射,用列表存储,第二个参数/,表示的就是装饰器存储的Rule规则,接下来的参数代表请求方法,最后一个参数代表视图函数名的字符串形式,就表示断点(endpoint)。
注意return返回的hello world,不是仅仅只反映回的这个字符串,而是一系列的响应报文。
默认的端口号是5000:在源码内有定义。
补充:
1.如果定义了两个同样的视图函数,即视图函数名重名,会导致无法运行程序。
2.如果定义了不同的试图函数名,但是url路径是一样的,这个结果是可以运行,但是浏览器页面的返回结果是取决于第一个视图函数的返回值,这取决于Map的容器类型是列表,是按照顺序查找的,先找到就可以停止了。因此url地址是可以重复的。
3.不同的http请求方法是对应不同的操作,GET查询,POST插入,PUT修改,DELETE删除。
4.注意return的返回值可以是其他的数据类型吗?还是只能是字符串形式?
字典类型:会报错误,500服务器错误,启动debug调试之后,显示字典类型错误。字典属于python数据类型,浏览器无法识别,同时列表也是不可以。但是元组形式是可以的,但是需要是(str,int)第一个参数就是返回的字符串数值。第二个数字以状态码的形式返回。json也是可以返回的。
5.我们可以不使用装饰器定义路由url地址吗?
答案自然是肯定的,我们可以查看route的源代码,发现其实内部实现的功能代码是:
self.add_url_rule(rule,endpoint,f,**options)
return f
实现装饰器功能代码:
app.add_url_rule('/' ,'hello' ,hello)
前后hello代表的含义不一样,第一个是但会的端点(试图函数名的字符串形式),第二个代表试图函数名,注意不能加()
6.代码在启动后存在路由映射存在一个默认的路由映射,会有一个静态的static路由映射。是flask自己实现的,方便静态路径访问。
7.return同样可以在后面返回状态码:404,在这个过程中,即使是浏览器不存在状态吗,也是可以返回的。只不过显示UNKNOWN,这个功能可以用来实现前后端的数据交互。
相关配置参数
debug=True 就属于一个配置信息
加载配置文件有三种实现方式:
1.加载配置对象 (config是flask的内置配置对象)
前提:需要在当前路径下有一个名字为config.py的文件,里面定义了一个Config的类,其中定义 debug=True
from config import Config
app.config.from_object(Config)
2.加载配置文件
前提,有个config。ini的文件吗,里面定义了debug=True
app.config.from_pyfile('config.ini')
3.加载环境变量
app.config.from_envvar(‘SET’)
此时更改环境变量,在其中添加一个SET,对应的是有debug调试的文件。
注意 :重点掌握第一种,因为其是定义一个类,扩展性很强,可以将其Config设置为基本配置类。
#基本配之类:
class Config:
DEBUG = None
#开发模式配置
class DevelopmentConfig(Config):
DEBUG = True
#生产模式配置
class ProductionConfig(Config):
DEBUG = False
(debug调试模式一般只在开发模式使用)
然后定义一个字典映射:
config_dict = {
'dev':DevelopmentConfig,
'pro’: ProductionConfig
}
然后在开发文件中倒入这个字典,然后在家在配置文件中使用字典config['div']来决定使用什么配置文件。
重定向(redirect/url_for)
1. # 导入flask内置函数redirect
from flask import Flask,redirect
# 重定向:重新发送网络请求
app = Flask(__name__)
@app.route('/')
def hello():
# 重定向到百度
#当项目的路径url或者是文件发生变化时,可以使用重定向。
return redirect('http://www.baidu.com')
if __name__ == '__main__':
app.run()
我们同样是访问根路径,此时跳转到百度页面,同时注意浏览器的状态码为302.同时redirect的参数可以用变量来传入。
**2. url_for方式**
# 导入flask内置函数redirect
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/')
def index():
# 重定向到百度
# 当项目的路径url或者是文件发生变化的时候,可以使用
return redirect('http://www.baidu.com')
@app.route('/for')
def demo_url_for():
return redirect(url_for(index))
if __name__ == '__main__':
app.run()
注意url_for里面的参数是endpoint(端点),而redirect接收的参数就是具体的地址。相比而言,重定向是使用url更方便,会使代码更灵活。