Django - mysite.wsgi - 文件不存在,但uWSGI工作.怎么样?

Dmi*_*gin 4 python django uwsgi

关于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
Run Code Online (Sandbox Code Playgroud)

在这个文件夹中我运行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模块

要么

模块mysite.wsgi:加载指定的wsgi模块

我不明白它是如何工作的以及为什么它以这种方式工作.谁能解释一下?:) 提前致谢!

Dmi*_*gin 6

在玩了一下后,我似乎已经理解了真正发生的事情 - 模块是一个Python模块引用,就像Python中的import语句一样.

我认为uWSGI是一个普遍的东西,并没有绑定到Python,所以为什么它会期望Python模块引用?看起来uWSGI最初是为Python开发的.其余选项可通过--plugins和自定义构建获得.因此,当我通过pip安装 uWSGI时,uwsgi 是使用默认设置编译的,这意味着它需要Python模块参考.至少这是我现在理解的方式.

这样我就可以,例如,重命名wsgi.py内部的mysite /文件夹放到socool.py,并通过运行我的设置uswgi --http :8000 --module mysite.socool.

如果有人能够为我的回复增加清晰度,那就太棒了.

UPDATE-01:

至少在Arch Linux发行版中,通过pacman -S uwsgi安装的uwsgi系统软件包与安装了pip install uwsgi的Python软件包之间存在差异.

如果安装了系统软件包,则它不具备开箱即用的Python功能.例如,运行uwsgi --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
Run Code Online (Sandbox Code Playgroud)

突然发现帮助输出中出现了额外的选项,现在支持--module.

希望这能帮助那些不熟悉uWSGI的人.