显式应用程序对象
基于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'