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使用指南及介绍的主要内容,如果未能解决你的问题,请参考以下文章
python之路_flask框架_单例模式及session原理