在重构Flask项目的时候对于WSGI中间件和好密钥的规划实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在重构Flask项目的时候对于WSGI中间件和好密钥的规划实战相关的知识,希望对你有一定的参考价值。

##手动推入一个上下文 如果尝试访问应用程序上下文之外的当前内容_应用程序或此对象的任何使用都将收到此错误消息:

RuntimeError: Working outside of application context.
​
This typically means that you attempted to use functionality that
needed to interface with the current application object in some way.
To solve this, set up an application context with app.app_context().

如果在配置应用程序(例如初始化扩展)时看到这样的错误消息,则可以手动推送上下文以访问应用程序。在with语句上下文()上下文管理器对象中使用app,块中运行的所有代码都可以访问current app:

def create_app():
    app = Flask(__name__)
​
    with app.app_context():
        init_db()
​
    return app

代理对象注意事项

一些Flask对象是其他对象的代理。在每个工作线程中,以相同的方式访问代理对象。在内部实现中,代理对象指向唯一绑定到工作者的对象。详细信息见本页。 大多数时候,这些细节不需要担心。但有时最好知道这个对象实际上是一个代理: 代理对象无法模拟它实际指向的对象类型。如果要检查实例,应检查代理对象本身。 使用代理对象的引用时,例如发送信号或将数据传递给后台线程。 如果需要访问底层代理对象,请使用_get_current_object():

app = current_app._get_current_object()
my_signal.send(app)

虚拟环境

使用虚拟环境,可以在开发环境和生产环境中管理项目依赖关系。 虚拟环境解决了哪些问题?拥有的Python项目越多,就越可能需要使用不同版本的Pytython包,甚至Python本身。一个项目使用的库的新版本可能会破坏其他项目的兼容性。 虚拟环境是Python库的独立集合,每个项目对应一个虚拟环境。安装在一个项目中的包不会影响其他项目或操作系统级包。 Python的内置venv模块可用于创建虚拟环境。

> mkdir myproject
> cd myproject
> py -3 -m venv venv

信息闪光灯

一个好的应用程序和用户界面有很好的反馈,否则用户以后会讨厌这个应用程序。烧瓶通过闪光系统提供了一种易于使用的反馈方法。闪存系统的基本工作原理是在请求结束时记录一条消息,并仅为下一个请求提供该消息。布局模板通常用于显示闪烁消息。 Flash()用于闪烁消息。在模板中,使用get_flashd_ Messages()操作消息。有关完整示例,请参见闪烁消息

集成WSGI中间件

如果要向应用程序添加WSGI中间件,可以打包内部WSGI应用程序。假设您想使用Werkzeug包中的中间件来解决lighttpd错误,那么可以这样做

from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

请求对象

请求对象在API部分中有详细描述,这里不再详细讨论(请参阅请求)。在这里,我们简单地谈谈最常见的操作。首先,必须从烧瓶模块导入请求对象: 来自烧瓶进口请求 您可以使用method属性操作当前请求方法,并使用form属性处理表单数据(POST或PUT请求中传输的数据)。下面是使用上述两个属性的示例:

@app.route(/login, methods=[POST, GET])
def login():
    error = None
    if request.method == POST:
        if valid_login(request.form[username],
                       request.form[password]):
            return log_the_user_in(request.form[username])
        else:
            error = Invalid username/password
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template(login.html, error=error)

当键不存在于表单属性中时会发生什么?将引发KeyError。如果未将KeyError捕获为标准错误,将显示HTTP 400错误请求错误页面。因此,在大多数情况下,不必处理这个问题。 args属性可用于操作URL中提交的参数(例如?Key=value): searchword=request.args。get(key,) 用户可能会更改URL,导致400请求错误页面,这会降低用户友好度。因此,我们建议使用get或捕获KeyError来访问URL参数。

如何生成好密钥

生成随机数的关键是一个好的随机种子,所以一个好密钥应该具有足够的随机性。操作系统可以基于密码随机生成器以多种方式生成随机数据。使用以下命令快速创建Flask secret_Key(或secret_Key)生成值:

$ python -c import os; print(os.urandom(16))
b_5#y2L"F4Q8z\\n\\xec]/

基于cookie的会话描述:Flask将检索会话对象中的值,序列化该值并将其存储在cookie中。当一个cookie被打开时,如果您需要查找一个值,但该值没有连续存储在请求中,您将不会收到一条清晰的错误消息。请检查页面响应中的cookie大小是否与web浏览器支持的大小一致。 除了默认的客户端会话之外,还有许多支持服务器会话的Flask扩展。

以上是关于在重构Flask项目的时候对于WSGI中间件和好密钥的规划实战的主要内容,如果未能解决你的问题,请参考以下文章

Flask 中间件

重构 Flask 服务端项目对于 SQL 的配置使用和延迟的请求回调巧妙设计运用

flask 配置文件 路由 视图 模板 中间件

flask自带的wsgi卡死的问题

Flask - 中间件

Flask(Flask_脚本项目重构)