【问题标题】:Django Web Application Design GuidanceDjango Web 应用程序设计指南
【发布时间】:2016-12-04 00:05:24
【问题描述】:

在开始一个新项目之前,我正在寻求一些建议。

我正在使用 Django 1.10 创建一个 Web 应用程序。我有使用 Django 的经验并用它创建一般的“基于内容”的网站。然而,由于这个项目将是一个基于 Web 的应用程序,我计划做更多“复杂”的事情,而不仅仅是渲染 HTML 模板和做一些基本的 CRUD 操作。当我说“复杂”的事情时,我现在可以给出的最具体的例子是利用更多的异步请求,这样我的 Web 应用程序可以保持对用户的响应,并提供应用程序附带的“实时”体验可能安装在他们的本地机器或其他任何东西上。另外,由于这是一个 Web 应用程序,而不仅仅是一个网站,该项目肯定会更加数据驱动,这可能意味着请求大量数据,这些数据最好以分页方式等方式提供服务。

所以,我的想法是这样.....因为我熟悉 Django 并阅读了有关 Django REST 框架的好东西,我可以创建一个 RESTful API 来执行我所有的 CRUD 操作并基本上与我的Web 应用程序的核心数据库。

那时,我基本上可以有两个“层”:(1) 呈现我的 Web 应用程序页面的表示层和 (2) 将执行所有后端 CRUD 操作的应用程序层。由于两者是分开的,如果以后需要的话,我还将获得能够从其他途径(除了我的 Django Web 应用程序)利用 API 的额外好处。

我想我的第一个问题是这是否有意义,如果是,请考虑实施它的最佳方式。我相信我有两个选择。

  1. 创建单个 Django 项目并将 API 作为单独的应用程序包含在内。这似乎可以正常工作,但它将我的 API 与我的演示文稿结合在一起,因为它们都将由同一台服务器托管。哪个...如果 API 的唯一“消费者”是我的一个 Django 站点,那么这在短期内可能不是问题,但以后可能会导致问题。

  2. 将两者分成两个不同的 Django 项目。我认为这提供了最大的灵活性并且可能是最好的答案。

可能还有其他选择。归根结底,我正在向以前做过这件事的人寻求一些建议/指导,以及在开始这项工作之前我应该​​考虑哪些其他事情。

【问题讨论】:

  • 我建议制作一个 Django REST 框架来构建 API,并使用 ReactJS 或 Angular 之类的东西做前端。如果您需要 websockets,那么您可以添加 Django-Channels。前端可以是静态文件和单独的项目。

标签: django django-rest-framework


【解决方案1】:

基本上我不会推荐第二种方式。这是因为你很快就会开始为这样的问题苦苦挣扎:在哪里存储模型?项目A,项目B,两者都有??此外,我几乎可以肯定,您将拥有可以在两个 django 项目之间共享的其他代码。

在此值得注意的是,在两个单独的 django 项目中 - 您将无法同步迁移(只需考虑同时更改两个项目中的模型)。就个人而言 - 我从来没有能够以某种好的、可接受的方式解决这个问题。

也许我会与您分享我的个人经历 - 希望这会有所帮助。

  1. 首先,如果您正在制作一个大型应用程序 - 考虑从 django 模板中辞职 - 使用一些现代 js 框架作为前端:react、angular;并为fontend创建一个单独的项目。这很棘手,因为您需要在团队中拥有正确的能力。如果这是不可能的 - 最好在前面单独使用 django 应用程序。

  2. 使用 DRF - 您可以在项目中创建 rest 应用程序并使用在其他地方定义的所有模型 - 它会为您提供开箱即用的简单 CRUD,并且通过一些工作它可以非常强大。如果您能够在现代 js 框架中创建前端 - 此 REST 也可用于将数据提供给前端。以及您可以想象的任何其他客户。这基本上将需要在后端完成的工作量(仅 REST 而不是 REST + 模板和渲染)转移到了前端。

  3. 异步任务。好吧,这里没有什么新鲜事——用芹菜。在应用程序中定义您的任务;确保您拥有正确数量的工人。让magic 开始吧。

  4. 至于实时体验,你可以考虑使用django-channels:https://github.com/django/channels/这是处理websocket连接的好方法。

需要考虑的事项:

在大型应用程序中,您通常会得到如下结果: myapp.com -> point to frontend; api.myapp.com -> point to the api 您应该在代码中明确区分这两者。如果您的前端是基于 js 的 - 这不是问题,但是休息 + 渲染能够运行 only-api-nodeonly-rendering-node 很重要。很难说其中哪一个会被更多地使用。

所以基本上你可以得到这样的结果:

core
    models
        users.py
my_app_frontend
    users
        views.py
        forms.py
        tasks.py
        urls.py
my_app_rest
    users
        serializers.py
        views.py
        signals.py
        urls.py
my_app
    settings.py
    rest_settings.py
    manage.py
    wsgi.py
    rest_wsgi.py
    urls.py
    rest_urls.py

这有一些我喜欢的优点:

  1. 模型在一个地方;
  2. 可以根据需要运行两个单独的nodes
  3. 您的开发设置应该能够以whole 运行开发服务器。结合正面和背面的设置。
  4. 有一个清晰的代码分离 - 我们知道上面的结构是什么。

如果您还有其他问题 - 请提出。

我也很好奇其他人要说什么 - 以及他们如何处理我指出的问题:)

编码愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多