:程序的基本结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:程序的基本结构相关的知识,希望对你有一定的参考价值。

flask中的helloworld:

 1 from flask import Flask
 2 
 3 app = Flask(__name__)
 4 
 5 @app.route(/)
 6 def index_1():
 7     return hello world
 8 
 9 @app.route(/<name>)
10 def index_2(name):
11     return hello {}.format(name)
12 
13 if __name__ == __main__:
14     app.run(debug=True, port=8888)

flask中的上下文全局变量:

  • current_app:程序上下文: 当前激活程序的程序实例
  • g:程序上下文: 处理请求时用作临时存储的对象,每次请求都会重设这个变量
  • request:请求上下文: 请求对象, 封装了客户端发出的http请求中的内容
  • session:请求上下文: 用户回话, 用于存储请求之间需要“记住”的值的词典

请求调度:flask使用app.route修饰器或者app.add_url_rule()生成映射

请求钩子:在处理请求之前或之后执行某些代码很有用。比如,在请求开始前,需要创建数据库或者认证用户,为了避免使用重复代码,flask提供了注册通用函数的功能。

flask支持以下4中钩子:

  • before_first_request:注册一个函数, 在处理第一个请求之前运行
  • before_request:注册一个函数, 在每次请求之前运行
  • after_request:注册一个函数, 如果没有未处理的异常抛出, 在每次请求之后运行
  • teardow_request:注册一个函数, 即使有未处理的异常抛出, 也会在每次请求之后运行
  • 在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g
 1 from flask import Flask
 2 
 3 from flask import g
 4 
 5 app = Flask(__name__)
 6 
 7 
 8 # 在debug模式中, request context 不会被pop, 所以teardown_request钩子函数不会执行, 可设置以下参数在debug模式中执行钩子函数
 9 # app.config[‘PRESERVE_CONTEXT_ON_EXCEPTION‘] = False
10 
11 
12 @app.before_first_request
13 def before_first_request_hook():
14     print(before first request)
15 
16 
17 @app.before_request
18 def before_request_hook():
19     g.name = manman
20     print(before request)
21 
22 
23 @app.after_request
24 def after_request_hook(exception):
25     print(after request)
26     return exception
27 
28 
29 @app.teardown_request
30 def teardown_request_hook(exception):
31     print(teardown request)
32     return exception
33 
34 
35 @app.route(/after)
36 def after_request_hook_test():
37     raise Exception
38     return hello
39 
40 
41 @app.route(/before)
42 def before():
43     return hello world + g.name
44 
45 
46 if __name__ == __main__:
47     app.run(debug=True, port=8888)

 

响应:flask默认返回的状态码为200, 如果需要返回其他状态码:

1 @app.route(/)
2 def index():
3     return Bad Request,  400

flask还可以返回Response对象,make_response()函数可接受1个、2个和3个参数,并返回Response对象, 这个对象也可以设置cookie等操作。

有一种特殊的相应类型, 重定向, 状态码为301或302(http状态码相关介绍见:https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81#3xx.E9.87.8D.E5.AE.9A.E5.90.91)。 这种响应没有页面文档。 由于使用比较频繁,flask提供了redirect()辅助函数。

还有一种特殊的相应由abort函数生成,用于错误处理。

 1 from flask import Flask
 2 
 3 from flask import make_response
 4 
 5 from flask import redirect
 6 
 7 from flask import abort
 8 
 9 app = Flask(__name__)
10 
11 
12 @app.route(/400)
13 def http_400():
14     return <h1>Bad Request</h1>, 400
15 
16 
17 @app.route(/302)
18 def http_302():
19     response = make_response(www.google.com, 302)
20     response.location = http://www.google.com
21     return response
22 
23 
24 @app.route(/redirect)
25 def http_redirect_302():
26     return redirect(http://www.google.com)
27 
28 
29 @app.route(/abort)
30 def http_abort():
31     abort(500)  # abort不会把控制权交还给调用它的函数, 而是抛出异常把控制权交给web服务
32 
33 
34 if __name__ == __main__:
35     app.run(debug=True, port=8888)

 

以上是关于:程序的基本结构的主要内容,如果未能解决你的问题,请参考以下文章

HashMap深度解析

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构

如何从片段外部清除/重置地图?

hashmap冲突的解决方法以及原理分析: