Flask的第一个程序——hello world

一个简单的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更方便,会使代码更灵活。

猜你喜欢

转载自blog.csdn.net/weixin_43617255/article/details/83793821