Web 应用程序无聊堆栈 wemake-python-styleguide

2025-05-24

Web 应用程序无聊堆栈

wemake-python-样式指南

JetBridge,我们乐于与客户共同开发引以为豪的软件应用程序,同时拓展我们的知识和专业领域。由于我们经常启动新项目,因此我们制定了一套统一且富有表现力的工具、库和框架,以帮助我们快速开发新应用程序,并以最少的重复工作交付尽可能多的价值。

我们的设置并非完美无缺,也并非适用于所有项目的终极堆栈,但它是我们多年来不断改进的,并且效果非常好。我们持续学习新的工具和技术,并改进我们的工作流程,因此,这更像是一个时间点的快照。如果您不是在 2019 年 7 月阅读这篇文章,那么我们可能至少对堆栈的某些部分进行了修改。

方法论

我们的软件开发理论是:不要让事情变得过于复杂。

务实和商业价值才是最重要的考量,而不是追求最新、最酷、最潮的框架或技术。我们和极客一样热爱尝试新奇事物,但我们不认为仅仅为了追求新奇或感觉不时髦而使用新事物是明智之举。在选择基于哪个库或框架构建应用程序时,成熟度和支持度都应考虑在内,可维护性、社区、可用的文档和支持,当然还有它能为我们和客户带来什么实际价值,也都应考虑在内。

很多工程师倾向于将软件设计得比实际需要的更复杂。例如,当市面上已有广泛可用且广为人知的工具可以完成工作时,他们却使用非标准工具。他们试图将某人在 Hacker News 上看到的一些巧妙技术强行塞进并不真正适合的领域。他们依赖额外的外部服务,而实际上已经有可以扩展以执行所需任务的服务。他们使用过于底层的东西,而实际上更多的抽象可以简化事情;或者,当一个简单的系统级工具或语言可以更快速地完成任务时,他们却使用过于花哨和复杂的东西。

简单是一种策略,如果使用得当,可以大大提高代码的可读性和可维护性,并使操作环境易于管理。

前端

在我写这篇文章的时候,我们使用的所有框架和库很可能已经被新潮的 JS 框架和库所取代,你会嘲笑我们这些不合时宜的选择。然而,以下这些方法目前对我们来说仍然有效:

  • React: Vue 在 GitHub 上获得的 Star 可能更多,但 React 仍然是行业标准,并且受到 Facebook 等众多项目的积极使用和支持。使用 React Hooks 编写应用程序确实感觉我们越来越接近函数式编程,将可组合性和代码复用性提升到了一个全新的水平,而这些是之前使用 HOC 笨拙地实现的。
  • Material-UI for React 是一个工具包,它几乎包含了你可能需要的所有类型的小部件和实用程序,强大的主题和样式选项,流畅地集成了 CSS-in-JS,并且开箱即用。它本质上是 Google 发布的 UI 范式的实现,因此在其约束和视觉语言范围内工作可以为你打下良好的基础。
  • Create-React-App/react-scripts:它能满足你所​​有的需求,并以合理的默认设置配置你的新 React 应用。你再也不需要费力地使用 Webpack 或 HMR 了。我们扩展了CRA/rs,可以生成新的前端项目,并添加额外的 ESlint、更漂亮的选项以及 Storybook。
  • Storybook我们倾向于构建一个包含各种大小组件的组件库,这些组件使用模拟数据独立实现,而不是总是在完整的应用内部编写代码并测试布局和设计。这使得 UI 开发人员的工作不会因为后端端点的完成而受到阻碍,有助于强化可重用和独立组件的概念,并让我们能够轻松预览各种界面状态。
  • TypeScript:现在每个人都在使用 TypeScript,因为它很棒,你也应该这样做。它确实需要一些时间来适应,学习如何在 React 和 Redux 中正确使用它需要一些学习,但这完全值得。记住:你永远不需要使用any。当你认为需要使用 时any,你可能只需要添加一个类型参数(泛型)。
  • ESLint: ESlint 现在与 TypeScript 完美兼容!别忘了设置 extends: ['plugin:@typescript-eslint/recommended', 'plugin:react/recommended', 'react-app']
  • Prettier:设置您的编辑器,在保存时运行 Prettier 来处理代码。它不仅可以强制代码风格一致,还能让您在格式化代码时更加省心。更少的输入,更好的格式。
  • Redux: Redux 确实不错……我想。你确实需​​要一个中心位置来存储用户身份验证信息之类的东西,而redux-persist非常方便。不过,为了保持简单,请认真思考一下自己正在做的事情是否需要 Redux。也许你需要,或者你也可以直接使用 hooks 或 state。当然,你一开始可能想在 Redux 中缓存一些 API 响应,但如果你开始添加服务器端过滤、搜索或排序功能,那么最好还是在组件内部进行简单的 API 请求。
  • Async/await:别再用 Promise API 了!在 UI 组件中捕获异常,这样你就可以真正地向用户展示错误,而不是在 API 层。
  • Axios:首选的 HTTP 客户端。我们使用 JWT 进行身份验证,并推荐使用我们的axios-jwt 拦截器模块来处理令牌存储、授权标头和刷新。

