美文网首页
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

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