Flask提供的Web服务器不适合生产环境使用。
一、初始化(创建Flask程序实例)
所有的Flask程序都必须创建一个程序实例。程序实例是Flask类的对象,经常使用以下的代码创建:
from flask import Flask app = Flask(__name__)
将构造函数的__name__参数传递给Flask程序,Flask用__name__决定程序的根目录。
二、路由和视图
1、静态路由
访问网站时,客户端把请求发送给Web服务器,Web服务器在把请求发送给Flask程序实例。程序实例要对URL进行分析,然后分发给对应的Python函数处理。这种从URL到函数之间的对应关系成为路由。处理URL的函数被称为视图函数。
最简单的定义路由的方法就是使用app.route装饰器,把修饰的函数注册为路由。
@app.route('/') def index(): return '<h1>Hello World!</h1>'
2、动态路由
URL中含有变量,又需要在函数中使用变量。就需要使用动态路由。
@app.route('user/<name>') def user(name): return '<h1>Hello,%s</h1> % name'
<name>就是动态部分。<name>会传递给user的参数name,然后再函数中使用。
URL中动态部分默认使用字符串,但是也支持其他类型:int,float,path。path类型也是字符串,但是不把斜线视作分隔符。
@app.route def user_id('user/<int:id>'): return '<h1>'hello,%d' % id</h1>'
三、在python shell中检查URL映射
打开pyCharm的Terminal,检查是否是虚拟环境。
(venv)指示当前使用的是虚拟环境。如果不是,可以输入\venv\Scripts\activates(activates的相对路径),进入虚拟环境。
步骤:
1、输入python回车
打开python解释器
2、输入from test import app回车
test 是模块名,app是模块中定义的一个实例。
3、输入 app.url_map回车
查看app的url_map属性,即可获得。当前url映射。
Rule指示'/' '/static/<filename>' 'user/<name>'都是路由,是在程序中使用app.route或者app.add_url_route()定义的。
( OPTIONS,HEAD,GET)是请求方法。
index,static,user是响应函数。
因此,<Rule '/' (OPTIONS, HEAD, GET) -> index>应当这样解释:
如果客户端的请求方法是GET,请求的URL是'/',程序会使用index函数去响应。
注意:'/static/<filename>' 是Flask添加的特殊路由,后面会讲。
四、响应
Flask调用视图函数后,视图函数会返回一些值 ,这些值最终会返回给客户端,这些值就是响应。
@app.route('/') def index(): return '<h1>Bad Request</h1>'
这是之前的视图函数,返回的是一个str。但是完全可以返回一个元祖(tuple),元祖有三个值组成,分别表示返回的字符串(str)、状态码(int)、首部header(dict)。
@app.route('/') def index(): return '<h1>Bad Request</h1>',400这个视图函数返回了两个值
'<h1>Bad Request</h1>',400
第一个值str是返回的内容主题,第二个400是状态码。400表示请求无效。
除了返回一个元祖之外,还可以返回一个 Response对象。Response对象可以通过 make_response()函数由三个值的元祖构造而成,因此本质上是一样的。from flask import make_response @app.route def index(): response = make_response('<h1>This is document carries a cookie return response
五、一些特殊响应
1、重定向响应
重定向响应是一种名为重定向的特殊响应类型,这种响应没有页面文档,只告诉浏览器一个新地址用以加载新页面。
设置方法:
a)可以使用3个值的返回值生成。
状态码302,指向的地址由location首部提供。
b)在Response对象中设定。
具体方法未知。
c)使用redirect()函数
from flask import redirect @app.route('/') def index(): return redirect('http://www.baidu.com') #重定向到百度首页
2、处理错误的响应
由abort函数生成。
@app.route('/user/<name>') def user(name): if name !='chen': #如果name != 'chen' abort(404) #由abort函数生成404错误响应 return '<h1> Hello,%s </h1>'% name
注意:abort(404)之后,控制权不在user()函数,即不会执行return '<h1>Hello,%s </h1>' % name。控制权交还给Web服务器。