在开发Django项目的过程中,有一些app是经常需要用到的,比如用户注册和登录app。你每次开发一个新项目,就重新写一个用户系统?不需要的,直接重用先前写好的就行了。有时候,我们需要将自己写的app分发给同事,分享给朋友,或者在互联网上发布,让全世界的用户使用。比如发布到Django官方的app仓库:https://djangopackages.org/
。这都需要打包、分发和重用我们的app。
Django的子系统重用是基于app级别的。也就是一个项目可以包含多个互相独立的app,不同项目之间没有关系。但是,一个app可以属于多个项目,可以在任何地点、任何时间和任何项目中被重用。
一个app要能被重用,首先在设计和开发它的阶段,就要考虑后期重用的问题。你需要将该app运行时所必须的全部文件、资源、配置、数据等等都封装在一个整体内。如果有任何一部分重要的内容,放置在app之外,比如最初项目的其它目录下,都将引起重用失败。
下面以一个具体例子,来介绍如何操作。首先,假设有这么一个项目结构:
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py polls/ __init__.py admin.py migrations/ __init__.py 0001_initial.py models.py static/ polls/ images/ background.gif style.css templates/ polls/ detail.html index.html results.html tests.py urls.py views.py templates/ admin/ base_site.html
Django需要使用setuptools和pip来打包我们的app,所以请先安装他们。对于当前的Python3.6,自带了这两个工具,不需要额外安装。如果真没有,参考下面的网址,进行安装:
https://pypi.python.org/pypi/setuptools https://pypi.python.org/pypi/pip
打包的本质,就是封装你的源代码和文件成为一种新的数据包装格式,有利于传输、分发和安装。在Django中打包一个app只需要下面八个步骤:
在你的Django项目目录外面,为polls应用,准备一个父目录,这里取名django-polls
。
额外提醒:
为你的app选择一个合适的名字:在取名前,去PyPi搜索一下是否有重名或冲突的app(包)已经存在。建议给app的名字加上“django-”的前缀。名字中最后一个圆点的后面部分在INSTALLED_APPS
中一定要独一无二,不能和任何Django的contrib packages
中的app重名,例如auth、admin、messages等等。
将polls目录中的所有内容拷贝到django-polls
目录内。
创建一个说明文档django-polls/README.rst
,写入下面的内容:
===== Polls ===== Polls is a simple Django app to conduct Web-based polls. For each question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. Quick start ----------- 1. Add "polls" to your INSTALLED_APPS setting like this:: INSTALLED_APPS = [ ... 'polls', ] 2. Include the polls URLconf in your project urls.py like this:: url(r'^polls/', include('polls.urls')), 3. Run `python manage.py migrate` to create the polls models. 4. Start the development server and visit http://127.0.0.1:8000/admin/ to create a poll (you'll need the Admin app enabled). 5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
这其实是一个纯文本文件,内容和格式完全自由,但核心要点是注明你的app功能和简单的使用方法。
创建一个django-polls/LICENSE
版权申明文件。大多数Django相关的app都基于BSD版权。
创建一个django-polls/setup.py
文件,包含了编译和安装app的配置细节。这种配置脚本的具体语法,请前往setuptools的官方文档获取详细的教程。下面是一个范例,大多数情况下,你在此基础上改改就可以了:
import os from setuptools import find_packages, setup with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: README = readme.read() # allow setup.py to be run from any path os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-polls', version='0.1', packages=find_packages(), include_package_data=True, license='BSD License', # example license description='A simple Django app to conduct Web-based polls.', long_description=README, url='https://www.example.com/', author='Your Name', author_email='yourname@example.com', classifiers=[ 'Environment :: Web Environment', 'Framework :: Django', 'Framework :: Django :: X.Y', # replace "X.Y" as appropriate 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', # example license 'Operating System :: OS Independent', 'Programming Language :: Python', # Replace these appropriately if you are stuck on Python 2. 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', ], )
例子中的配置项看起来有点复杂,实际简单得不要不要的。耐心点,就完全不是问题。
默认情况下,只有Python的模块和包会被打包进我们的app内。为了包含一些其它的文件,比如静态文件、templates模板等非Python语言编写的文件,需要创建一个django-polls/MANIFEST.in
文件,并写入下面的内容:
include LICENSE include README.rst recursive-include polls/static * recursive-include polls/templates *
该步骤可选,但是强烈推荐将详细的说明文档一起打包。创建一个空的目录django-polls/docs
,用于放置app相关的所有文档。同时不要忘了,在django-polls/MANIFEST.in
文件内写入一行recursive-include docs *
。需要注意的是,如果docs目录是空的,那么它不会被打包进去。
在django-polls
目录内,运行python setup.py sdist
命令。这将会创建一个dist目录,并生成django-polls-0.1.tar.gz
打包文件。
八个步骤完成了,我们的app也就打包好了。
实际使用时,我们只需要拿着django-polls-0.1.tar.gz
这个文件就可以了。
在安装包的时候,最好是以个人用户的身份安装,而不是全系统范围的身份。这样可以有效减少给别的用户带去的影响或被别的用户影响。当然,最好的方式是在virtualenv环境,这种类似隔离的沙盒环境中使用(此时,不需要--user
选项)。
安装:
pip install --user django-polls-0.1.tar.gz
在windows中使用--user
选项会将文件安装到你的用户目录,而不是python目录中,所以建议不使用这个选项。另外,windows下使用cmd命令行时候,记得使用管理员权限打开。
在虚拟环境中使用pip安装的时候,一定要注意pip和Python的对应关系,所有的重点都是,你必须确保包被安装在了正确的位置。
最后需要提醒的是,这种方式安装后,polls这个app的文件会放在Python环境的site-packages中,而不是我们认为的项目中。我们可以import polls,可以在settings中注册‘polls’,但要修改polls中的源码,则需要去site-packages中。
安装成功后,在当前Django项目的INSTALLED_APPS
设置中注册,然后启动服务器,就可以使用这个app了。这个过程中,你可能还需要配置urls、makemigrations、migrate、创建数据实例等动作。
卸载:
pip uninstall django-polls
可以通过下面的方式发布你的app:
在https://packaging.python.org/distributing/#uploading-your-project-to-pypi中有如何上传到PyPI的教程。
你好,博主。请问django-polls/LICENSE版权申明文件是什么?要怎么生成啊?
https://docs.djangoproject.com/zh-hans/2.0/intro/reusable-apps/