利用pycharm学习flask(三)
本文主要内容:
1.程序和请求上下文
2.请求调度
3.响应
1.程序和请求上下文
这里我理解的上下文就是对于一个程序或者请求的一些辅助对象或者说是一个容器用来存储一些和程序或者请求有关的东西。
这里引用别人的一个例子来更好的理解上下文:
谢霆锋这个厨师,他的功能(方法,函数)是煮菜啊,但是你以为他只是单单煮菜吗?,他煮菜不但要买一大堆的材料(函数的数据),还要请大堆人过来为他拍照啊,录像啊,所以这里的上下文就是材料和那些工作人员咯。一个谢霆锋不牛逼啊,但是谢霆锋在牛逼的上下文才会有十二道疯味。
以上是扯淡
请求上下文,指的就是针对这个请求,而需要的一些辅助的对象咯
程序上下文,类似
flask中有4个上下文,分别为:
变量名 | 上下文 | 说 明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象,每次请求都会重设这个变量 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值的词典 |
2.请求调度
程序收到客户端的请求后,要找到处理该请求的视图函数,前面已经说过,这里主要靠路由(URL)来完成这项工作,让我们来看一下如何查看hello.py中生成的映射。
在pycharm中最下面选择Terminal,输入下面的命令来激活虚拟环境:(其中flask换为你虚拟环境的名称)
workon flask
然后键入下面命令可以查看映射:
>>> python
>>> from hello import app
>>> app.url_map
Map([<Rule '/' (HEAD, GET, OPTIONS) -> index>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>,
<Rule '/user/<name>' (HEAD, GET, OPTIONS) -> user>])
其中/和/user/<name>是我们用app.route定义,/static/<filename> 路由是 Flask 添加的特殊路由,用于访问静态文件。后面我们会介绍静态文件。
URL 映射中的 HEAD、Options、GET 是请求方法,由路由进行处理。Flask 为每个路由都指 定了请求方法,这样不同的请求方法发送到相同的 URL 上时,会使用不同的视图函数进 行处理。HEAD 和 OPTIONS 方法由 Flask 自动处理。
响应
视图函数的返回值作为响应返回给客户端,一般返回值就是一个简单的字符串,作为html页面送回客户端。
根据http协议,返回的时候还有一个状态码,flask默认是200,代表请求已经被成功处理。
视图函数可以返回不同的状态码,例如:
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
其中400代表请求无效
视图函数还可以返回Response对象,例如:
from flask import make_response
@app.route('/')
def index():
response =make_response('<h1>This document carries a cookie!</h1>')
response.set_cookie('answer', '42')
return response
上例创建了一个响应对象,然后设置了cookie。
重定向响应是没有页面文档,只告诉浏览器一个新地址加载新页面,其状态码是302,例如:
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
还有一种特殊的响应由 abort 函数生成,用于处理错误。在下面这个例子中,如果 URL 中
动态参数 id 对应的用户不存在,就返回状态码 404:
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello, %s</h1>' % user.name
注意,abort 不会把控制权交还给调用它的函数,而是抛出异常把控制权交给Web服务器。