Flask系列-程序基本结构

一、前言

感觉自己不写点什么记录下来的话就会忘掉,虽然写点什么也可能会忘掉,但可能会更有动力看下去这样子

二、程序的基本结构

1.一个最开始的程序

  • # -*- coding:utf-8 -*-
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/') #使用app.route修饰器,把修饰函数注册为路由
    def index():    #index()这样的函数就叫视图函数
        return '<h1>Hello World!<h1>'
    
    #@app.route('/user/<int::id>') int;float;path:字符串不把/视作分隔符
    @app.route('/user/<name>')
    def user(name):
        return '<h1>Hello, %s!<h1>' %name
    
    if __name__ == '__main__':
        #debug=Ture启用调试模式
        app.run(debug=True) #run方法启动Flask集成的开发Web服务器

2.请求

  • 为避免大量非必要参数弄得搞乱视图函数,Flask使用上下文临时把某些对象变为全局可访问。

    使用前需先激活程序上下文或请求上下文,处理完成后再删除

    • 程序上下文:

      • current_app:当前激活程序的程序实例
      • g:处理请求时用作临时储存的对象;每次请求都会重设这个变量
    • 请求上下文:

      • request:请求对象,封装客户端发出的HTTP请求中的内容
      • session:用户会话,用于存储请求之间需要“记住”的值的词典

    虽然不太懂除了request其他的怎么用,但是书上说后面会讲到的......

  • Flask使用上下文让特定的变量在一个线程中全局可访问,同时却不会干扰其他进程。

  • 此时request被当作某线程中的全局变量:

    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask import request   #引入
    
    app = Flask(__name__)
    
    @app.route('/')
    def User_Agent():
        user_agent = request.headers.get('User-Agent')
        return '<p>You brower is %s</p>' %user_agent
    
    if __name__ == '__main__':
        app.run(debug=True)

3.请求钩子

都先注册一个函数:

  • before_first_request:在处理第一个请求之前运行
  • before_request:在每次请求之前运行
  • after_request:如果 无 未处理异常 抛出,在每次请求之后运行
  • teardown_request:即使 有 未处理异常 抛出,也在每次请求后运行

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

  • before_first_request从数据库中加载已登陆用户,并将其保存到 g .user 中
  • 随后调用视图函数时,视图函数再使用 g.user 获取用户

虽然有一点点懂,但是书上说后面会讲到的......

4.响应

  • 大多数情况下,响应是一个简单的字符串,并作为HTML页面回送客户端

  • 若视图函数返回的响应需使用不同状态码,可以把数字代码作为第二个返回值

    @app.errorhandler(404)
    def page_not_found(e):
        return render_template('404.html'), 404
  • 视图函数可返回 Response 对象:

    • make_sense() 可接受1~3个参数,并返回一个Response对象:

      from flask import make_response
      
      @app.route('/')
      def index():
          response = make_response('This document carries a cookie!')
          response.set_cookie('answer','42')
          return response
  • 重定向 302:redirect()

    from flask import redirect
    
    @app.route('/')
    def index():
        return redirect('http://www.xxxx.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 'Hello, %s' %user,name