【Flask】显式应用程序对象和销毁行为以及销毁行为在flask项目中的使用

2022-12-13 18:27:58 浏览数 (2)

显式应用程序对象

基于WSGI的Python web应用程序必须有一个中央调用对象来实现实际应用程序。在Flask中,中心调用对象是Flask类的一个实例。每个Flask应用程序必须创建该类的一个实例,并将模块的名称传递给该实例。但为什么Flask不能自动做好所有这些事情呢?

代码语言:javascript复制
from flask import Flask
app = Flask(__name__)

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

使用对象有三个主要原因。最重要的原因之一是显式对象可以保证实例的唯一性。使用单个应用程序对象模拟多个应用程序有多种方法,例如维护应用程序堆栈,但这会导致一些问题。我不会在这里展开。现在的问题是:微框架何时需要多个应用程序?最好的答案是单元测试。测试时,创建一个用于测试特定功能的最小应用程序非常有用。当删除此最小应用程序的应用程序对象时,将释放其占用的所有资源。

代码语言:javascript复制
from hypothetical_flask import route

@route('/')
def index():
    return 'Hello World!'

此外,在使用显式对象时,可以继承基类(Flask)以方便修改特定函数。如果不使用显式对象,则无法启动。 第二个原因也很重要,那就是Flask需要包名。创建Flask实例时,通常将__name__作为包的名称。Flask根据包名加载与模块相关的正确资源。通过Python出色的反射功能,您可以找到模板和静态文件open_resource()。

代码语言:javascript复制
from flask import Flask
from flask_restful import Api, Resource


app = Flask(__name__)
api = Api(app)


class HelloWorldResource(Resource):
    def get(self):
        return {"hello": "world"}


    def post(self):
        return {"hello": "world"}


api.add_resource(HelloWorldResource, "/")

显然,还有其他框架可以在没有任何配置的情况下加载与模块相关的模板。然而,前提是必须使用当前工作目录,这是一种不可靠的实现方法。当前工作目录为进程级。如果多个应用程序使用相同的过程(web服务器可能在您不知情的情况下执行此操作),则当前工作目录将不可用。还有一种更糟糕的情况:许多web服务器将文档根目录视为当前工作目录。如果应用程序位于文档根目录以外的目录中,则会发生错误。

自动转换

如果不处理二进制数据,请使用Unicode。Unicode在Python2.x中意味着什么? 只要只使用ASCII字符点(基本上是数字、非变音或非花哨的拉丁字母),就可以使用常规字符串常量(“Hello World”) 如果字符串中需要ASCII以外的字符,则需要通过添加小写u前缀(如u’Hänsel und Gretel’)将字符串标记为Unicode字符串 如果在Python文件中使用非Unicode字符,则需要告诉Python文件使用的编码。

代码语言:javascript复制
def write_file(filename, contents, charset='utf-8'):
    with open(filename, 'w') as f:
        f.write(contents.encode(charset))

同样,我建议为此使用UTF-8。您可以在Python源文件的第一行或第二行中编写#--coding:utf-8--,以通知解释器编码类型。 Jinja被配置为从UTF-8解码模板文件。因此,确保您的编辑器也以UTF-8保存文件。

代码语言:javascript复制
def read_file(filename, charset='utf-8'):
    with open(filename, 'r') as f:
        return f.read().decode(charset)

默认情况下,大多数当前编辑器存储为UTF-8,但如果您的编辑器未配置为UTF-8,则需要对其进行更改。以下是将编辑器设置为UTF-8存储的一般方法: Vim:将set enc=utf-8添加到。vimrc文件 Emacs:使用编码的cookie或将其放入您的。emacs文件:

代码语言:javascript复制
(prefer-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)

销毁行为

经批准的Flask扩展需要维护人员。如果扩展作者想要超越项目,项目应该寻找新的维护者,包括完整的源托管转换和PyPI访问。如果没有可用的维护人员,请给予Flask核心团队访问权限。

代码语言:javascript复制
def close_connection(response):
    ctx = _request_ctx_stack.top
    ctx.sqlite3_db.close()
    return response

if hasattr(app, 'teardown_request'):
    app.teardown_request(close_connection)
else:
    app.after_request(close_connection)

经批准的Flask扩展必须提供准确的Flask_包或扩展名模块。它们也可以驻留在flaskext命名空间包中,尽管目前不建议这样做。 它必须附带make测试或python设置py测试的调用测试套件。对于使用make测试测试的套件,扩展必须确保自动处理测试所需的所有依赖项。如果测试由python setup执行,则调用py测试。测试的依赖性由设置Py文件确定。测试套件也必须是分发的一部分。

代码语言:javascript复制
def hello(name):
    print 'Hello %s!' % name


def goodbye(name):
    print 'See you %s.' % name


class MyClass(object):
    """This is a simple docstring"""

    def __init__(self, name):
        self.name = name

    def get_annoying_name(self):
        return self.name.upper()   '!!!!111'

0 人点赞