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

时间:2019-12-13 06:23:37

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

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

只要我记得我就一直是“传统”开发人员,现在我是专业的数据科学家。话虽如此,我从未真正接触过的一个领域是Web开发。

对于我正在从事的项目,我需要构建(并在一定程度上加快时间)一个外观良好的Web应用程序,该应用程序的功能与Wiki网站有些相似(在这里不能使用MediaWiki之类的现有代码库,因此,假设一切都必须从头开始。

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

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

这里剩下的最重要的部分显然是前端。我试图向几个朋友和熟人寻求建议,并指出了Bootstrap的方向。

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

我在Django docs上看到了不涉及任何Javascript的示例(看起来,HTML页面可以通过最小的提升直接与数据库进行交互,只需使用一个非常简单的“ insert-placeholder-这里的逻辑,因为我已经通过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的人……前端对我来说完全陌生。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

一旦您要在前端中包含动态部分,就需要使用Javascript。为了加快开发速度,我强烈建议使用VueReactAngular之类的框架。他们有数十种工具可用于项目中的特定需求。另外,在使用Javascript时,您可能还会研究jQuery

我目前正在自己​​构建Django Web应用程序(开始于3个月前)。我经常使用Javascript来处理Django呈现的模板。

为什么Django是您的正确选择

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

  • 您无需构建用户管理系统(内置 django-admin
  • Django轨道中将包含很多前端必需的业务逻辑
  • 无需担心JSON。您只需使用python对象从数据库中获取数据,然后在前端中使用该数据。如果出于某种原因在某个时候json是更好的选择,则只需使用Python序列化器对其进行操作即可。
  • 使用例如,部署/发布基于Django的应用程序非常容易。 digitalocean.com或heroku.com

由于这是一个广泛的问题,希望我能为您提供一些有关如何进行开发的提示。但是,请随时对这篇文章发表评论,以获取更多疑问。

为了让您有一个简短的感觉,我将使用基本的HTML,CSS和Javascript以及Django作为基于python的后端,附加一些当前项目的片段。

enter image description here enter image description here enter image description here

答案 1 :(得分: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上数据库的大部分工作。

对于应用程序的动态部分,可以使用JQuery库中的AJAX

使用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,您可以为Web,移动应用程序等使用相同的API。最后,实现一次随处使用。

相关问题