【问题标题】:Various issues running gunicorn with django app使用 django 应用程序运行 gunicorn 的各种问题
【发布时间】:2019-11-22 16:15:53
【问题描述】:

我是 Django 新手。试图让我的应用程序在 Nginx+gunicorn 下运行,但遇到了一些问题。如果有人有一些见解,我将不胜感激。我在 google 上找到了一些可以尝试的东西,但 gunicorn 似乎仍然很糟糕。

1) 我已经将我的 Django 项目从我的开发箱同步到 Nginx 主机。如果我尝试使用开发服务器启动,除非我使用 Python 3,否则它不起作用。我搞砸了什么?

我搜索了下面的...from exec 错误,发现如果以python3 为前缀,我可以让它工作。似乎是解决更大问题的一种解决方法,因为在我一直关注的任何教程中都没有提到这种启动方式。

这个炸弹:

(venv) $ python manage.py runserver 127.0.0.1:8777
  File "manage.py", line 16
    ) from exc
         ^
SyntaxError: invalid syntax

这行得通:

(venv) $ python3 manage.py runserver 127.0.0.1:8777
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 22, 2019 - 15:46:59
Django version 2.2.7, using settings 'auth.settings'
Starting development server at http://127.0.0.1:8777/
Quit the server with CONTROL-C.
[22/Nov/2019 15:47:27] "GET /accounts/login/ HTTP/1.0" 200 1229
^C(venv) $ 

2) 上面,如果使用开发服务器,我可以在 Nginx 上运行该应用程序。但是,如果通过gunicorn 执行,事情就会分崩离析。怎么来的? Python 说它cannot import name path,但它似乎在开发服务器上运行良好(登录页面也正确出现在浏览器中)所以我有点不知道问题是什么。

(venv) $ gunicorn --bind 127.0.0.1:8777 auth.wsgi
[2019-11-22 09:43:45 +0000] [2239] [INFO] Starting gunicorn 19.7.1
[2019-11-22 09:43:45 +0000] [2239] [INFO] Listening at: http://127.0.0.1:8777 (2239)
[2019-11-22 09:43:45 +0000] [2239] [INFO] Using worker: sync
[2019-11-22 09:43:45 +0000] [2243] [INFO] Booting worker with pid: 2243
Internal Server Error: /accounts/login/
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line 172, in _get_response
    resolver_match = resolver.resolve(request.path_info)
  File "/usr/lib/python2.7/dist-packages/django/urls/resolvers.py", line 364, in resolve
    for pattern in self.url_patterns:
  File "/usr/lib/python2.7/dist-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/python2.7/dist-packages/django/urls/resolvers.py", line 407, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/lib/python2.7/dist-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/python2.7/dist-packages/django/urls/resolvers.py", line 400, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/var/www/django/auth2/auth/urls.py", line 17, in <module>
    from django.urls import path, include
ImportError: cannot import name path
[2019-11-22 09:43:58 +0000] [2239] [INFO] Handling signal: winch
[2019-11-22 09:43:58 +0000] [2239] [INFO] Handling signal: winch
^C[2019-11-22 09:45:06 +0000] [2239] [INFO] Handling signal: int
[2019-11-22 15:45:06 +0000] [2243] [INFO] Worker exiting (pid: 2243)
[2019-11-22 09:45:06 +0000] [2239] [INFO] Shutting down: Master


(venv) $ pip freeze
asn1crypto==0.24.0
backports.os==0.1.1
configparser==4.0.2
contextlib2==0.6.0.post1
cryptography==2.1.4
Django==1.11.26
enum34==1.1.6
future==0.18.2
gunicorn==19.9.0
idna==2.6
importlib-metadata==0.23
ipaddress==1.0.17
keyring==10.6.0
keyrings.alt==3.0
more-itertools==5.0.0
path.py==11.5.2
pathlib2==2.3.5
psycopg2-binary==2.8.4
pycrypto==2.6.1
pygobject==3.26.1
python-apt==1.6.4
pytz==2019.3
pyxdg==0.25
scandir==1.10.0
SecretStorage==2.3.1
six==1.13.0
sqlparse==0.2.4
zipp==0.6.0
(venv) $ 

【问题讨论】:

  • 我不明白,当使用runserver 运行时,它说 Django 版本是 2.2(需要 python 3.5 或更高版本),但是在你的 virtualenv 中你有 Django 1.11(并且在 python 上运行2.7)。您的本地环境是什么,您的项目实际需要什么?
  • 在我看来,您的项目是为 python 3.x 和 Django 2.2 编写的,因为您使用的是 path 概念。因此,在您的生产机器上,您的 virtualenv 是错误的。您需要使用 python 3.6 创建一个 venv 并重新安装所有依赖项,包括 django 2.2 和 gunicorn。
  • 谢谢!删除 venv 目录并重新创建它解决了这个问题。如果您想重新发布作为答案,我可以奖励您的互联网积分;)
  • 我宁愿关闭这个问题,因为这对其他人并没有真正的帮助。这是一个无法再重现的问题。但是,如果您愿意保留它,我会添加我的答案。
  • ) from exc 错误确实在谷歌上有一些点击,只是没有任何有效的答案。我认为这对于任何搜索这个问题的人都会有一些好处,他们可能会搞砸他们的 python 环境。第一次学习时很容易做到。

标签: python django nginx gunicorn


【解决方案1】:

您需要确保用于启动 gunicorn 的 virtualenv 与您在本地创建的环境相匹配。

正如您的错误跟踪所示,您的 venv 是使用 python 2.7 创建的(您的 pip freeze 显示它安装了 Django 1.11)。

但是您的项目看起来是在设置 Django 2.2 时考虑的(它使用 path)和 python 3.x。这也是您执行runserver 时正在运行的内容。

所以你应该使用 python3 创建一个新的 virtualenv 并重新安装所有依赖项,包括 Django 2.2 和 gunicorn。

【讨论】:

猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2015-01-07
  • 2014-01-18
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多