Falcon 3.0.0更改日志¶
总结¶
我们很高兴向您介绍Falcon 3.0,这是一个重要的新版本,它包括 ASGI-based
asyncio
和 WebSocket
支持,棒极了 multipart/form-data parsing 、更好的错误处理、对现有功能的增强以及常见的各种错误修复。
从自愿投入的时间和贡献的代码来看,这无疑是我们做过的最大的一次发布。我们真诚地感谢我们由38名贡献者组成的庞大团队,他们为这个版本提交了拉取请求,以及所有慷慨地为该项目提供资金支持的人。
当我们开始这个版本的工作时,我们知道我们不仅要改进框架的现有功能,而且要提供一流的、用户友好的 asyncio
支持与我们现有的 WSGI
功能集。
另一方面,我们一直在抵制扩大Falcon范围的诱惑,以便为社区项目和标准留出空间,围绕共同的、自给自足的能力进行创新。所以当 ASGI 到达现场时,我们认为这是交付长期要求的绝佳机会 asyncio
和 WebSocket
特性,同时仍然鼓励在Python web社区内共享和重用。
将大型代码库迁移到框架的主要新版本可能会很痛苦。因此,在3.0中,我们竭尽全力将破坏性更改降至最低,尽管一些方法和属性已被弃用。也就是说,在下面的突破性更改列表中,每个人都可能会遇到至少一到两个项目。在部署到生产环境之前,请仔细查看更改列表,并使用Falcon 3.0彻底测试您的应用程序。
在此版本发布之前,核心维护人员团队的成员花费了许多小时(以及不少深夜和周末)进行原型测试、调优和测试,以维护Falcon以正确性和可靠性著称的高标准。这就是说,没有代码是完美的,所以请不要犹豫,请联系 falconry/user 或 GitHub 如果你遇到任何问题。
再次感谢所有支持这个版本的人!多年来,我们愿意认为我们的小框架对Python社区产生了积极的影响,甚至帮助推动了艺术的发展。这都要感谢我们令人惊叹的支持者和贡献者。
对支持平台的更改¶
现在完全支持Python3.8和3.9。
只有在使用新的ASGI接口时才需要python3.6+。在python3.5+上仍然支持WSGI。
Python3.5支持已被弃用,在下一个主要版本中可能会被删除。
不再支持Python3.4。
Falcon2.x系列是最后一个支持Python语言版本2的版本。因此,Falcon3.0中取消了对cpython2.7和PyPy2.7的支持。
正在中断更改¶
这个班级
OptionalRepresentation
和属性has_representation
都被弃用了。默认的错误序列化程序现在为派生自falcon.HTTPError
。此外,Falcon现在确保在处理任何引发的异常之前清除之前设置的任何响应正文。 (#452 _)这个班级
NoRepresentation
已被弃用。的所有子类falcon.HTTPError
现在有了媒体类型表示。 (#777 _)为了调和框架对WSGI和ASGI的支持之间的差异,进行了以下突破性的更改:
falcon.testing.create_environ()
如果没有提供默认的User-Agent标头,则以前将该标头设置为值'curl/7.24.0 (x86_64-apple-darwin12.0)'
。从Falcon 3.0开始,默认的User-Agent字符串现在为f'falcon-client/{{falcon.__version__}}'
。为了向后兼容,可以通过设置falcon.testing.helpers.DEFAULT_UA
。这个
falcon.testing.create_environ()
函数的 protocol 关键字参数已重命名为 http_version 现在仅包括版本号(该值不再带有前缀'HTTP/'
)。这个
falcon.testing.create_environ()
函数的 app 关键字参数已重命名为 root_path 。这个 writeable 的属性
falcon.stream.BoundedStream
已重命名为 writable 根据标准的类似文件的I/O接口(旧名称拼写错误)如果错误处理程序引发的异常类型不是
falcon.HTTPStatus
或falcon.HTTPError
、剩余的中间件 process_response 在将未处理的异常冒泡到Web服务器之前,将不再执行方法。falcon.get_http_status()
不再接受浮点数,并且该方法本身已弃用。falcon.app_helpers.prepare_middleware()
不再接受单个对象;传递的值必须是可迭代的。falcon.Request.access_route
现在包括remote_addr
属性作为路由中的最后一个元素(如果尚未出现在所检查的其中一个标头中)。当
'REMOTE_ADDR'
字段不存在于WSGI环境中,Falcon将假定'127.0.0.1'
,而不是简单地返回None
为falcon.Request.remote_addr
。
以上更改是作为ASGI+HTTP工作流的一部分实现的。 (#1358 _)
未处理的异常将不再引发到Web服务器。相反,框架现在为
Exception
键入。这也意味着中间件 process_response methods will still be called in this case, rather than being skipped as previously. The new default error handler simply generates an HTTP 500 response. This behavior can be overridden by specifying your own error handler forException
viaadd_error_handler()
. (#1507 )异常现在由最具体的匹配异常类的注册处理程序处理,而不是按照注册的相反顺序进行处理。“特异性”由引发的异常类型的方法解析顺序确定。(请参阅
add_error_handler()
了解更多详细信息。) (#1514 _)已弃用的
stream_len
property was removed from theResponse
class. Please useset_stream()
orcontent_length
instead. (#1517 )If
RequestOptions.strip_url_path_trailing_slash
is enabled, routes should now be added without a trailing slash. Previously, the trailing slash was always removed as a side effect of a bug regardless of thestrip_url_path_trailing_slash
option value. See also: Falcon如何处理请求路径中的尾随斜杠? (#1544)重命名
falcon.Response.body
和falcon.HTTPStatus.body
至text
. The old name is deprecated, but still available. (#1578 )引用类
falcon.stream.BoundedStream
通过falcon.request_helpers
module is deprecated. It is now accessible from the modulefalcon.stream
. (#1583 )内部媒体处理程序的通用重构:
使用不支持空体的处理程序反序列化空体将引发
falcon.MediaNotFoundError
,并将呈现为400 Bad Request
回应。通过将默认值传递给get_media
当身体空空时使用。另请参阅falcon.Request.get_media()
有关详细信息,请参阅。以前None
在所有情况下都是在没有调用处理程序的情况下返回的。处理程序引发的异常包装为
falcon.MediaMalformedError
,并将呈现为400 Bad Request
回应。后续调用
falcon.Request.get_media()
或falcon.Request.media
如果第一个调用以错误结束,则将重新引发相同的异常,除非该异常是falcon.MediaNotFoundError
并将默认值传递给default_when_empty
当前调用的属性。以前None
被退回了。
外部处理程序应更新其逻辑以与内部Falcon处理程序对齐。 (#1589 _)
这个
falcon.Response.data
属性现在只返回它设置的相同数据对象(如果有的话),而不是检查并序列化falcon.Response.media
财产。取而代之的是,一个新的render_body()
方法,该方法可用于获取请求的HTTP响应正文,同时考虑到text
,data
,以及media
属性。 (#1679 _)这个
params_csv
parameter now defaults toFalse
infalcon.testing.simulate_request()
. The change was made to match the default value of the request optionauto_parse_qs_csv
(False
since Falcon 2.0). (#1730 )这个
falcon.HTTPError.to_json()
现在返回bytes
instead ofstr
. Importingjson
fromfalcon.util
is deprecated. (#1767 )的私有属性
JSONHandler
已重命名,并且使用的私有属性MessagePackHandler
都被替换了。引用这些变量的子类将需要更新。另外,无证无证的falcon.media.Handlers.find_by_media_type()
方法已弃用,可能会在将来的版本中删除。 (#1822 _)
新的和改进的¶
Asgi+WebSocket支持是通过以下方式添加到框架中的
falcon.asgi.App
和falcon.asgi.WebSocket
。 (#321 _)中的错误类
falcon.errors
were updated to have thetitle
anddescription
keyword arguments and to correctly handle headers passed as list of tuples (#777 )MultipartFormHandler
已添加,以启用对多部分表单(内容类型)的支持multipart/form-data
) throughfalcon.Request.get_media()
. (#953 )这个
falcon.Response.status
属性现在还可以设置为http.HTTPStatus
instance, an integer status code, as well as anything supported by thefalcon.code_to_http_status()
utility method. (#1135 )一个新的武士,
cors_enable
, was added to thefalcon.App
initializer.cors_enable
can be used to enable a simple blanket CORS policy for all responses. (See also: CORS.) (#1194 )Asgi+HTTP支持通过一个新类添加到框架中,
falcon.asgi.App
。这个 testing 模块还更新为完全支持ASGI应用程序,包括两个新的助手功能:falcon.testing.create_scope()
和falcon.testing.create_asgi_req()
。WSGI用户还可以获得一个新的falcon.testing.create_req()
方法。作为ASGI工作的一部分,添加了几个附加的实用程序功能,包括falcon.is_python_func()
,falcon.http_status_to_code()
和falcon.code_to_http_status()
;以及同步/异步辅助对象falcon.get_running_loop()
,falcon.create_task()
,falcon.sync_to_async()
,falcon.wrap_sync_to_async()
,以及falcon.wrap_sync_to_async_unsafe()
。 (#1358 _)这个
falcon.App
类初始值设定项现在支持新参数sink_before_static_route
(defaultTrue
, maintaining 2.0 behavior) to specify ifsinks
should be handled before or afterstatic routes
. (#1372 )这个
falcon.Response.append_link()
方法现在支持将 crossorigin link CORS settings attribute. (#1410 )Falcon现在支持所有WebDAV方法(RFC 2518和RFC 4918),例如COPY、LOCK、MKCOL、MOVE、PROPFIND、PROPPATCH和UNLOCK。 (#1426 _)
添加了检查模块,以收集有关已注册路由、中间件、静电路由、汇点和错误处理程序的应用程序信息(另请参阅: 检查模块 。) (#1435 _)
中的WSGI路径解码
falcon.Request
进行了优化,现在比Falcon2.0快很多。 (#1492 _)这个
set_headers()
方法现在接受任何类dict对象的实例,该对象实现items()
method. (#1546 )改变
falcon.routing.CompiledRouter
仅在路由第一个请求时编译路由。这可以通过传递compile=True
tofalcon.routing.CompiledRouter.add_route()
. (#1550 )这个
set_cookie()
方法现在支持将 SameSite cookie attribute. (#1556 )这个
falcon.API
class was renamed tofalcon.App
. The oldAPI
class remains available as an alias for backwards-compatibility, but it is now considered deprecated and will be removed in a future release. (#1579 )URLEncodedFormHandler
已添加,以启用对URL编码表单(内容类型)的支持application/x-www-form-urlencoded
) throughfalcon.Request.get_media()
. Theauto_parse_form_urlencoded
option is now deprecated in favor ofURLEncodedFormHandler
. (See also: 如何访问已发布的表单参数?). (#1580 )get_param_as_bool()
现在支持使用't'
and'y'
values forTrue
, as well as'f'
and'n'
forFalse
. (#1606 )falcon.testing.simulate_request()
现在接受 content_type keyword argument. This provides a more convenient way to set this common header vs. the headers argument. (#1646 )When no route matches a request, the framework will now raise a specialized subclass of
HTTPNotFound
(HTTPRouteNotFound
) so that a custom error handler can distinguish that specific case if desired. (#1647)Default media handlers
通过为现已过时的application/json; charset=UTF-8
. As a result, providing a custom JSON media handler will now unambiguously cover bothapplication/json
and the formerContent-type
. (#1717 )
固定的¶
以前,默认设置为
CompiledRouter
错误地从URI模板中剥离尾随斜杠。此问题已修复,现在可以为具有和不具有尾随前向劈开的路径添加两条不同的路由(另请参阅:RequestOptions.strip_url_path_trailing_slash
)。 (#1544 _)falcon.uri.decode()
和falcon.uri.parse_query_string()
不再对大量百分比编码字符进行二次爆炸。这些效用函数的时间复杂度现在总是接近于 O ( n )。 (#1594 _)什么时候
auto_parse_qs_csv
启用后,框架现在可以正确解析查询字符串中同一参数的所有匹配项,而不是只拆分第一个匹配项中的值。例如,之前t=1,2&t=3,4
would become['1', '2', '3,4']
, now the resulting list will be['1', '2', '3', '4']
(#1597 )这个
parse_query_string()
实用程序函数现在可以正确地将空字符串解析为{{}}
. (#1600 )以前,响应序列化错误(例如在有故障的自定义媒体处理程序的情况下,或者因为
HTTPUnsupportedMediaType
是为不支持的响应内容类型引发的)意外地冒泡到应用程序服务器。此问题已修复,现在处理这些错误的方式与响应程序中引发的其他异常完全相同(另请参阅: 错误处理 )。 (#1607 _)falcon.Request.forwarded_host
现在包含未设置代理头时的端口,以便在应用程序不在代理之后时正确重建URL。 (#1678 _)这个
Response.downloadable_as
属性现在可以正确编码非ASCII文件名(根据 RFC 6266 recommendations. (#1749 )这个
falcon.routing.CompiledRouter
在探索不匹配的路由时,不再错误地设置路由参数。 (#1779 _)这个
to_query_str()
方法现在可以正确编码参数值和键。因此, params parameter insimulate_request()
will now correctly pass values containing special characters (such as'&'
) to the application. (#1871 )falcon.uri.encode
和falcon.uri.encode_value
现在,在默认情况下转义所有百分比字符,即使它们似乎已经转义。这个falcon.uri.encode_check_escaped
和falcon.uri.encode_value_check_escaped
添加了方法,使您可以选择在需要的地方保留以前的行为。这些新方法已被应用于falcon.Response.location
,falcon.Response.content_location
,falcon.Response.append_link()
保留以前行为的属性和方法。 (#1872 _)以前,标记为
deprecated()
实用程序包装可能会引发意外的AttributeError
when running under certain applications servers such as Meinheld. This has been fixed so thatdeprecated()
no longer relies on the availability of interpreter-specific stack frame instrospection capabilities. (#1882 )
杂项¶
不建议对的可选kw参数使用位置参数
falcon.HTTPError
子类 (#777 _)设置市政公告员,使更改报告变得更容易。 (#1461 _)
修复Windows上的测试错误 (#1656 _)
一种新的方法,
get_media()
,现在可以使用,而不是falcon.Request.media
属性使应用程序维护人员更清楚地知道,获取请求的媒体对象涉及使用和反序列化正文流的副作用。原始属性保持可用,以确保与现有应用程序的向后兼容性。 (#1679 _)Falcon现在使用
falcon.Response
序列化到JSON时的媒体处理程序falcon.HTTPError
和falcon.asgi.SSEvent
。falcon.Request
将参数作为JSON加载时,将使用其定义的媒体处理程序falcon.Request.get_param_as_json()
。 (#1767 _)这个 add_link() method of the
falcon.Request
class was renamed tofalcon.Response.append_link()
. The old name is still available as a deprecated alias. (#1801 )
此版本的贡献者¶
多亏了我们在本次发布中的所有才华横溢和时尚贡献者!