我不认为这有什么疯狂或不寻常之处,这就是重点。除非你有充分的理由,否则就坚持标准做法。

后端

我们的后端服务始终围绕12 因素应用原则进行设计,并且始终构建为云原生,并在适当的情况下构建为无服务器

大多数项目都涉及设置典型的 REST API、与其他服务通信以及在 PostgreSQL 数据库上执行 CRUD 操作。我们的首选技术栈是:

  • Python 3.7。Python 简洁易读,在 PyPI 上拥有令人印象深刻的庞大社区模块库,核心开发活跃,高级动态特性之间达到了相当好的平衡,不会太过晦涩或分散注意力。
  • 使用 进行类型注解和类型 linting。Pythonmypy确实有类型注解,但它们的功能非常有限,集成度不高,而且通常不太适合用来捕获错误。我希望这种情况能够有所改善,因为与 TypeScript 或 Go 等语言相比,Python 中的许多错误必须在运行时才能发现。在我看来,这是 Python 最大的缺点,但我们会尽力改进mypy
  • Flask是一个轻量级的 Web 应用框架。Flask 非常适合构建 REST API,它为您的应用程序提供了足够的结构来处理 WSGI、配置、数据库连接、可重用的 API 处理程序、跟踪/调试(使用AWS X-Ray)、日志记录、异常处理、身份验证和灵活的 URL 路由。除了提供粘合剂将所有内容粘合到一个连贯的应用程序中,而不会带来太多开销或样板代码之外,我们对 Flask 的依赖并不多。
  • SQLAlchemy用于声明式 ORM。它拥有处理 Postgres 方言特性(例如UPSERT和)的出色功能JSONB。能够为模型和查询类编写混合宏的功能非常强大,我们在软删除等功能中也越来越多地使用它。多态子类型是 SQLAlchemy 最有趣的特性之一,它允许您定义类型鉴别器列,并根据其值实例化适当的模型子类。
  • 测试:包装每个测试的子事务pytest-factoryboy用于从我们的模型类生成用于 pytest 的装置,以及用于生成用于开发环境的模拟数据。CircleCI。Pytest装置。Flask测试客户端
  • Flask-REST-API搭配Marshmallow可以帮助您简洁地定义 REST 端点、序列化和验证,并尽可能减少样板代码,并在适当的情况下大量使用装饰器,营造出声明式的体验。此外,它还能生成 OpenAPI 规范文档,并附带 Swagger-UI,无需任何额外工作即可自动提供每个 API 端点及其参数和响应形状的文档。
  • 我们目前正在开发Flask-CRUD,以进一步减少 CRUD API 常见情况下的样板并强制执行严格的数据模型访问控制检查。

在需要的项目中,我们可以使用 Heroku 或 EC2 进行托管,但我们最近的所有项目都足够简单,可以构建为无服务器应用程序。您可以在本文中更详细地了解我们的设置以及它给我们带来的好处。

我们构建了一个入门套件,将所有后端组件整合到一个强大的模板中,用于引导新的无服务器 Flask 项目,该模板名为sls-flask。如果您正在考虑用 Python 构建一个基于数据库的 REST API,不妨试试!这个小巧的软件包提供了强大的功能和灵活性。它本身并没有什么特别之处,但我们相信,它所提供的基础足以打造一个极其精简且现代化的开发工具包。

我们所有的工具和模板都是开源的,并且我们经常向上游模块贡献错误报告和修复。我们鼓励您试用我们的技术栈,或者如果您对目前的使用感到满意,请告诉我们您正在使用什么。分享并享受乐趣

文章来源:https://dev.to/cybermischa/web-application-software-stack-2019-edition-3c30
PREV
4 个 CSS 技巧可能会让你招致其他开发者的不满
NEXT
如何使用 Go、Terraform 和 AWS 构建简历 API