使用Waitress托管Django应用程序

11

我想在我的Ubuntu VPS上托管一个Django应用程序。我已经安装了Python,Django和Waitress,并移动了目录。

我查看了Waitress网站(http://docs.pylonsproject.org/projects/waitress/en/latest/),他们说要这样使用:

from waitress import serve
serve(wsgiapp, host='5.5.5.5', port=8080)

我应该将我的应用程序名称放在'wsiapp'的位置吗?我需要在顶级Django项目目录中运行吗?


尝试将以下内容放入您的 wsgi.py 文件中,而不是使用 wsiapp,请改用 application - Victor Castillo Torres
我尝试了一下,它启动了两个服务器实例。 - chrislarson
2个回答

24

在Django 1.9和Waitress 0.9.0上进行了测试

你可以通过在你的Django项目根目录中创建一个脚本(例如server.py),并从wsgi.py模块导入应用程序变量,来使用waitress与你的Django应用程序:

yourdjangoproject 项目根目录结构

├── manage.py
├── server.py
├── yourdjangoproject
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py

wsgi.py更新于2021年1月,含静态文件服务

这是Django中 wsgi.py 的默认代码:

import os
    
from django.core.wsgi import get_wsgi_application
    
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yourdjangoproject.settings")
    
application = get_wsgi_application()
如果您需要提供静态文件服务,可以编辑wsgi.py并使用类似于Whitenoisedj-static这样的工具来处理静态资源。
import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yourdjangoproject.settings")

"""
YOU ONLY NEED ONE OF THESE.
Choose middleware to serve static files. 
WhiteNoise seems to be the go-to but I've used dj-static 
successfully in many production applications.
"""

# If using WhiteNoise:
from whitenoise import WhiteNoise
application = WhiteNoise(get_wsgi_application())

# If using dj-static:
from dj_static import Cling
application = Cling(get_wsgi_application())

server.py

from waitress import serve
    
from yourdjangoproject.wsgi import application
    
if __name__ == '__main__':
    serve(application, port='8000')

使用方法

现在你可以运行$ python server.py


静态文件无法访问,我正在使用 Django 2.2.6 和 Waitress 1.3.1,有什么问题吗?我正在使用 Jinja 模板。使用 python manage.py runserver 时静态文件正常工作。 - Irfan Ashraf
@IrfanAshraf 我已更新此答案,包括有关提供静态文件的建议。 - aboutaaron
1
@IrfanAshraf 你需要在Django设置中添加Whitenoise中间件。 - elsadek

9
我使用bash脚本而不是Python调用成功地使它工作。我创建了一个名为"startserver.sh"的脚本,其中包含以下内容(将yourprojectname替换为您的项目名称):
#!/bin/bash
waitress-serve --port=80 yourprojectname.wsgi:application

我将其放置在顶级的Django项目目录中。
更改拥有者的执行权限:
chmod 700 startserver.sh

然后我只需在服务器上执行脚本:

sudo ./startserver.sh

看起来那似乎完全正常。


太好了...非常有用,你有没有想过以守护进程模式运行waitress的方法? - CrazyGeek
谢谢......我正在生产中使用它,因为它很轻量级,所以请问您如何提供静态文件? - CrazyGeek
1
根据我所阅读到的,如果你使用的是VPS,那么应该通过更快的机制(例如Apache/Nginx)来提供静态文件;如果你正在使用像Heroku这样的平台,则可能需要使用S3。@CrazyGeek - Rob Grant

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