首页 > 解决方案 > 运行 Gunicorn 和 Django

问题描述

我不知道如何在 django 中使用 gunicorn。你能给我一些帮助吗?

这就是我使用 django 运行服务器的方式。这是https

python3 manage.py runsslserver xx.8x.x3.x4:443 --certificate /etc/letsencrypt/live/callservicesvps.online/fullchain.pem --key /etc/letsencrypt/live/callserv.com/privkey.pem

在gunicorn文档中提到它必须按如下方式执行:

gunicorn myproject.wsgi

在这里我有两个问题。什么是 myproject.wsgi? 我在哪里可以找到它?因为如果我查看 django 项目所在的目录,我在 wsgi 中找到的唯一内容是一个名为 wsgi.py 的文件

按如下方式运行服务器会给我一个错误

gunicorn /home/proyectdirectory/wsgi.py

如果我输入,它也会给我一个错误:

gunicorn /home/proyectdirectory/wsgi:Some_directory_where_the_proyec_is

标签: djangogunicorn

解决方案


什么是 myproject.wsgi?

myproject.wsgiwsgi.py是您在项目中找到的文件。

[回答结束]


但进一步的解释将清楚为什么会这样..

我想大多数人会查看myproject.wsgi并看到具有扩展文件类型的文件,.wsgi但这仅仅是因为导入的方式modules是用 python 编写的。

在继续解释之前,我想澄清什么是 amodule和 a 。package

什么是模块

来自术语沉重的 python 文档

模块是包含 Python 定义和语句的文件。

简而言之,modulepython 中的 a 只是一个包含任何类型的函数、变量或类等的 python 文件。

什么是包

包只是模块的集合。最简单的例子,一个包含 python 文件的特殊目录。为了告诉 python 一个目录是一个包,它必须有一个__init__.py在其中命名的文件。您会在 django 项目的不同目录中找到其中的一些。这就是他们在那里的原因。




现在,我可以说我想说的是python中模块命名空间的结构。

package.subpackage.module

如果你查看你的wsgi.py文件,你会看到一个从 django 自己的wsgi模块导入的很好的例子。

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project>.settings')

application = get_wsgi_application()

进一步来说

from django.core.wsgi import get_wsgi_application

如果您查看django包装内部,您可以看到它是如何工作的。 django(包) core(子包) wsgi(模块)

wsgi 应用程序导入的位置



请记住,该命令gunicorn myproject.wsgi应该在 django 项目的基本目录中运行。我一直记得这是包含manage.py文件的目录。那就是如何以这种方式使用模块命名空间gunicorn找到文件。毕竟是用python编写的。wsgi.pygunicorn

gunicorn /home/proyectdirectory/wsgi.py会出错,因为 python 模块导入不包含/,即使您尝试过gunicorn home.proyectdirectory.wsgihome 和 proyectdirectory 也不是 python 包。




现在希望这是有道理的:

“如果gunicorn myproject.wsgi是指wsgi.py文件,为什么不直接放gunicorn myproject.wsgi.py?”

您不能.py添加扩展名,因为这将引用wsgi子包中带有文件名的模块py.py


推荐阅读