可能是最简单的重用Django app的方法

博主     2018年01月09日    分类: Django   阅读:9969     评论:2

在开发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

注意:

例子中的polls模块,将自己运行时所需的models、admin、migrations、templates、tests、urls和views,全都编排在了polls目录下。这是该app可以被重用的先决基础。

Django需要使用setuptools和pip来打包我们的app,所以请先安装他们。对于当前的Python3.6,自带了这两个工具,不需要额外安装。如果真没有,参考下面的网址,进行安装:

https://pypi.python.org/pypi/setuptools
https://pypi.python.org/pypi/pip

一、 打包app

打包的本质,就是封装你的源代码和文件成为一种新的数据包装格式,有利于传输、分发和安装。在Django中打包一个app只需要下面八个步骤:

1. 文件准备

在你的Django项目目录外面,为polls应用,准备一个父目录,这里取名django-polls

额外提醒:

为你的app选择一个合适的名字:在取名前,去PyPi搜索一下是否有重名或冲突的app(包)已经存在。建议给app的名字加上“django-”的前缀。名字中最后一个圆点的后面部分在INSTALLED_APPS中一定要独一无二,不能和任何Django的contrib packages中的app重名,例如auth、admin、messages等等。

2. 拷贝文件

将polls目录中的所有内容拷贝到django-polls目录内。

3. 创建说明文档

创建一个说明文档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功能和简单的使用方法。

4. 添加授权声明

创建一个django-polls/LICENSE版权申明文件。大多数Django相关的app都基于BSD版权。

5. 创建setup.py脚本

创建一个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',
    ],
)

例子中的配置项看起来有点复杂,实际简单得不要不要的。耐心点,就完全不是问题。

6. 创建MANIFEST文件

默认情况下,只有Python的模块和包会被打包进我们的app内。为了包含一些其它的文件,比如静态文件、templates模板等非Python语言编写的文件,需要创建一个django-polls/MANIFEST.in文件,并写入下面的内容:

include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *

7. 添加doc目录

该步骤可选,但是强烈推荐将详细的说明文档一起打包。创建一个空的目录django-polls/docs,用于放置app相关的所有文档。同时不要忘了,在django-polls/MANIFEST.in文件内写入一行recursive-include docs *。需要注意的是,如果docs目录是空的,那么它不会被打包进去。

8. 执行打包动作

django-polls目录内,运行python setup.py sdist命令。这将会创建一个dist目录,并生成django-polls-0.1.tar.gz打包文件。

八个步骤完成了,我们的app也就打包好了。

二、使用打包好的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

可以通过下面的方式发布你的app:

  • 通过邮件的形式将app发送给朋友
  • 将app上传到你的网站
  • 将app推送到一个公开的仓库,例如PyPI,github等。

在https://packaging.python.org/distributing/#uploading-your-project-to-pypi中有如何上传到PyPI的教程。


评论总数: 2



你好,博主。请问django-polls/LICENSE版权申明文件是什么?要怎么生成啊?



https://docs.djangoproject.com/zh-hans/2.0/intro/reusable-apps/