已經同步到gitbook,想閱讀的請轉到gitbook: Django 1.10 中文文檔
This advanced tutorial begins where Tutorial 7 left off. We’ll be turning our Web-poll into a standalone Python package you can reuse in new projects and share with other people.
緊接著教程7,從這只后我們開始高級教程部分。我們將投票應用做成一個單獨的python包,你可以在新項目使用,或分享給其他人。
If you haven’t recently completed Tutorials 1–7, we encourage you to review these so that your example project matches the one described below.
如果你還未完成教程1-7,我們建議你完善它們,使你的示例項目與下面描述的一致
Reusability matters?
可重用很重要?
It’s a lot of work to design, build, test and maintain a web application. Many Python and Django projects share common problems. Wouldn’t it be great if we could save some of this repeated work?
設計、構建、測試和維護一個網頁應用需要做許多工作。許多Python 和 Django 項目都會遇到一些共性問題。如果我們能不重復的造輪子,豈不是很棒。
Reusability is the way of life in Python. The Python Package Index (PyPI) has a vast range of packages you can use in your own Python programs. Check out Django Packages for existing reusable apps you could incorporate in your project. Django itself is also just a Python package. This means that you can take existing Python packages or Django apps and compose them into your own web project. You only need to write the parts that make your project unique.
可重用性在Python 中是一種常見的方式。
Python包索引 (PyPI)網站 具有大量的包,你可以在你自己的Python程序中使用。
查閱一下Django Packages中已經存在的可重用的應用,你可以把它們放到你的項目中。
Django 自身也只是一個Python 包。
這意味著你可以獲取已經存在的Python包和Django應用并將它們融合到你自己的網頁項目。你只需要編寫你項目的獨有的部分代碼。
Let’s say you were starting a new project that needed a polls app like the one we’ve been working on. How do you make this app reusable? Luckily, you’re well on the way already. In Tutorial 3, we saw how we could decouple polls from the project-level URLconf using an include. In this tutorial, we’ll take further steps to make the app easy to use in new projects and ready to publish for others to install and use.
假如說你正在開始一個新的項目,需要一個像我們正在編寫的投票應用。你如何讓該應用可重用?幸運的是,其實你已經在這條道路上了。在教程 3中,我們看到我們可以如何使用include將投票應用從項目級別的URLconf 解耦。在本教程中,我們將進一步讓你的應用更容易復用到新的項目中,而且可以發布給其它人安裝和使用。
Package? App?
A Python package provides a way of grouping related Python code for easy reuse. A package contains one or more files of Python code (also known as “modules”).
Python package提供了可讓一組相關性代碼復用的方式,一個包包含一個或許多python文件(也就是我們常說的模塊)
A package can be imported with import foo.bar or from foo import bar. For a directory (like polls) to form a package, it must contain a special file init.py, even if this file is empty.
一個包可以通過import foo.bar or from foo import bar方法導入。如果是一個目錄(如polls)要做成一個包,必需要包含一個特殊文件init.py,即使這個文件是空。
A Django application is just a Python package that is specifically intended for use in a Django project. An application may use common Django conventions, such as having models, tests, urls, and views submodules.
一個Django應用就是僅僅用于Django項目中Python包。一個應用可以遵循常見的Django 約定,例如具有models、tests、urls和views 子模塊。
Later on we use the term packaging to describe the process of making a Python package easy for others to install. It can be a little confusing, we know.
將python包變的讓其他人更易于安裝的過程,我們稱之為打包。目前對于你來說可能有點困惑。
Your project and your reusable app?
你的項目以及可復用的app?
After the previous tutorials, our project should look like this:
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
You created mysite/templates
in Tutorial 7, and polls/templates in Tutorial 3. Now perhaps it is clearer why we chose to have separate template directories for the project and application: everything that is part of the polls application is in polls. It makes the application self-contained and easier to drop into a new project.
你在教程 2中創建了mysite/templates
,在教程 3中創建了polls/templates。
現在你可能更加清晰為什么我們為項目和應用選擇單獨的模板目錄:屬于投票應用的部分全部在polls目錄中。這使得該應用只含有自己的東西,而且更加容易放到一個新的項目中。
The polls directory could now be copied into a new Django project and immediately reused. It’s not quite ready to be published though. For that, we need to package the app to make it easy for others to install.
現在可以拷貝polls目錄到一個新的Django項目并立即重用。盡管它還不能充分準備好到可以立即發布。所以,我們需要打包這個應用來讓它對其他人易于安裝。
Installing some prerequisites?
安裝一些需要的東西?
The current state of Python packaging is a bit muddled with various tools. For this tutorial, we’re going to use setuptools to build our package. It’s the recommended packaging tool (merged with the distribute
fork). We’ll also be using pip to install and uninstall it. You should install these two packages now. If you need help, you can refer to how to install Django with pip. You can install setuptools the same way.
Python 目前有眾多打包工具,非常混亂不堪。在本教程中,我們打算使用setuptools來構建我們的包。它是推薦的打包工具(已經與distribute
分支合并)。我們還將使用pip來安裝和卸載它。現在你應該安裝這兩個包。如果你需要幫助,你可以參考how to install Django with pip。你可以使用同樣的方法安裝setuptools
Packaging your app?
打包你的應用?
Python packaging refers to preparing your app in a specific format that can be easily installed and used. Django itself is packaged very much like this. For a small app like polls, this process isn’t too difficult.
Python 打包 會將你的應用按一定規則進行處理, 使其更易安裝和使用。Django 也是以非常相似的方式打包起來的。對于一個像polls這樣的小應用,這個過程不是太難。
- First, create a parent directory for polls, outside of your Django project. Call this directory django-polls.
首先,創建一個polls的父目錄,在Django項目目錄外。目錄名為django-polls
Choosing a name for your app
When choosing a name for your package, check resources like PyPI to avoid naming conflicts with existing packages. It’s often useful to prepend django- to your module name when creating a package to distribute. This helps others looking for Django apps identify your app as Django specific.
當為你的包選擇一個名字時,檢查一下PyPI中的資源以避免與已經存在的包沖突。當創建一個要發布的包時,在你的模塊名字前面加上django-通常很有用。 這有助于其他正在查找Django應用的人區分你的應用是專門用于Django的。
Application labels (that is, the final part of the dotted path to application packages) must be unique in INSTALLED_APPS
. Avoid using the same label as any of the Django contrib packages, for example auth, admin, or messages.
應用的標簽(應用的包的點分路徑的最后部分)在 INSTALLED_APPS
中必須唯一。避免使用與Django的contrib 包 中任何一個使用相同的標簽,例如auth、admin和messages。
- Move the polls directory into the django-polls directory.
將polls目錄移動到django-polls
- Create a file django-polls/README.rst with the following contents:
創建一個包含以下內容的文件django-polls/README.rst:
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.
- Create a django-polls/LICENSE file. Choosing a license is beyond the scope of this tutorial, but suffice it to say that code released publicly without a license is useless. Django and many Django-compatible apps are distributed under the BSD license; however, you’re free to pick your own license. Just be aware that your licensing choice will affect who is able to use your code.
創建一個django-polls/LICENSE文件。如何選擇License超出本教程的范圍,但值得一說的是, 公開發布的代碼如果沒有License是毫無用處的。Django和許多與Django兼容的應用以BSD License 發布;然而,你可以隨便挑選自己的License。只需知道你所選擇的License,將決定誰能使用你的代碼.
- Next we’ll create a setup.py file which provides details about how to build and install the app. A full explanation of this file is beyond the scope of this tutorial, but the setuptools docs have a good explanation. Create a file django-polls/setup.py with the following contents:
下一步我們將創建一個setup.py 文件,它包含了如何構建和安裝該應用的詳細信息。該文件的詳細解說超出了本教程的范圍,setuptools 文檔 已詳細說明。
創建一個文件django-polls/setup.py,其內容如下:
django-polls/setup.py
import os
from setuptools import 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=['polls'],
include_package_data=True,
license='BSD License', # example license
description='A simple Django app to conduct Web-based polls.',
long_description=README,
url='http://www.example.com/',
author='Your Name',
author_email='yourname@example.com',
classifiers=[
'Environment :: Web Environment',
'Framework :: Django',
'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.2',
'Programming Language :: Python :: 3.3',
'Topic :: Internet :: WWW/HTTP',
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
],
)
- Only Python modules and packages are included in the package by default. To include additional files, we’ll need to create a MANIFEST.in file. The setuptools docs referred to in the previous step discuss this file in more details. To include the templates, the README.rst and our LICENSE file, create a file django-polls/MANIFEST.in with the following contents:
默認只有Python模塊和包會包含進包中。如果需要包含額外的文件,我們需要創建一個MANIFEST.in文件。上一步提到的setuptools 文檔對這個文件有更詳細的討論。如果要包含模板、README.rst和我們的LICENSE 文件,創建一個文件django-polls/MANIFEST.in,其內容如下:
django-polls/MANIFEST.in
include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
- It’s optional, but recommended, to include detailed documentation with your app. Create an empty directory django-polls/docs for future documentation. Add an additional line to django-polls/MANIFEST.in:
包含你的應用的詳細文檔,雖然這是可選的,但是推薦你這樣做。創建django-polls/docs目錄用于保存將來的文檔。然后再django-polls/MANIFEST.in增加一行:
recursive-include docs *
Note that the docs directory won’t be included in your package unless you add some files to it. Many Django apps also provide their documentation online through sites like readthedocs.org.
注意docs不會包含進你的包中除非你添加一些文件到它下面。
許多Django應用還通過類似readthedocs.org這樣的站點提供它們的在線文檔.
- Try building your package with python setup.py sdist
(run from inside django-polls). This creates a directory called dist
and builds your new package, django-polls-0.1.tar.gz.
通過命令python setup.py sdist(在django-polls目錄內執行)來打包,這會創建一個dist目錄并構建一個新包:django-polls-0.1.tar.gz。
For more information on packaging, see Python’s Tutorial on Packaging and Distributing Projects.
更多打包相關的信息請看Tutorial on Packaging and Distributing Projects.
Using your own package?
使用你自己的包?
Since we moved the polls directory out of the project, it’s no longer working. We’ll now fix this by installing our new django-polls package.
由于我們將polls目錄移出了項目,它已無法正常使用。我們現在通過安裝我們新構建的django-polls包來修復這個問題。
Installing as a user library
作為用戶級別的庫安裝
The following steps install django-polls as a user library. Per-user installs have a lot of advantages over installing the package system-wide, such as being usable on systems where you don’t have administrator access as well as preventing the package from affecting system services and other users of the machine.
以下的步驟將安裝django-polls 成某個用戶的庫。用戶級別的安裝比系統級別的安裝有許多優點,例如將包運行在普通用戶級別上不但不會影響系統服務還不會影響其他用戶
Note that per-user installations can still affect the behavior of system tools that run as that user, so virtualenv is a more robust solution (see below).
注意根據用戶的安裝仍然可以影響以該用戶身份運行的系統工具,所以virtualenv 是更健壯的解決辦法(見下文)。
- To install the package, use pip (you already installed it, right?):
用pip命令來安裝包(你已經安裝了,對吧?)
pip install --user django-polls/dist/django-polls-0.1.tar.gz
With luck, your Django project should now work correctly again.
Run the server again to confirm this.
幸運的是,你的Django項目又重新正常工作了。你可以啟動服務器來驗證。To uninstall the package, use pip:
用以下命令卸載這個包:
pip uninstall django-polls
Publishing your app?
發布你的應用?
Now that we’ve packaged and tested django-polls, it’s ready to share with the world! If this wasn’t just an example, you could now:
現在你已經打包并測試了django-polls,它已經準備好公開發布到全世界了!如果這不僅僅是例子,你現在可以:
Email the package to a friend.
郵件發送給你的朋友
Upload the package on your website.
上傳到你的站點
Post the package on a public repository, such as the Python Package Index (PyPI). packaging.python.org has a good tutorial for doing this.
提交到一個公開的倉庫源。 the Python Package Index (PyPI). packaging.python.org 有一個非常好的教程 a good tutorial
Installing Python packages with virtualenv?
用virtualenv安裝Python包?
Earlier, we installed the polls app as a user library. This has some disadvantages:
前面,我們以用戶級別安裝了polls應用。這有一些不利的地方:
Modifying the user libraries can affect other Python software on your system.
更改用戶的庫可能會影響到系統里其他Python程序
You won’t be able to run multiple versions of this package (or others with the same name).
你不可能同時跑這個包的多個版本(或者其他同名的包)
Typically, these situations only arise once you’re maintaining several Django projects. When they do, the best solution is to use virtualenv. This tool allows you to maintain multiple isolated Python environments, each with its own copy of the libraries and package namespace.
當你維護幾個Django項目時,這種情況會經常出現。遇到了這個問題,最好的解決辦法是使用virtualenv。這個工具允許你維護多個分離的Python環境,每個都具有它自己的庫和包的命名空間。