Flask学习笔记(一) Hello Flask

基于该书学习: Web开发:基于Python的Web应用开发实战(第二版)

示例代码地址: https://github.com/miguelgrinberg/flasky.git

PS:
放弃分支修改: git reset --hard
查看分支tag : git tag

1.helloword

from flask import Flask

app = Flask(__name__)

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

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



部分说明:

处理 URL 和函数之间关系的程序称为路由

装饰器的解释可见:https://www.cnblogs.com/yuzhanhong/p/9180212.html

在 Flask 应用中定义路由的最简便方式,是使用应用实例提供的 app.route 装饰器,如上面代码所示

Flask 还支持一种更传统的方式:使用 app.add_url_ rule() 方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。下述示例 使用 app.add_url_rule() 方法注册 index() 函数,其作用与前例相同,例:

def index():
   return '<h1>Hello World!</h1>'

app.add_url_rule('/', 'index', index)

 

index() 这样处理入站请求的函数称为视图函数

若URL包含可变部分,则用尖括号括起来去定义:

@app.route('/user/<name>')
def user(name):
 return '<h1>Hello, {}!</h1>'.format(name)

路由中的动态部分默认使用字符串,不过也可以是其他类型。例如,路由 /user/<int:id>只会匹配动态片段 id 为整数的 URL,例如 /user/123。Flask 支持在路由中使用 string、 int、float 和 path 类型。path 类型是一种特殊的字符串,与 string 类型不同的是,它可以包含正斜线

关于启动服务:

linux下:

export FLASK_APP=hello.py
flask run

windows下:

 set FLASK_APP=hello.py
 flask run

然而对于我这种懒人,喜欢这么启动:

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

上述完整代码:

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 应用可以在Debug模式中运行。在这个模式下,开发服务器默认会加载两个便利的工具:

重载器和调试器

重载器: 每次改动代码并保存,服务器自动重启

调试器: 交互式审查和修改代码

可以开Debug模式,linux下:

(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run

windows下export换set

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

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

可以交互式的调代码,需要输入PIN码

关于app.run的参数, host和port需要特别注意一下:

用0.0.0.0后,网络中的任何计算机都能通过 http://a.b.c.d:5000 访问 Web 服务器。其中,a.b.c.d 是 运行服务器的计算机的 IP 地址

2.应用和请求上下文

Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求。 要想让视图函数能够访问请求对象,一种直截了当的方式是将其作为参数传入视图函数, 不过这会导致应用中的每个视图函数都多出一个参数。除了访问请求对象,如果视图函数 在处理请求时还要访问其他对象,情况会变得更糟。 为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象变为全局可访问。有了上下文,便可以像下面这样编写视图函数:

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

注意,在这个视图函数中我们把 request 当作全局变量使用。事实上,request 不可能是全 局变量。试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,每个线程看到的 request 对象必然不同。Flask 使用上下文让特定的变量在一个线程中全局可 访问,与此同时却不会干扰其他线程.

在 Flask 中有两种上下文:应用上下文请求上下文。表 2-1 列出了这两种上下文提供的变量

URL映射是 URL 和视图函数之间的对应关系。 Flask 使用 app.route 装饰器或者作用相同的 app.add_url_rule() 方法构建映射

可用app.url_map查看映射:

/static/ 路由是 Flask 添加的特殊路由,用于访问静态文件,后面会介绍。

URL 映射中的 (HEAD, OPTIONS, GET) 是请求方法,由路由进行处理。HTTP 规范中规定, 每个请求都有对应的处理方法,这通常表示客户端想让服务器执行什么样的操作。Flask 为每个路由都指定了请求方法,这样即使不同的请求方法发送到相同的 URL 上时,也会 使用不同的视图函数处理。HEAD 和 OPTIONS 方法由 Flask 自动处理,因此可以这么说,在这个应用中,URL 映射中的 3 个路由都使用 GET 方法(表示客户端想请求信息,例如一个网页)。后面将介绍如何为路由指定不同的请求方法

Flask 通过上下文变量 request 对外开放请求对象。这个对象非常有用,包含客 户端发送的 HTTP 请求的全部信息。Flask 请求对象中最常用的属性和方法见表 2-2

关于请求钩子:

关于响应:

响应有个特殊的类型,称为重定向。这种响应没有页面文档,只会告诉浏览器一个新 URL,用以加载新页面。重定向经常在 Web 表单中使用,第 4 章会介绍。 重定向的状态码通常是 302,在 Location 首部中提供目标 URL。重定向响应可以使用 3 个值形式的返回值生成,也可在响应对象中设定。不过,由于使用频繁,Flask 提供了redirect() 辅助函数,用于生成这种响应:

from flask import redirect

@app.route('/test_redirect')
def my_redirect():
   return redirect('http://www.baidu.com')

还有一种特殊的响应由 abort() 函数生成,用于处理错误。在下面这个例子中,如果 URL 中动态参数 id 对应的用户不存在,就返回状态码 404 :

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)

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

发布了161 篇原创文章 · 获赞 71 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/yxpandjay/article/details/99942324