【Flask】Flask学习笔记(一) 应用基本结构

 

初始化

 

使用前必须创建一个应用实例

from flask import Flask
app = Flask(__name__)

  

路由和视图函数

请求流程

客户端(web浏览器)-->  web服务器 --> Flask应用实例

 

路由概念

应用实例需要知道对每个 URL 的请求要运行哪些代码, 所以保存了一个 URL 到 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由。

 

定义路由

使用app.route 装饰器

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'


视图函数

上面类似于index这种处理入站请求的函数称为视图函数。

 

响应

视图函数返回值称为响应。响应可以为简单字符串,也可以是复杂表单。

 

实例:一个完整的应用

hello.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>

  


windows运行

E:\study\flask>set FLASK_APP=hello.py
E:\study\flask>flask run
 * Serving Flask app "hello.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [27/Mar/2019 15:53:11] "GET / HTTP/1.1" 200 -

  


浏览器显示

 

 

通过编程方式启动

主程序尾部增加如下代码

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

  

动态路由 

URL中包含可变部分 

 

dynamic_route.py

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, {}!</h1>'.format(name)

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

  


浏览器显示

 

 

 

调试模式

调试模式中会自动加载两个工具: 重载器 和调试器 。

 

启用调试模式

执行flask run之前设定FLASK_DEBUG=1

E:\study\flask>set FLASK_APP=hello.py
E:\study\flask>set FLASK_DEBUG=1
E:\study\flask>flask run
 * Serving Flask app "hello.py" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 627-210-384
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

  

编程代码中设置

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

  

 

应用&请求上下文

 

上下文作用:临时把某些对象变为全局可访问。

from flask import request

@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is {}</p>'.format(user_agent)

  

index视图函数中把 request 当作全局变量使用

 

Flask上下文全局变量

  

上下文处理流程

激活应用&请求上下文 --> ask 分派请求 --> 请求处理完成再将其删除

 

激活上下文

>>> from hello import app
>>> from flask import current_app
>>> app_ctx=app.app_context()
>>> app_ctx.push()
>>> current_app.name
'hello'
>>> app_ctx.pop()

  

PS:

  • app.app_context() 获取上下文 
  • push():激活上下文
  • pop():关闭上下文

 

请求钩子

即通用函数的功能,处理请求之前或之后的执行代码。注册的函数可在请求被分派到视图函数之前或之后调用。请求钩子通过装饰器实现。

请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g 

 

响应

 

对视图函数返回的响应添加不同的状态码。

方法:把数字代码作为第二个返回值, 添加到响应文本之后。

@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400

  

make_response():返回等效的响应对象 

 

重定向

使用redirect() 函数

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, {}</h1>'.format(user.name)

  

 PS:abort() 不会把控制权交还给调用它的函数,而是抛出异常。

 

posted @ 2019-03-29 18:17  LiliP  阅读(726)  评论(0编辑  收藏  举报