本系列笔记是我阅读Miguel Grinberg的《Flask Web Development》的笔记,标题与书本同步。但愿经过记录技术笔记的方式促进本身对知识的理解。python
本篇对应书本第二章:程序的基本结构。web
from flask import Flask #导入Flask模块 app = Flask(__name__) #建立Flask类的实例
注:对于Flask开发者来讲,传给Flask应用程序构造函数的name参数是比较容易弄混淆的。Flask使用这个参数来肯定应用程序的根目录,这样之后能够相对这个路径来找到资源文件。flask
在Flask应用中,路由是指用户请求的URL与视图函数之间的映射。
Flask框架 根据HTTP请求的URL在路由表中匹配预约义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器。服务器
route装饰器 :可使用Flask应用实例的route装饰器将一个URL规则绑定到一个视图函数上。
下面程序中route装饰器将根目录绑定在index视图上。cookie
@app.route('/') def index(): return '<h1>Hello World!</h1>'
@app.route('/user/<name>') def user(name): return '<h1>Hello, %s</h1>' % name 相似: int 接受整数(float接受浮点数) @app.route('/post/<int:post_id>') path转换器容许规则匹配包含/的字符串。 @app.route('/file/<path:fname>')
if __name__ == '__main__': app.run(debug=True) # 模块是对象,而且全部的模块都有一个内置属性 __name__。 # 一个模块的 __name__ 的值取决于您如何应用模块。 # 若是 import 一个模块,那么模块__name__ 的值一般为模块文件名,不带路径或者文件扩展名。 # 可是您也能够像一个标准的程序样直接运行模块, # 在这种状况下, __name__ 的值将是一个特别缺省"__main__"。 # debug=True 调试模式开启
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>Hello World!</h1>' if __name__ == '__main__' app.run(debug=True)
运行结果以下:网络
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,%s</h1>' % name if __name__ == '__main__' app.run(debug=True) # 定义了动态路由/user/<name>
运行结果以下:session
请求对象封装了客户端发送的HTTP请求。
将请求对象做为参数传入视图函数,视图函数便可访问请求对象。app
from flask import request @app.route('/') def index(): user_agent = request.headers.get('User-Agent') return '<p>Your browser is %s</p>' % user_agent
Flask上下文全局变量框架
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用做临时存储的对象。每次请求都会重设这个变量。 |
request | 请求上下文 | 请求对象,封装了客户端发出的HTTP请求中的内容。 |
session | 请求上下文 | 用户会话,用户存储请求之间须要“记住”的值的词典 |
程序上下文使用方法:ide
>>> from hello import app >>> from flask import current_app >>> current_app.name Traceback(most recent call last): ... RuntimeError:working outside of application context >>> app_ctx = app.app_context() >>> app_ctx.push() >>> current_app.name 'hello' >>> app_ctx.pop() # app.app_context()可得到一个程序上下文
URL映射中的HEAD、Options、GET是请求方法,由路由进行处理。
不一样的请求方法发送到相同的URL上时,会使用不一样的视图函数进行处理。
Flask支持如下4种钩子:
before_first_request:注册一个函数,在处理第一个请求以前运行。
before_request:注册一个函数,在每次请求以前运行。
after_request:注册一个函数,若是没有未处理的异常抛出,也在每次请求以后运行。
teardown_request:注册一个函数,即便有未处理的异常抛出,也在每次请求以后运行。
from flask import make_response
@app.route('/'): def index(): response = make_response(<h1>This document carries a cookie.</h1>) response.set_cookie('answer','42') return response
from flask import redirect @app.route('/') def index(): return redirect('http://www.example.com')
from flask import abort @app.route('/user/<id>') def get_user(id): user = load_user(id) if not user: abort(404) return '<h1>Hello, %s</h1>' % user.name
Flask被设计为可扩展模式,一些重要功能是用安装包的形式增长。
(venv)$pip install flask-script hello.py:使用Flask-Script from flask_script import Manager manager = Manager(app) # ... if __name__ == '__main__': manager.run()
运行Python程序: python hello.py runserver
web服务器可以使用http://a.b.c.d:5000/ 网络中的任一台电脑进行访问,其中'a.b.c.d'是服务器所在计算机的外网的IP地址。
Python hello.py runserver --host 0.0.0.0
本文由 EverFighting 创做,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。