【问题标题】:How do you actually use a reusable django app in a project?您如何在项目中实际使用可重用的 django 应用程序?
【发布时间】:2014-03-15 17:34:08
【问题描述】:

这个问题困扰了我好几天,我也试过在很多地方寻求建议,但似乎没有人能清楚地回答它,甚至没有提供答案的参考。

我也尝试过搜索教程,但我找不到任何类型的教程来解释如何使用可重用的第三方 django 应用程序(大多数教程解释了如何编写它们,没有解释如何使用它们) .

另外,我也看过这里:

How to re-use a reusable app in Django - 它没有解释如何在项目本身中实际使用它

这里:

How to bind multiple reusable Django apps together? - aquaplanet 的回答有点道理,但我想我会问这个问题来解决我在试图理解这一点时面临的心理障碍。


为了更好地解释这一点,让我举个例子(注意,这不是我实际构建的东西)。

我正在创建一个类似于 Reddit 的项目。我将拥有用户、链接和投票/积分。基于这个粗略的例子,我将要重用 3 个(任意)第三方应用程序:用户、投票/积分和链接。

我决定将它们中的每一个都用作任何其他 python 包(这意味着它们将被视为一个包,并且不应触及它们的任何代码)[这种方法真的有效吗?还是必须能够编辑第三方应用才能构建项目??)

现在我的项目中有这些应用程序,我将使用一个主应用程序来处理所有模板内容(这意味着我在前端看到的所有内容都将在一个应用程序中)。

然后,我将使用同一个主应用程序进行自定义逻辑(在 views.py 中),或者我将在不同应用程序之间分解该逻辑(但仍将使用单个仅前端应用程序)。

从以上 3 段来看,这种结构是否适用(或者可以工作)?


现在让我们说这个结构适用,我正在为前端和自定义逻辑使用一个主应用程序。

我会在 models.py 中写什么?我如何将 3 个可重用应用程序中的内容集成到 main models.py 文件中?

如何引用views.py 中的可重用应用程序?让我们以 contrib.auth 为例

有了这个内置的应用程序,我会写:

from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def user_logout(request):
    logout(request)
    return redirect('/home/')

虽然上面的代码很简单,但是对于任何可重用的应用程序来说,基本上都是这样吗?

我的问题很长,但我认为这个可重用应用程序问题是很多开发人员对自己不太清楚的问题,也许这个答案会帮助很多其他听说过可重用应用程序承诺的人,但不明白如何实际使用它们。

【问题讨论】:

  • 你做到了吗?你想和我们分享一下吗。。我也有同样的情况
  • 我建议您尝试像使用函数一样使用它。例如。如果您正在使用函数 X(var1, var2),则在 mainapp.py 中导入模块/库,然后通过基本上传递您要传递的变量并让函数执行它来使用 X(var1, var2) (并且可能返回一些东西)。我想我最终从抽象的角度看到了它,其中代码“写在其他地方”,而您正在使用主文件中“其他地方”的函数等,而无需再次重写所有相同的功能。跨度>

标签: python django code-reuse reusability django-apps


【解决方案1】:

TL;DR:

不,这取决于...

一些(非常)常见的可重复使用的应用程序

...这些都是可重用的 Django 应用程序,碰巧随 Django 一起提供(在某些时候大多数都没有)

好的,其他一些不随 Django 提供的可重用应用程序:

这些都是真正可重复使用的应用程序,仅此而已。像这样的应用还有很多。

他们是怎么做到的?

在我看来,您的问题更像是“我如何构建可重用的应用程序”,然后是“如何使用它们”。实际上,使用它们因应用程序而异,因为它们做的事情非常不同。只有一条规则:RTFM 也没有办法。

他们通常依赖以下一项或多项:

  • settings.py 中的附加值
  • 添加(通常是一个include 语句)到urls.py
  • 模型、表单、字段、视图等的子类化和/或混合。
  • 模板标签和/或过滤器
  • 管理命令
  • ...

这些都是您的应用可以为其他应用提供功能的强大方式。制作可重用应用程序没有秘诀(AFAIK),因为需要考虑很多不同的场景。这完全取决于您的应用程序应该做什么。

可重复使用的应用程序提供功能

我认为重要的是不要将可重复使用的应用程序视为与其他应用程序“一起工作”,而是要认识到它们“提供功能”。所提供功能的详细信息应指示目标开发人员应该使用您的库的方式。

并非所有东西都可以重复使用

显然,尽管许多应用程序“原则上”可以重复使用,但这样做通常没有什么意义,因为将事物组合在一起(并使它们“一起工作”)更快。

【讨论】:

  • @Joe 我当然不是故意粗鲁的。事实上,我正在重新阅读答案并且找不到您可能认为粗鲁的内容,除了公认的 RTFM 首字母缩写词,我曾经确认一个观点(使用第三个的唯一方法派对可重复使用的应用程序),而不是冒犯任何人。但如果我真的冒犯了你,我很抱歉。是的,我没有详细回答您的特定问题,因为我认为您对可重用应用程序的看法可能会受益于退后一步并从我看来有点不同的角度看待问题。
  • 也许解决这个问题的唯一方法是不断尝试直到它起作用。这就是我要做的。关于阅读文档,他们缺乏这方面的信息,但这没关系。根据您的道歉,谢谢您,一切都很好。我只是觉得 RTFM 不合适,因为我不先搜索就不会问关于 SO 的问题。
【解决方案2】:

我不确定你为什么认为你需要一个用于“前端”东西的主应用程序。可重用应用程序的重点是它可以处理所有事情,您只需添加(通常)单个 URL 以包含应用程序的 urls.py,以及您自己的模板和所需的样式。

而且您当然不需要将应用程序的视图包装在您自己的视图中,除非您特别想覆盖某些功能。

我完全不明白你关于模型的问题。没有“主”模型文件之类的东西,使用可重用应用的模型与使用您自己的任何应用中的模型一样。

通常您不会编辑第三方应用程序,这会使集成更新变得非常困难。只需使用 pip 在您的 virtualenv 中安装应用程序(当然,您正在使用 virtualenv!),它将把它放在 lib 目录中,您可以像任何其他应用程序一样引用它。确保将其添加到 INSTALLED_APPS。

【讨论】:

  • “我不知道你为什么认为你需要一个用于“前端”东西的主应用程序。” .我认为这可能可行的原因是您希望单个前端与单个页面上的多个应用程序交互的情况。就像您正在为新闻门户创建主页一样,您可能有一个主要内容区域和一个投票投票。 1 页中有 2 个不同的应用程序。这就是为什么我认为单个前端可以处理所有事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2020-05-10
  • 2010-10-08
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多