将django项目及其依赖项打包为独立的“产品”

时间:2010-12-15 16:19:57

标签: python django packaging

我使用Django作为框架制作了一个小小的“应用程序”。这是一个无法部署到服务器但在计算机上本地运行的应用程序。因此runserver.py工作得很好。

作为开发人员,我很乐意启动终端,运行python manage.py runserver.py并使用它。但我有一些想要使用它的Mac OS X和Windows朋友。他们没有virtualenv,git和一切设置。有什么方法我可以把它打包成一个独立的有点产品吗?当然它取决于系统上安装的Python,但是可以用django和所有东西打包virtualenv,然后将它复制到另一个系统并使其工作?

甚至可能在某种deamon模式下运行runserver?

7 个答案:

答案 0 :(得分:2)

是的,你可以打包它。 Django可能不是最容易实现的,但其他框架的原则是相同的。您需要制作一个安装程序来安装您需要的所有内容。对于不同的平台,安装程序需要有所不同。例如Windows,Ubuntu,OS X等。这也意味着每个平台的答案明显不同,只有一半的答案取决于Django。 : - (

这有点糟透了,但这就是生活。没有很好的平台独立方式为最终用户安装软件。

答案 1 :(得分:2)

使用setuptools和easy_install。

以下是介绍性article

答案 2 :(得分:1)

有几种方法可以做到这一点。我认为你正在寻找更多的构建工具(包括包装),而不仅仅是Python解决方案。以下是我过去使用的一对夫妇:

zc.buildout:用于构建和部署Python模块和应用程序,但也可以通过一些按摩来使用其他语言。易于使用(用于构建工具)。

make:软件构建经典。适用于几乎所有语言,但有点过时且难以学习第一个定时器。

答案 3 :(得分:1)

我还没有找到完美的解决方案。

我目前的方法是提供一个泊坞窗图像,因为这对每个人来说都非常容易使用。这包括alpine基本图像,因为它很小,python + django和应用程序本身。你还可以包括像nginx这样的网络服务器和像uwsgi或gunicorn这样的app服务器,并为它公开一个端口。

因此,最终您的用户只需运行容器并访问http://localhost:9000/下的网络应用或类似内容。 这非常方便,也是我尝试使用我发现的应用程序的首选方式。

“正确”的方法是为您定位的每个操作系统和发行版构建一个包,以及一个简单的zip包,这样人们也可以手动安装该应用程序。

要构建我建议使用fpm的软件包。使用原生工具完成包装的大部分痛苦。然后,这些软件包将依赖于适当的应用程序服务器,如uwsgi或gunicorn。

最后,您可以像apt install your-package一样安装它,它将取决于python-djangouwsgi等。

对于位置以及将所有文件放在包中的位置,每个发行版都有自己的方法。我更喜欢将所有内容置于/usr/share/webapps/myapp/下,并将配置置于/etc/myapp/config.py之下或类似的内容。

对于Windows和macOS,有PyInstaller之类的解决方案。我还没有用过django应用程序,但它应该可以完成这项工作。您也应该在其中包含类似uwsgi的应用服务器。

在generel中,您不希望在生产环境中运行django dev服务器。所以在打包时请记住这一点。

我希望有所帮助。

答案 4 :(得分:1)

适用于Linux的新snap软件包管理器应完全适合该任务。它提供了到目前为止对Python应用程序来说是非常痛苦的所有解决方案(依赖项,解释器等),同时避免了Docker的复杂性。

答案 5 :(得分:0)

这些天Docker可能是一个很好的答案

用户首先需要install Docker,但它可以在Windows和OSX以及Linux上运行。

您的Dockerfile负责安装所有依赖项,然后运行devserver(或者您甚至可以在容器中运行正确的Web服务器)

答案 6 :(得分:0)

这不太难。首先,您需要将所有文件添加到名称空间中,并添加setup.pyLICENSE.gitignore等。您也打包应用程序,这是最好的。

├── django-project
│   │   ├── example-dir
|   |   |   ├── project_name
|   |   |   |    ├── project_name
|   |   |   |    ├── mangage.py
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── requirements.txt
│   │   └── setup.py

和setup.py像这样:

setuptools.setup(
    name="example-pkg"
    version="0.0.1",
    ...
    packages=setuptools.find_namespace_packages(include=['example-dir.*']),
    namespace_packages=['example-dir'],
)

我建议您先阅读这些文档。

https://docs.djangoproject.com/en/3.0/intro/reusable-apps/

https://packaging.python.org/tutorials/packaging-projects/

https://packaging.python.org/guides/packaging-namespace-packages/