Django - mysite.wsgi文件不存在但uWSGI能正常工作。为什么?

7

在使用uWSGI(我正在与Django一起使用)时,它的工作原理有些神奇,但我却不太理解。

我有一个如下的测试Django项目:

(uwsgi-tutorial)[root@localhost mysite]# tree
.
|-- db.sqlite3
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- __pycache__
|   |   |-- __init__.cpython-34.pyc
|   |   |-- settings.cpython-34.pyc
|   |   |-- urls.cpython-34.pyc
|   |   `-- wsgi.cpython-34.pyc
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- test.py

在这个文件夹里,我运行了 uwsgi --http :8000 --module mysite.wsgi。程序可以正常运行。
为什么呢?
也就是说,并不存在 mysite.wsgi 这个文件,但是却有 mysite/wsgi.py。如果我运行 uwsgi --http :8000 --module mysite/wsgi.py,程序会出现错误(HTTP 500)。
如果我将 mysite.wsgi 改成其他的,那么 uWSGI 就无法加载模块。所以看起来,模块名必须与 Django 项目名称匹配,并且必须添加 .wsgi 才能启用“魔法”。
大多数 uWSGI+Django 指南,包括官方的Django 1.8 文档 都会说一些类似于: module: 使用的 WSGI 模块 - 可能startproject 创建的mysite.wsgi 模块。 或者 modulemysite.wsgi: 加载指定的 wsgi 模块。 我不理解它的工作原理,以及它为什么能这样工作。有谁能够解释一下吗?谢谢!
1个回答

7
玩了一下后,我似乎明白了实际发生了什么- module是一个Python模块参考,就像Python中的 import 语句一样。
我认为uWSGI是通用的而不与Python绑定,那么为什么它会期望Python模块引用呢?看起来uWSGI最初是为Python开发的。其余选项可以通过--plugins和自定义构建获得。因此,当我通过 pip install uwsgi 安装uWSGI时,它是使用默认设置编译的,这意味着它期望Python模块引用。至少现在我是这样理解的。
因此,例如,我可以将 mysite / 文件夹中的 wsgi.py 重命名为 socool.py ,然后通过uswgi --http:8000 --module mysite.socool 运行我的设置。
如果有人可以使我的回答更加清晰,那就太好了。 更新-01: 至少在Arch Linux发行版中,通过 pacman -S uwsgi 安装的 uwsgi 系统包与使用 pip install uwsgi 安装的Python包之间存在差异。
如果安装了系统包,则它不会立即具有Python功能。例如,运行 uwsgi --module ... 将产生错误,说明不支持 module 选项。
仅在安装了 uwsgi-plugin-python 之后,使用uWSGI系统包运行Python模块才是可能的。此外,必须指定要使用的插件- uwsgi --plugins python ...。
[root@localhost ~]# uwsgi --help | grep module | wc -l
0
[root@localhost ~]# uwsgi --plugins python --help | grep module | wc -l
23

突然发现在帮助输出中出现了额外的选项,现在还支持 --module 选项。希望这能对像我一样不熟悉uWSGI的人有所帮助。

1
WSGI是Python的标准。uWSGI是该标准的一种实现,随后被扩展到其他语言。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接