资讯专栏INFORMATION COLUMN

[贰]Flask web开发:程序的基本结构

maxmin / 395人阅读

摘要:本篇对应书本第二章程序的基本结构。初始化导入模块创建类的实例注对于开发者来说,传给应用程序构造函数的参数是比较容易弄混淆的。不同的请求方法发送到相同的上时,会使用不同的视图函数进行处理。

本系列笔记是我阅读Miguel Grinberg的《Flask Web Development》的笔记,标题与书本同步。希望通过记录技术笔记的方式促进自己对知识的理解。

本篇对应书本第二章:程序的基本结构。

初始化
from flask import Flask #导入Flask模块
app = Flask(__name__) #创建Flask类的实例

注:对于Flask开发者来说,传给Flask应用程序构造函数的name参数是比较容易弄混淆的。Flask使用这个参数来确定应用程序的根目录,这样以后可以相对这个路径来找到资源文件。

路由和视图函数 注册新的路由

在Flask应用中,路由是指用户请求的URL与视图函数之间的映射。
Flask框架 根据HTTP请求的URL在路由表中匹配预定义的URL规则,找到对应的视图函数, 并将视图函数的执行结果返回WSGI服务器。

匹配动态URL

route装饰器 :可以使用Flask应用实例的route装饰器将一个URL规则绑定到一个视图函数上。
下面程序中route装饰器将根目录绑定在index视图上。

@app.route("/")
def index():
    return "

Hello World!

"
URL变量类型过滤
@app.route("/user/")
def user(name):
    return "

Hello, %s

" % name 类似: int 接受整数(float接受浮点数) @app.route("/post/") path转换器允许规则匹配包含/的字符串。 @app.route("/file/")
启动服务器
if __name__ == "__main__":
    app.run(debug=True)
    
# 模块是对象,并且所有的模块都有一个内置属性 __name__。
# 一个模块的 __name__ 的值取决于您如何应用模块。
# 如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。
# 但是您也可以像一个标准的程序样直接运行模块,
# 在这种情况下, __name__ 的值将是一个特别缺省"__main__"。

# debug=True 调试模式开启
一个完整的程序 hello.py: 一个完整的Flask程序
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "

Hello World!

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

运行结果如下:

hello.py: 包含动态路由的Flask程序
from flask import Flask
app = Flask(__name__)

@app.route("/")
def index():
    return "

Hello World!

" @app.route("/user/") def user(name): return "

Hello,%s

" % name if __name__ == "__main__" app.run(debug=True) # 定义了动态路由/user/

运行结果如下:

请求-响应循环 程序和请求上下文

请求对象封装了客户端发送的HTTP请求。
将请求对象作为参数传入视图函数,视图函数即可访问请求对象。

from flask import request

@app.route("/")
def index():
    user_agent = request.headers.get("User-Agent")
    return "

Your browser is %s

" % user_agent

Flask上下文全局变量

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

程序上下文使用方法:

>>> 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:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。

响应 创建响应对象并设置Cookie

from flask import make_response

@app.route("/"):
def index():
    response = make_response(

This document carries a cookie.

) 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/")
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return "

Hello, %s

" % user.name
Flask扩展

Flask被设计为可扩展模式,一些重要功能是用安装包的形式增加。

使用Flask-Script支持命令行选项
(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 中国大陆许可协议 进行许可。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38079.html

相关文章

  • Flask Web Development —— 基本应用程序结构(上)

    摘要:注对于开发者来说,传给应用程序构造函数的参数是比较容易弄混淆的。在应程序中定义路由的最便捷的方式是通过显示定义在应用程序实例之上的装饰器,注册被装饰的函数来作为一个路由。一个常见的模式是使用装饰器来注册函数作为一个事件处理程序。 在这一章,你将学习Flask应用程序不同部分。同时你将编写和运行你的第一个Flask web应用程序。 1、初始化 在这章,你将学到Flask应用程序的不...

    NusterCache 评论0 收藏0
  • Flask Web Development —— 基本应用程序结构(下)

    摘要:有两类应用级和请求级。一个响应中非常重要的部分是状态码,默认设置来指示请求已经成功处理。重定向通常由响应状态码注明并且重定向的由头部的给出。因为这些变化,应用程序获得一组基本的命令行选项。运行显示可用信息在应用程序上下文的内部运行一个。 5、请求-响应循环 现在你已经玩过一个基本的Flask应用程序,你也许想要知道更多关于Flask如何施展魔力。下面章节描述了一些框架设计方面的特点。...

    caohaoyu 评论0 收藏0
  • Flask框架基础(二)

    摘要:处理和函数之间关系的程序称为路由。模板引擎是由实现的是内置的模板语言参照设计思想设计的,跟差不多渲染模板默认情况下,在程序文件夹中的子文件夹中寻找模板。如果需要可在文件夹中使用子文件夹存放文件。 1 程序的基本结构 1.1初始化 所有Flask 程序都必须创建一个程序实例。Web 服务器使用一种名为Web 服务器网关接口(Web Server Gateway Interface,WSG...

    lpjustdoit 评论0 收藏0
  • Flask Web Development —— 大型应用程序结构(上)

    摘要:被定义在包的构造函数中的应用程序工厂函数会在示例中展示。这个构造函数导入大部分当前需要使用的扩展,但因为没有应用程序实例初始化它们,它可以被创建但不初始化通过不传递参数给它们的构造函数。而应用程序范围内的错误处理则必须使用。 虽然小型web应用程序用单个脚本可以很方便,但这种方法却不能很好地扩展。随着应用变得复杂,在单个大的源文件中处理会变得问题重重。 与大多数其他web框架不同,Fl...

    chemzqm 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<