【问题标题】:What is the "best" way to build a Django Webapp frontend? [closed]构建 Django Webapp 前端的“最佳”方法是什么? [关闭]
【发布时间】:2019-12-13 06:23:37
【问题描述】:

提前致谢!这更像是一个“哲学”问题,而不是直接要求对代码发表意见,尽管我非常感谢任何人对代码示例的投入。

从我记事起,我一直是一名“传统”开发人员,现在我以数据科学家的身份从事专业工作。话虽如此,我从未真正接触过的一个领域是 Web 开发。

对于我正在进行的项目,我需要构建(并且在稍微加快的时间范围内)一个外观漂亮的 Web 应用程序,其功能与 Wiki 网站有些相似(此处不能选择使用 Mediawiki 等现有代码库,所以假设一切都必须从头开始构建)。

在尝试以“正确的方式”做事时,我进行了如下设置:

  1. 构建的 Django 模型似乎可以正确捕获 web 应用程序的数据关系结构,至少通过使用 Django 的管理门户进行测试
  2. Django 连接到 Postgres 数据库
  3. (1) 和 (2) 在 Docker 容器中运行

显然,这里最重要的部分是前端。我尝试向几个朋友和熟人征求意见,并被指出了 Bootstrap 的方向。

从这里开始,我承认,我有点卡住了。

我在 Django docs 上看到了不涉及任何 Javascript 的示例(看起来,只需最少的提升,HTML 页面就可以直接与数据库交互,使用看起来非常简单的“插入占位符”逻辑,因为我已经通过 Django 模型进行了设置)。我看到了类似的构造herehere

但后来我在网上看到了一个whole other set of instruction,介绍了如何制作功能性 web 应用程序——为 Django 模型创建序列化程序到 JSON,构建 REST api,使用 Javascript 编写前端页面逻辑并使用导入的库Javascript 与手动构建的 API 交互以与后端交互。

现在,当然,“第一种”方法似乎要简单得多。第二个感觉就像重新发明轮子——如果我可以简单地使用像 {{ num_books }} 这样的结构,我为什么要构建所有这些 API 并担心 JSON?但我觉得很困惑。是否有一个“正确”的选择,长远考虑?似乎我可以找到使用 Bootstrap 和其他框架的人同时采用这两种方法。除非我采用 JSON/API 方法,否则我可以不使用 Javascript 代码吗?这还重要吗?这里真正的区别是什么?

在波涛汹涌的海面上有一个指南针将不胜感激。当然,我不能成为第一个尝试使用 Django 构建功能性 webapp 的人……前端对我来说完全陌生。

谢谢大家!

