zoukankan      html  css  js  c++  java
  • Flask 3 程序的基本结构2

    NOTE

    1.hello.py 通过修饰器的route方法添加动态路由:

    #!/usr/bin/env python
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return '<h1>HelloWorld!</h1>'
    
    @app.route('/user/<name>')
    def user(name):
        return '<h1>Hello %s!</h1>' % name
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    127.0.0.1 - - [16/Feb/2017 14:18:07] "GET /user/wasdns HTTP/1.1" 200 -
    

    2.程序和请求上下文:

    请求上下文的作用:临时将某一进程的视图函数需要访问的请求对象变为全局可访问,同时不会干扰其他的进程。

    eg.导入request请求上下文,使视图函数能够访问请求的游览器对象。

    #!/usr/bin/env python
    
    from flask import Flask
    from flask import request
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        user_agent = request.headers.get('User-Agent')
        return '<p>Your browser is %s</p>' % user_agent
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    127.0.0.1 - - [16/Feb/2017 14:31:22] "GET / HTTP/1.1" 200 -
    

    3.Flask上下文全局变量:

    current_app 程序上下文 => 当前激活程序的程序实例
    g 程序上下文 => 处理请求时临时存储的对象,每次请求都会重设这个变量
    request 请求上下文 => 请求对象,封装client发出的http request的内容
    session 请求上下文 => 用户会话,存储请求之间需要存储的值的字典
    

    注意,需要在激活程序和请求上下文之后才能访问上下文。

    >>> from hello import app
    >>> from flask import current_app
    >>> current_app.name
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/wasdns/Desktop/flasky/venv/lib/python2.7/site-packages/werkzeug/local.py", line 343, in __getattr__
        return getattr(self._get_current_object(), name)
      File "/Users/wasdns/Desktop/flasky/venv/lib/python2.7/site-packages/werkzeug/local.py", line 302, in _get_current_object
        return self.__local()
      File "/Users/wasdns/Desktop/flasky/venv/lib/python2.7/site-packages/flask/globals.py", line 51, in _find_app
        raise RuntimeError(_app_ctx_err_msg)
    RuntimeError: Working outside of application context.
    
    This typically means that you attempted to use functionality that needed
    to interface with the current application object in a way.  To solve
    this set up an application context with app.app_context().  See the
    documentation for more information.
    
    >>> app_ctx = app.app_context() # 激活
    >>> app_ctx.push()
    >>> current_app.name
    'hello'
    >>> app_ctx.pop()
    

    4.请求调度:URL映射(map)

    Flask使用app.route修饰器和app.add_url_rule()生成映射。

    eg.查看Flask程序中的URL映射:

    >>> from hello1 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>])
    

    其中/static/<filename>是Flask添加的特殊路由,用于访问静态文件。

    另外,HEAD, OPTIONS, GET是 请求方法,由路由进行处理,Flask为每一个路由都指定了请求方法,这样当不同的请求发送到Flask时,依据其请求方法对应到不同的视图函数。

    5.请求钩子:避免在不同的视图函数中使用大量重复的代码(有点像代码重用)。可以在视图函数启动之前或者之后使用。

    请求钩子使用修饰器实现。Flask支持以下四种钩子:

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

    6.响应:response

    视图函数的返回值一般作为响应的内容。

    HTTP协议除了需要响应的字符串还需要 状态码。常见的状态码有 200 (请求有效)、404(not found)等。

    eg.abort函数生成exception响应,交给web服务器处理。如果对应的动态参数id对应的用户不存在,返回404码。

    #!/usr/bin/env python
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/user/<id>')
    def index(name):
        user = load_user(id)
        if not user:
            abort(404)
        return '<h1>Hello, %s</h1>' % user.name
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    2017/2/16

  • 相关阅读:
    win10下查看进程,杀死进程
    Pycharm,debug调试时怎样带参数
    struts2,登录功能模块实现
    struts2处理.do后缀的请求
    struts2 修改action的后缀
    j2ee中如何拦截jsp页面?
    4个好用的JS联动选择插件
    css position:absolute 如何居中对齐
    使用jquery插件报错:TypeError:$.browser is undefined的解决方法
    phpcms v9后台多表查询分页代码
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6405797.html
Copyright © 2011-2022 走看看