【问题标题】:How can I call a Django app from another Python app?如何从另一个 Python 应用程序调用 Django 应用程序?
【发布时间】:2020-08-07 04:29:33
【问题描述】:

在标准设置中,Django 应用程序由 WSGI 服务器(如 gunicornmod_wsgi)调用以响应 HTTP 请求,用户级别的入口点是 django 视图。
我可以创建一个自定义入口点来调用 Django 应用程序吗?如果是这样,我如何正确加载 Django 应用程序?

编辑:查看由 startproject 命令创建的 wsgi.py 文件中的入口点,我看到 1)它设置 DJANGO_SETTINGS_MODULE var 并调用 get_wsgi_application,其中 2)调用 django.setup () 和 3) 返回将由 WSGI 服务器调用的 WSGI 应用程序。运行 django 的管理命令时也会发生 1 和 2。 执行 1 和 2 并正确加载 Django 应用程序就足够了吗? 在 3 时,django 的中间件已加载,但它们不兼容,因为我不会进行 HTTP 调用(但 Django 应用程序当然会响应来自其他客户端的 HTTP 请求)。

【问题讨论】:

  • 这个问题背后的原因是什么,WSGI是python标准python.org/dev/peps/pep-3333
  • @iklinac 我知道。我需要在不使用 HTTP 请求的情况下调用 Django。例如,Gunicorn 不知道使用哪个 Web 框架来构建它调用的 Web 应用程序。这些应用程序只需要提供一个与 WSGI 兼容的入口点。 WSGI 是一种将 Python Web 应用程序与 Web 服务器集成的 API 规范,允许 Web 应用程序(以及用于实现它的框架)独立于 Web 服务器。该集成由 WSGI 中间件(WSGI 服务器)完成,该中间件接收 Web 服务器转发的 HTTP 请求,进行适当的适配并调用 Web 应用程序。

标签: python django interface integration calling-convention


【解决方案1】:

做 1 和 2 并有一个正确加载的 Django 应用程序就足够了吗?


查看 Django 的源代码和this documentation,我想出了如何加载 Django 应用程序。以 Django 的intro tutorial 为例,我可以加载民意调查应用程序并以这种方式调用它的index view

# Let Django knows where the project's settings is.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

from django.apps import apps
# Load the needed apps
apps.populate(installed_apps=['polls.apps.PollsConfig'])
# Make sure the above apps were loaded
apps.check_apps_ready()
apps.check_models_ready()

# Call it
from polls.views import index
# Here index view is decoupled from Django's HTTP interface, so in polls/views.py you have:
# def index():
#     return Question.objects.order_by('-pub_date')[:5]
print('index view: ' + str(index()))

它不加载任何 Django 中间件(它们与 HTTP 接口耦合)。 polls 应用不依赖其他已安装的应用,否则所有依赖项也应加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多