【问题讨论】:

    标签: django twitter-bootstrap django-rest-framework


    【解决方案1】:

    首先,Django 是一个框架,这意味着它已经包含了大多数人需要的一组预定义的必要功能,有时人们会说“包括电池”。

    在 REST 架构被发明之前,前端和后端是密切相关的。它们之间没有直线,很难与其他服务共享业务逻辑。

    基本上我们可以说有两个选项,如何用Django组织前端和后端工作流:

    使用 Django 模板:

    最简单、最容易上手的方法。您需要的所有内容都已在 Django 中呈现。我们来看看这个简单的例子:

    views.py

    def index(request):
        fruits = Fruit.objects.all()
        render(request, 'index.html', {'fruits': fruits})
    

    之后,您可以在模板中使用上下文中的变量,如下所示:

    index.html

    <ul>
        {% for fruit in fruits %}
        <li>{{ fruit }}</li>
        {% endfor %}
    </ul>
    

    Django 模板系统非常强大且可自定义,如果默认模板引擎不适合您的需求,您可以选择另一个模板引擎,例如 Jinja

    您可以在那里做很多事情,但作为一般建议,所有“计算”内容不应该存储在模板级别,因为它会显着增加页面的渲染时间。放置业务逻辑的更好地方是视图和custom managers 上的大部分数据库工作。

    对于应用程序的动态部分,您可以使用 AJAX 可能来自 JQuery 库。

    使用forms 也很简单,Django 默认使用csrf 保护来处理它。默认validatorsmodel forms 为您提供真正的力量。

    当您使用依赖于它们的模板时,很可能您无法在其他地方重用您的端点,这就是您需要 REST 的原因。 Django 有一些功能可以帮助您,您很可能最终会使用django-rest-framework,这是当今 Django 使用的最流行的库之一。

    使用 REST 架构:

    上面的例子看起来像这样,尽管有ModelViewSet,它为你做了大部分样板文件:

    class FruitViewSet(viewsets.ViewSet):
        def list(self, request, *args, **kwargs):
            fruits = Fruit.objects.all()
            ser = FruitSerializer(fruits, many=True)
            if not ser.is_valid():
                return Response({}, status=status.HTTP_400_BAD_REQUEST)
            return Response(ser.data, status=status.HTTP_200_OK)
    

    您可以使用ModelSerializer 或编写自己的序列化程序。验证过程简单明了:

    class FruitSerializer(serializers.ModelSerializer):
        def validate(self, attrs):
            # validate your data here
            pass
        class Meta:
            model = Fruit
            fields = '__all__'
    

    要在网页上显示这些数据,你可以使用任何你想要的东西,香草 javascript 或任何支持 REST 的 javascript 框架,今天最流行:ReactAngularVue

    使用REST,您可以为您的网络、移动应用程序等使用相同的 API。最终实现一次处处使用。

    【讨论】:

    • 非常感谢您提供如此清晰的解释!这有很大帮助。好像你说我什至可以根据需要混合使用这两者,但每当我使用 JS 时,我都必须切换到 REST。如果我有一堆半静态页面,那么模板系统可能对快速原型制作有意义。另一个问题:当您说“所有“计算”内容不应该存储在模板级别”时,我还能在哪里做呢?
    • @kmypwn 我很乐意提供帮助。我已经改进了答案;是的,您可以混合使用它们,假设您的应用程序的某些部分可以用 Django 模板处理,而其他部分可以用 React 处理,但我仍然不建议这样做,因为这会使事情更难处理,但当然,您可以仍然使用 javascript 和 AJAX 处理任何动态内容。
    • 这简直太棒了。你一定是老师!
    【解决方案2】:

    一旦你想在你的前端拥有动态部分,你就会在某个时候需要 Javascript。为了加快开发速度,我强烈建议使用VueReactAngular 之类的框架。他们有数十种工具可用于满足您项目中的特定需求。你也可以在使用 Javascript 时查看jQuery

    我目前正在自己​​构建一个 Django Web 应用程序(大约在 3 个月前开始)。我经常使用 Javascript 来操作 Django 渲染的模板。

    为什么 Django 可能是您的正确选择

    关于 Django 的优点在于 Model-View-Template 架构,我认为它是您的 wiki app 的绝佳框架。您请求一个 http,Django 触发链接的 view-function 并呈现 template - 等等!如果您需要从/到 PostgreSQL 的数据传输,您只需构建一个 model 并将数据调用包含到 view-function 以使用前端的数据。

    • 您不必构建用户管理系统(内置 django-admin)
    • 您将在 Django 轨道中包含大量前端所需的业务逻辑
    • 无需担心 JSON。您只需使用 python 对象从数据库中获取数据并在前端处理该数据。如果出于某种原因 json 会成为更好的选择,那么您只需使用 Python 序列化程序对其进行操作。
    • 使用例如部署/发布基于 Django 的应用程序非常容易。 digitalocean.com 或 heroku.com

    由于这是一个宽泛的问题,我希望我可以为您提供一些关于如何继续开发的提示。不过,如有更多问题,请随时评论此帖子。

    为了给你一个简短的感觉,我将附上我当前项目的一些 sn-ps,使用基本的 HTML、CSS 和 Javascript 以及 Django 作为基于 python 的后端。

    【讨论】:

    • 谢谢你!那么你是说你混合使用了 Django 模板引擎和一些 Javascript 吗?但是如果你使用 Javascript,你不需要使用 REST 吗?
    • 对。当你想使用 Javascript 时不需要 REST
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2013-06-19
    • 2014-01-22
    相关资源
    最近更新 更多