构建 Django Webapp 前端的“最佳”方法是什么? [关闭]

2024-02-27

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

从我记事起,我就一直是一名“传统”开发人员,现在我的职业是数据科学家。话虽这么说,我从未真正接触过的一个前沿领域是网络开发。

对于我正在从事的一个项目,我需要构建(并且在某种程度上加快的时间范围内)一个美观的 Web 应用程序,其功能有点类似于 Wiki 网站(使用像 Mediawiki 这样的现有代码库在这里不是一个选项,所以假设一切必须从头开始构建)。

为了尝试以“正确的方式”做事,我将事情设置如下:

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

显然,剩下的最重要的部分是前端。我尝试向几位朋友和熟人寻求建议,并得到了 Bootstrap 方向的指导。

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

我在 Django 上看到了例子docs https://docs.djangoproject.com/en/3.0/intro/tutorial03/不涉及任何Javascript(看起来,用最小的提升,HTML页面可以直接与数据库交互,使用看起来非常简单的“insert-placeholder-here”逻辑,就像我通过Django模型设置的那样)。我看到类似的结构here https://tutorial.djangogirls.org/en/css/ and here https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Home_page.

但后来我看到一个整套指令 https://scotch.io/tutorials/build-a-to-do-application-using-django-and-react在网络上了解如何制作功能性 Web 应用程序——为 Django 模型创建 JSON 序列化器、构建 REST api、使用 Javascript 编写前端页面逻辑以及使用导入 Javascript 的库来与手动构建的 API 进行交互)与后端交互。

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

在波涛汹涌的海上有一个指南针会非常感激。当然,我不可能是第一个尝试使用 Django 构建功能性 Web 应用程序的人……前端对我来说完全陌生。

谢谢你们!


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

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

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

使用 Django 模板:

最简单、最容易的入门方法。您需要的一切都已在 Django 中呈现。让我们看一下这个简单的例子:

views.py

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

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

索引.html

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

Django 模板系统非常强大并且可自定义,如果默认模板引擎不适合您的需求,则可以选择另一个模板引擎,例如Jinja https://github.com/pallets/jinja.

您可以在那里做很多事情,但作为一般建议,所有“计算”内容都不应该存储在模板级别上,因为它会显着增加页面渲染的时间。放置业务逻辑的更好位置是视图,并且大部分数据库工作都在视图上定制经理 https://docs.djangoproject.com/en/3.0/topics/db/managers/.

对于应用程序的动态部分,您可以使用AJAX可能来自JQuery https://jquery.com/图书馆。

使用起来也很简单forms https://docs.djangoproject.com/en/3.0/topics/forms/, Django 默认处理它csrf保护。默认验证者 https://docs.djangoproject.com/en/3.0/ref/forms/validation/ and 模型形式 https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/给你真正的力量。

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

使用REST架构:

上面的例子看起来像这样,尽管有模型视图集 https://www.django-rest-framework.org/api-guide/viewsets/#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)

您可以使用模型序列化器 https://www.django-rest-framework.org/api-guide/serializers/#modelserializer或者编写自己的序列化器。验证过程简单明了:

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

要在网页上显示此数据,您可以使用任何您想要的东西,vanilla javascript 或任何支持当今最流行的 REST 的 javascript 框架:React https://reactjs.org/docs/getting-started.html, Angular https://angular.io/docs, Vue https://vuejs.org/.

With REST您可以将相同的 API 用于您的 Web、移动应用程序等。最终实现一次用遍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建 Django Webapp 前端的“最佳”方法是什么? [关闭] 的相关文章

