(二)基本框架

我的未来我决定 提交于 2020-03-12 04:48:17

1.初始化

from flask import Flask
app = Flask(__name__)

flask类的构造函数只有一个必须指定的参数,即主模块或包的名字。

2.路由

http://python.jobbole.com/80956/

处理URL和函数之间关系的程序称为路由

定义路由的最简便方式,是使用app.route修饰器

@app.route('/')
def index():
    return '<h1>hello world</h1>'

URL和函数之间的关系在此表现为:比如不熟的域名为www.example.com,在浏览器中访问http://www.example.com后,会触发对应的index()函数。此函数的返回值称为相应,即客户端会接收到的内容。如果客户端是Web浏览器,相应就是现实给用户查看的文档。

index()这样的函数称为视图函数。

Flask支持动态URL,只需在route秀时期中使用特殊的句法。

@app.route('/user/<name>')
def user(name):
    return '<h1>hello,  %s!</h1>' % name

3.启动服务器

用run方法启动flask Web服务器:

if __name__ == '__main__':
    app.run(debug=True)

debug设为True进入调试模式

 4.一个完整的程序

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

if __name__ == '__main__':
    app.run(debug=True)

包含动态路由

rom flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s!</h1>' % name

if __name__ == '__main__':
    app.run(debug=True)

此时,在服务器中访问即可以看到一个使用了name动态参数生成的欢迎消息。

5.请求-响应循环

5.1程序和请求上下文

flask从客户端收到请求时,要让视图函数能访问一些对象。比如“请求对象”,它封装了客户端发送的HTTP请求。

Context 上下文全局变量:

  • current_app 程序上下文 当前激活程序的程序实例
  • g 程序上下文 处理请求时用作临时存储的对象。每次请求都会重设这个变量
  • request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
  • session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典

Flask使用了上下文临时把某些对象变为全局可访问。

flask在分发请求之前激活(推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被激活(推送)后,就可以在线程中更实用current_app和g变量,请求上下文被推送后就可以使用request和session变量。如果使用这些变量时,没有激活程序上下文或请求上下文,就会单只错误。

5.2请求调度

程序收到客户端发来的请求后,要找到对应的处理该请求的视图函数。flask会在程序的URL映射中查找请求的URL。URL映射是URL和试图函数之间的对应关系。flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。

查看flask程序中的URL映射:

app.url_map  
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,  
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,  
<Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])  
#/和/user/<name>路由在程序中使用app.route修饰器定义
#/static/<filename>路由是flask添加的特殊路由,用于访问静态文件

5.3请求钩子

关于钩子的解释:http://blog.csdn.net/qq_28877125/article/details/77683720

请求 Hook: 在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g
是一个装饰器
  1. before_first_request •  :注册一个函数,在处理第一个请求之前运行。
  2. before_request •  :注册一个函数,在每次视图函数执行之前运行。
  3. after_request •  :注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
  4. teardown_request •  :注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

5.4响应

flask调用视图函数后,会将返回值作为响应的内容。大多情况下,响应就是个简单的字符串,作为HTML页面回送客户端。HTTP的状态码为200时,表明请求成功。

下述例子的视图函数会返回一个400的状态码,表示请求无效。

@app.route('/')
def index():
    return '<h1>Bad Request</h1>', 400

视图函数返回的响应还可接受第三个参数,这是一个由收不(header)组成的字典。

如果不想返回由1个、2个或3个值组成的元组,flask试图函数还可以返回Response对象。make_response对象可以接受1个、2个或3个参数(和视图函数的返回值一样,即 (html, 状态码,header)),并返回一个Response对象。

下例创建了一个相应对象,然后设置了cookie:

from flask import make_response

@app.route('/')
def index():
    response = make_response('<h1>This document carries a cookie!</h1>', 200)  
    response.set_cookie('answer', '42')  
    return response  

有一种名为重定向的特殊响应类型。重定向响应没有页面文档,只告诉浏览器一个新地址用以加载新页面。重定向经常在Web表单中使用。

重定向经常使用302状态码表示,指向的地址油Location首部提供。flask提供了redirect()辅助函数,用于生成这种响应:

from flask import redirect
   
@app.route('/')
def index():
    return redirect('http://www.example.com')

重定向通常和url_for()一起用

@app.route('/')
def index():
    return 'Hello World!'

@app.route('/login/')
#这样即使改成@app.route('/fsdaf/')也不会影响
def login():
    return '登录页面'

@app.route('/question/<is_login>')
def question(is_login):
    if is_login == '1':#如果已登录,进入问答页面
        return '这是问答页面'
    else:#如果未登录,重定向到登录页面
        return redirect(url_for('login'))

 

 

 

还有一种特殊的响应由abort函数生成,用于处理错误。在下例中,如果URL中动态参数id对应的用户不存在就返回状态码404:

from flask import abort

@app.route('/user/<id>')
def getuser(id):
    user = load_user(id)
    if not user:
        abort(404)
    return /<h1Hello, %s</h1>' % user.name

6.flask拓展

flask是可拓展的。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!