美文网首页
DAY1-Flask

DAY1-Flask

作者: 捂不暖的石头 | 来源:发表于2017-05-24 23:54 被阅读0次

Windows环境

easy_install virtualenv
pip install flask

测试是否安装成功

import flask

初始化

所有Flask程序都必须创建一个程序实例。Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所有请求都转交给这个对象处理。

from flask import Flask
app = Flask(__name__)

Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python的 name变量就是所需的值。Flask用这个参数决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置。

路由和视图函数

处理URL和函数之间关系的程序称为路由
定义路由是使用程序实例提供的app.route修饰器,把修饰的函数注册为路由。
下面例子中把index()函数注册为程序根地址的处理程序。这个函数的返回值称为响应,是客户端接收到的内容。
index()这样的函数称为视图函数

静态

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

动态

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

尖括号中的内容就是动态部分,任何能匹配静态部分的URL都会映射到这个路由上。路由中的静态部门默认使用字符串,不过也可以使用类型定义。Flask支持在路由中使用int, float, path类型。path类型也是字符串,但不把斜线视作分隔符,而将其当作动态片段的一部分。

启动服务器

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

确保直接执行这个脚本时才启动开发Web服务器。

一个完整的程序

一个完整的Flask程序

# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello world!</h1>'
if __name__ == '__main__':
    app.run(debug=True)

浏览器输入

http://127.0.0.1:5000/ 

包含动态路由的程序

# -*- coding: utf-8 -*-
from 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)

浏览器输入

http://127.0.0.1:5000/user/Dave

请求-响应循环

程序和请求上下文

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

from flask import request
@app.route('/')
def index():
    user_agent=request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
Flask中有两种上下文:程序上下文和请求上下文。

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

Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用current_app和g变量。类似的,请求上下文被推送后,就可以使用requestsession变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致错误。

请求调度

Flask会在程序的URL映射中查找请求的URL。URL映射是URL和视图函数之间的对应关系。Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。

查看程序URL映射

from hello import app
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添加的特殊路由,用于访问静态文件。
URL映射中的HEAD, OPTIONS, GET是请求方法,由路由进行处理。

请求钩子

Flask提供了注册通用函数的功能,注册功能可在请求被分发到视图函数之前或之后调用。
请求钩子使用修饰器实现。

before_first_request    注册一个函数,在处理第一个请求之前运行。
before_request          注册一个函数,在每次请求之前运行。
after_request           注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
teardown_request        注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。

响应

如果视图函数返回的响应需要使用不同的状态码,可以把数字代码作为第二个返回值,添加到相应文本中。

请求无效

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

设置cookie

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

重定向

有一种名为重定向的特殊响应类型。这种响应没有页面文档,只告诉浏览器一个新地址用以加载页面。
重定向经常使用302状态码表示,指向的地址由Location首部提供。

from flask import redirect

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

abort函数——处理错误

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服务器。

相关文章

  • DAY1-Flask

    Windows环境 测试是否安装成功 初始化 所有Flask程序都必须创建一个程序实例。Web服务器使用一种名为W...

网友评论

      本文标题:DAY1-Flask

      本文链接:https://www.haomeiwen.com/subject/abkaxxtx.html