随机推荐

  • 使用python连接mysql并上传csv

    我是 python 新手 我想使用 mysql connector 和 python 连接到 mysql 我想打开 csv 然后将其上传到 mysql 数据库 我使用 python 版本 3 6 0 我已经尝试过这个 import csv
  • 将 ASP.Net Core 2 (.NET Framework) Web Api 拆分为类库和托管项目是否可能/明智?

    我正在尝试使用 Visual Studio 2017 v15 4 5 将现有的 WCF Web API 针对 NET Framework 4 6 1 移植到 ASP Net Core 2 但在找出组织项目的良好 通用 受支持的方法时遇到困难
  • 父子数据的 xslt 递归模板

    我正在尝试将我的注意力集中在 xslt 上 stackoverflow 帮助中的一些问题 XSLT 模板和递归 https stackoverflow com questions 2835567 xslt templates and rec
  • 如何在 MongoDB 中按 $elemMatch 排序?

    在我的 MongoDB 数据库中 我有一系列产品 每个产品都包含数组中的发布信息 例如 name foo release region GB active Y date ISODate 2012 03 01T00 00 00Z region
  • 将 JSON 发布到 Web API 2 时出错:此资源不支持请求实体的媒体类型“text/plain”

    我有这门课 public class MyClass public MyClass Secret Don t tell me public string Name get set public int Age get set public
  • 生成具有最小距离的随机 x 和 y 坐标

    R中有没有办法生成它们之间距离最小的随机坐标 例如 我想避免什么 x lt c 0 3 9 4 1 8 y lt c 1 4 1 3 9 7 plot x y 这是随机几何中的一个经典问题 空间中完全随机的点 其中落在不相交区域中的点的数量
  • 如何解析字符串并返回嵌套数组?

    我想要一个Python函数 它接受一个字符串 并返回一个数组 其中数组中的每个项目要么是一个字符 要么是另一个此类数组 嵌套数组在输入字符串中以 开头并以 结尾进行标记 因此 该函数的行为如下 1 foo abc a b c 2 foo a
  • Android 中不安全的蓝牙连接

    一位教授向我提出挑战 要求我在 Android 上开发一个小型蓝牙演示应用程序 直到两周前他向我提出这个挑战之前 我对 Android 开发一无所知 一般来说 我对 Java 编程也很陌生 所以我的起点还很远 但不管怎么说 所以我完成了大部
  • mousedown 事件的 if else if 语句

    我的目标是为每个单击的项目显示不同的对话框 我目前有一个设置 我想我可以添加一个 if 语句 如果将 mousedown 放在 div a dialog a 上 否则如果将 mousedown 放在 div b dialog b 等上 我是
  • .NET 正则表达式检查长度和非字母数字字符

    我需要 Regexp 来验证字符串的最小长度为 6 并且它至少包含一个非字母数字字符 例如 eN S u h9YI gt 4j 9YI 4j eN S usdf dfh9YI gt 4j ghffg 9YI 4j 这个运作良好 6 d 但在
  • 使用并行工具箱创建具有有限数量工作人员的任务/作业池(线程池)

    我想使用并行计算工具箱来加速一组相互不依赖的函数调用 为了提高效率 我想使用计时器函数 回调函数在我的函数之一完成执行后继续执行更多函数 我事先不知道哪些函数会更快 所以我不能将我的函数集分成几个池并将它们设置为并行 换句话说 我想要一些并
  • 通过 WCF 服务传递枚举

    我需要在与我的 WCF 服务项目分开的项目中定义一个枚举 我正在创建一个包含枚举和其他数据的对象 当我通过 WCF 服务将对象传递给客户端时 我得到一个未找到的信息 Enum public enum Color Red 1 Blue Gre
  • Terraform 上出现“无效的旧提供商地址”错误

    我正在尝试使用 terraform v0 14 3 部署 bitbucket 管道以在谷歌云中创建资源 运行 terraform 命令后 管道失败并出现以下错误 Error Invalid legacy provider address T
  • 如何防止滑动触发点击?

    I use 触摸滑动 http labs rampinteractive co uk touchSwipe demos 创建可滑动的图像列表 我将滑动事件绑定到图像 同时我还绑定了一个单击事件来打开图像的大版本 我的问题是 如果我滑动 它也
  • 什么是换行转换?

    当您尝试将值从一种类型转换为另一种不兼容的类型时 您会在 C 中收到以下错误 CS0039 无法通过引用转换 装箱转换 拆箱转换 包装转换或 null 类型转换将类型 A 转换为 B 我了解如何潜在地解决此问题 但我的问题是关于转换本身的类
  • Rails 迁移使列为 null => true

    我最初创建了一个表 其中列为 t string email default gt null gt false 要求已更改 现在我需要允许电子邮件为空 如何编写迁移以使 null gt true change column null http
  • 根据向量更改列的类别

    我有 2 个数据框 主要的一个df 另一个数据框tmp它描述了列类型df和新格式应转换哪些列 这是一个可重现的示例 df lt data frame var1 c a b c var2 c 1 2 3 var3 c d e f tmp lt
  • Clojure 的惰性如何与 Java/不纯代码的调用交互?

    今天我们在代码中偶然发现了一个问题 无法回答这个 Clojure 问题 Clojure 是严格还是惰性地评估不纯代码 或对 Java 代码的调用 似乎副作用 惰性序列会导致奇怪的行为 以下是我们所知道的导致这个问题的信息 Clojure 有
  • formfield_for_foreignkey 和内联管理

    我只想展示特定比赛中与球队相关的球员 通常 当我这样做时 它会向我显示数据库中的所有球员 这是我的 models py class InningsCard models Model fixture models ForeignKey Fix
  • 构建 Django Webapp 前端的“最佳”方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 提前致谢 这更像是一个 哲学 问题 而不是直接请求对代码的意见 尽管我非常感谢任何人对代码示例的输入 从我记事起 我就一直是一名 传统 开发人员