python flask使用指南及介绍

Posted 走自己的路-让别人也有路走

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python flask使用指南及介绍相关的知识,希望对你有一定的参考价值。

程序基本结构

#程序的初始化
from flask import Flask

app = Flask(__name__)


# 添加路由:注册视图函数
# 请求:web浏览器->web服务器
# web服务器-> flask程序实例调用对应的视图函数
@app.route('/')  #修饰器
def index():
    return '<h1> Hello World!</h1>'

#动态路径路由添加,动态部分会作为参数传递给视图函数,动态部分用<>括号包围
#任何匹配静态部分的URL都会映射到这个路由上
@app.route('/user/<name>')
def user(name):
    return '<h1> Hello, %s!' % name 

#动态部分也可以使用类型定义例如<int:id>只会匹配id为整数的URL。int/float/path等类型
@app.route('/userid/<int:id>')
def userid(id):
    return '<h1> Hello, number %s!' % id


@app.route('/test/<path:p>')
def path(p):
    return '<h1>current patch %s' % p
    

if __name__=='__main__':
    #启动服务,debug=true,如果更新文件,会重新加载程序。
    app.run()  

程序和请求上下文

1、current_app(程序上下文,当前程序实例)、g(程序上下文、用来存储临时对象)
2、request(请求上下文,存储报文中提取的数据)、session(用户会话、用户存储会话的数据)

作用

1、减少视图的参数输入,例如HTTP的请求对象.请求对象的导入方式。

原理分析

1、Flask程序初始化的时候,创建本地栈global.py, app_ctx_stack = LocalStack()
调用local类创建栈,包括__storage
_:, ident_func:get_ident两个属性
2、调用app.app_context()创建上下文
3、app_ctx.push调用_app_ctx_stack.push函数,把当前程序应用压制,用list模拟的一个栈

from flask import Flask
from flask import request
from flask import current_app

app = Flask(__name__)
@app.route('/')
def index():
    user_agent = request.headers.get('user-Agent')
    print(current_app.name)
    return '<h1> http request uset agent: %s </h1>' % user_agent

if __name__ == '__main__':
    #在请求上下文中会自动压入app程序上下文
    #app_ctx = app.app_context()
    #app_ctx.push()
    #print(current_app.name)
    #app_ctx.pop()
    print(app.name)
    app.run()

请求调度(路由和视图函数映射)

1、可以通过@app.route 和app.add_url_rule两种方式注册路由。
2、Flask会在URL 映射中查找请求的URL。
3、查找到了执行对应的试图函数。
4、映射关系保存在app.url_map中。

def add_url_rule(
        self, 
        rule,      # 字符串类型的url规则,路径
        endpoint=None, #注册当前URL端点名称,默认为试图的名称。同一个endpoint不能注册两次,会报错误
        view_func=None,
        provide_automatic_options=None,
        **options
    )

def route(self, rule, **options):
        """A decorator that is used to register a view function for a
        given URL rule.  This does the same thing as :meth:`add_url_rule`
        but is intended for decorator usage::

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

        For more information refer to :ref:`url-route-registrations`.

        :param rule: the URL rule as string
        :param endpoint: the endpoint for the registered URL rule.  Flask
                         itself assumes the name of the view function as
                         endpoint
        :param options: the options to be forwarded to the underlying
                        :class:`~werkzeug.routing.Rule` object.  A change
                        to Werkzeug is handling of method options.  methods
                        is a list of methods this rule should be limited
                        to (``GET``, ``POST`` etc.).  By default a rule
                        just listens for ``GET`` (and implicitly ``HEAD``).
                        Starting with Flask 0.6, ``OPTIONS`` is implicitly
                        added and handled by the standard request handling.
        """

        def decorator(f):
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f

        return decorator

from flask import Flask
from flask import request


app = Flask(__name__)

def index():
    user_agent = request.headers.get('user-Agent')
    print(current_app.name)
    return '<h1> http request uset agent: %s </h1>' % user_agent

app.add_url_rule('/', endpoint="endpoint1", view_func=index)


#相同的endpoint注册两次会报错
# def index2():
#     user_agent = request.headers.get('user-Agent')
#     print(current_app.name)
#     return '<h1> http request uset agent: %s </h1>' % user_agent
# app.add_url_rule('/', endpoint="endpoint1", view_func=index2)

if __name__ == '__main__':
    print(app.url_map)
Map([<Rule '/' (OPTIONS, HEAD, GET) -> endpoint1>,
 <Rule '/static/<filename>' (OPTIONS, HEAD, GET) -> static>])

请求钩子

1、before_first_request:注册第一个函数,在一个请求之前处理。
2、before_request:在每次请求之前处理
3、after_request:注册一个函数,如果没有未处理的异常,在每次请求之后处理
4、teardown_request:注册一个函数,即使有未处理异常,每次请求之后也处理。 RequestContext.pop

from flask import Flask
from flask import request


app = Flask(__name__)

def index():
    print('receive request')
    user_agent = request.headers.get('user-Agent')
    return '<h1> http request uset agent: %s </h1>' % user_agent

def first():
    print('before first request')
    
app.add_url_rule('/', endpoint="endpoint1", view_func=index)
app.before_first_request(first)

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

响应

1、试图函数返回内容就是响应。
2、返回的内容包括 响应文本,响应码,响应的http头部

from flask import Flask
from flask import request


app = Flask(__name__)

def index():
    user_agent = request.headers.get('user-Agent')
    return '<h1> http request uset agent: %s </h1>' % user_agent, 300
    
app.add_url_rule('/', endpoint="endpoint1", view_func=index)

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

以上是关于python flask使用指南及介绍的主要内容,如果未能解决你的问题,请参考以下文章

flask-系统介绍及环境搭建1

Python Flask 构建微电影视频网站

Flask介绍及简单使用

python之路_flask框架_单例模式及session原理

学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码

python的Flask 介绍