1. 程式人生 > >Django教程之九-----高階教程:如何編寫複用的應用

Django教程之九-----高階教程:如何編寫複用的應用

這個教程緊接(7),我們將我們的網頁問卷調查變成一個單獨的python包,你可以在新專案中重用它,也可以和其他人分享。

如果你沒有完成教程1-7,我們鼓勵你來複習這些所以你的例子專案符合下面的描述。

1. 可重用性很重要

設計,建立,測試和維護一個web應用有很多工作要做。許多Python和Django專案都有同樣的問題。如果我們可以省下這些重複的工作量難道不是很美好麼?

可重用性就像是Python中的生命一種方式。<Python包索引(PyPI)>有一個廣闊的包的範圍,你可以在你的專案中使用這些。查閱<Django 包>瞭解你可以在你專案中繼承的現存的可重用應用。Django本身就是一個Python包。這意味著你能將現存的Python包或者Django應用作為你自己網頁專案的組成部分。你只需要編寫是你專案獨一無二的部分。

假設你正在開始一個新的專案,它需要一個像我們之前工作的polls應用一樣的應用。你如何將這個應用重用?幸運的是,你已經在路上了。在教程(3)中,我們瞭解了我們可以使用include將polls從專案級的URLconf中解耦。在這個教程中,我們做更深入的幾步來讓應用更容易使用在新專案中,並且準備好釋出給其他人安裝和使用。

包?應用?

一個Python包提供了為了更容易重用的相關Python程式碼的組成的一種方式。一個包包含一個或者多個Python程式碼檔案(同樣也成為模組).

一個包能被使用import foo.bar或者from foo import bar匯入。用於組成一個包的路徑(像Polls),它必須包含一個特殊的檔案__init__.py,即使這個檔案是空的。

一個Django應用只是一個Python包,這個包專門用於Django的專案。一個應用可能使用通用的Django約束,例如,模組,測試,urls和views子模組。

稍後我們將使用術語”打包“來描述一個容易為其他人安裝的Python包的製作過程。它可能會有一點迷惑,我們知道。

2. 你的專案和你的可重用應用

經過先前的教程之後,我們的專案應該是這個樣子:

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

在教程(7)中你建立了mysite/templates,教程(3)中建立了polls/templates.也許現在很清晰為什麼我們為專案和應用選擇分開模板路徑:所有東西都是在polls中的polls應用的一部分。它讓應用自包含並且更容易變成一個新的專案。

polls目錄現在可以備份成一個新的Django專案並且可以立即使用。儘管它還沒有準備好釋出。要完成那個,我們需要打包應用好讓其他人更容易安裝。

3. 安裝一些先決條件

當前pyhon打包的狀態是有著各種工具的一團糟。對於這個教程,我們將使用setuptools來建立我們的包。他是推薦的打包工具(與分發合併)。我們同樣使用pip來安裝和解除安裝。你應該安裝這2個包。如果你需要幫助,你可以參考<如何使用pip安裝Django>。你可以以同樣的方式安裝setuptools。

4. 打包你的應用

Python打包指的是以一種特殊的格式準備你的應用,以讓它更容易安裝和使用。Django本身就是一個這樣的包。對於想polls這樣的小型應用來說,這個過程不會太難。

  1. 首先,為polls建立愛你一個父路徑,在你的Django專案的外面。將這個路徑起名為django-polls                        為你的應用選擇一個名字                                                                                                                                                               當為你的包選擇名字時,檢查類似PyPI的源來避免和現有的包名稱衝突。當建立一個釋出的包時預先將django-加到你的名稱中將會很有幫助。這將幫助其他尋找Django應用的人將你的應用作為指定的Django識別。                                                          應用標籤(那是,應用包的點路徑的最後一部分)必須在INSTALLED_APPS中是獨一無二的。避免使用和Django的任何contrib包相同的標籤,例如auth,admin或者messages.
  2. 將polls路徑移動到django-polls路徑
  3. 建立一個檔案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.

  4. 建立一個django-polls/LICENSE檔案。選擇一個許可證對於這個教程來說超出了範圍,但足以說明沒有許可證的公開程式碼釋出是沒有用的。Django和許多Django相容應用是在BSD許可證下發布的;然而,你可以自由選擇你的許可證。請注意,你的許可證的選擇將會影響到使用你程式碼的人。
  5. 下一步我們將建立一個setup.py檔案,它提供了關於如何去建立和安裝應用的明細。這個文件的完整解釋超出了這個教程的範圍,但是<安裝工具文件>有一個好的解釋。建立一個檔案django-polls/setup.py,並寫入以下程式碼:
    django-polls/setup.py
    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='[email protected]',
        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. 只有Python模組和包預設是包含在包裡的。為了包含額外的檔案,我們需要建立一個MANIFEST.in檔案。<安裝工具文件>有更多這個檔案的細節。為了包含模板,README.rst和我們的LICENSE檔案,建立一個有以下內容的檔案django-polls/MANIFEST.in:
    django-polls/MANIFEST.in
    include LICENSE
    include README.rst
    recursive-include polls/static *
    recursive-include polls/templates *

  7. 它是可選的,但是是推薦的,在你的應用中包含詳細的文件。建立一個空的路徑django-polls/docs,留給未來的文件。在django-polls/MANIFEST.in裡新增額外的一行:
    recursive-include docs *
    注意,docs路徑將不會包含在你的包裡除非你在它裡面添加了一些檔案。許多Django應用同樣提供他們的線上文件通過站點readthedocs.org.
  8. 嘗試使用python setup.py sdist(在django-polls內部執行)來建立你的包。這建立一個路徑成為dist並且建立了你的新包,django-polls-0.1.tar.gz.

瞭解打包的更多詳情,請閱讀Python的<打包和釋出專案教程>

5. 使用你自己的包

因為我們將polls路徑移出了專案,它不再起作用。我們現在通過安裝我們新的django-polls包來修復這個問題。

作為使用者庫安裝

下列步驟將django-polls作為一個使用者庫來安裝。基於使用者的安裝比在系統範圍安裝包有很大的優勢,例如在一個你沒有管理員許可權的系統上使用,防止包影響系統服務和其他使用者的機器。

注意,基於使用者的安裝仍然能影響作為那個使用者執行的統工具的行為,所以virtualenv是更優秀的解決方案(看下面)

  1. 為了安裝包,使用pip(你已經安裝過了,對嗎?):
    pip install --user django-polls/dist/django-polls-0.1.tar.gz

  2. 幸運的話,你的Django專案想在應該能再次正確運行了。執行服務來確認這一點
  3. 解除安裝包,使用pip:
    pip uninstall django-polls

6. 釋出你的應用

現在我們已經打包並測試了django-polls,準備好與世界分享了!如果這不是一個例子,你可以:
  • 將包郵件給你的朋友
  • 上傳包到你的網站
  • 釋出到公用倉庫,例如 Python包索引(PyPI).packaging.python.org有一個做這個的好的教程。

7. 使用virtualenv安裝Python包

之前,我們將polls應用作為使用者庫安裝,這有幾個缺點:
  • 修改使用者庫將會影響你係統上的其他Python軟體
  • 你不能執行這個包的多個版本(或者其他有相同名字的東西)。
典型的,這個情況只有在你正在維護多個Django專案是才會出現。當它們出現是,最好的解決方案就是使用virualenv。這個工具允許你去維護多個隔離的Python環境,每一個都有它自己的包名稱空間和庫的備份。

相關推薦

Django教程-----高階教程如何編寫應用

這個教程緊接(7),我們將我們的網頁問卷調查變成一個單獨的python包,你可以在新專案中重用它,也可以和其他人分享。 如果你沒有完成教程1-7,我們鼓勵你來複習這些所以你的例子專案符合下面的描述。 1. 可重用性很重要 設計,建立,測試和維護一個web應用有很多工作要

3天學會MaxScript教程(第二三天編寫一個高階Max頂點動畫back到Texture的外掛)

3天學會MaxScrip的第一天在這裡:點選開啟連結有了第一天的知識和初步認識,我們就來製作一個高階點的指令碼外掛吧。max指令碼其實非常簡單,主要知道語法就可以了,邏輯難度幾乎為零。首先來看這個外掛的效果做動畫其實有很多種方式,除了骨骼,目標變形,物理解算外,還有BackT

Qt5版NeHe OpenGL教程載入3D世界,並在其中漫遊

這一課就要解釋一個基本的3D世界"結構",以及如何在這個世界裡遊走。lesson9.h#ifndef LESSON9_H #define LESSON9_H #include <QWindow> #include <QOpenGLFunctions_1_1

Express全系列教程()將session上傳至mysql數據庫

brush l數據庫 inf port module ava 一個 coo oca 一、簡介 實際引用中,有些公司在不同地區會設置不同服務器,因此就需要用到nginx以實現負載均衡,這時,將session數據保存至數據庫就成為了需要面對的問題,我們以MySQL數據庫為例,

從壹開始前後端分離 [ vue + .netcore 補充教程 ] 二║ Nuxt實戰非同步實現資料雙端渲染

回顧 哈嘍大家好!又是元氣滿滿的周~~~二哈哈,不知道大家中秋節過的如何,馬上又是國慶節了,博主我將通過三天的時間,給大家把專案二的資料添上(這裡強調下,填充資料不是最重要的,最重要的是要配合著讓大家明白 nuxt.js 是如何一步步實現服務端渲染的),雖說是基於 Nuxt 的,但是資料來源還是我們的老

【OpenCV入門教程】 非線性濾波專場 中值濾波 雙邊濾波

                正如我們上一篇文章中講到的,線性濾波可以實現很多種不同的影象變換。然而非線性濾波,如中值濾波器和雙邊濾波器,有時可以達到更好的實現效果。鄰域運算元的其他一些例子還有對二值影象進行操作的形態學運算元,用於計算距離變換和尋找連通量的半全域性運算元。 先上一張截圖:一、理論與概念講解

Packet Tracer 思科模擬器入門教程 路由器的基本配置

實驗目標      掌握路由器幾種常用配置方法; 掌握採用Console線纜配置路由器的方法; 掌握採用Telnet方式配置路由器的方法; 熟悉路由器不同的命令列操作模式以及各種模式之間的切換; 掌握路由器的基本配

【REACT NATIVE 系列教程】REACT NATIVE版本升級步驟與注意事項!

       由於React Native處於快速迭代發展中,因此元件功能的擴充套件、語法的變更也將會有較大的區別,因此升級版本則屬於務必掌握的了。昨天Himi剛從0.23版本升級到0.26,升級的主要原因有兩點:1. 一些元件在最新版本中加入了很多新的屬性,例如0.23版本中Modal動畫沒有最新的屬性:a

機器學習教程 Boosting 與 bagging整合學習框架

整合學習是機器學習演算法中非常耀眼的一類方法,它通過訓練多個基本的分類器(如支援向量機、神經網路、決策樹等),再通過基本分類器的決策融合,構成一個完整的具有更強學習分辨能力的學習器。在整合學習中,那些基本學習器一般被稱為為“弱學習器“,機器學習的目的就是通過整合

機器學習精簡教程——scikit-learn的網格搜尋快速找到最優模型引數

本文轉自:http://www.shareditor.com/blogshow/?blogId=60 任何一種機器學習模型都附帶很多引數,不同場景對應不同的最佳引數,手工嘗試各種引數無疑浪費很多時間,scikit-learn幫我們實現了自動化,那就是網格搜尋 。 網格

機器學習教程 整合學習演算法 深入刨析AdaBoost

Boosting 是一族可以將弱學習器提升為強學習器的演算法。這族演算法的工作機制類似:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,使得先前基學習器做錯的訓練樣本在後續受到更多的關注,然後基於調整後的樣本分佈來訓練下一個基學習器

子雨大資料Spark入門教程---Spark2.1.0入門第一個Spark應用程式WordCount 2.2

前面已經學習了Spark安裝,完成了實驗環境的搭建,並且學習了Spark執行架構和RDD設計原理,同時,我們還學習了Scala程式設計的基本語法,有了這些基礎知識作為鋪墊,現在我們可以沒有障礙地開始編寫一個簡單的Spark應用程式了——詞頻統計。 任務要求 任務:

(轉)Django學習 第三章動態Web頁面基礎

只有一個 即使 typeerror 方法 對象傳遞 power int() 擔心 意圖 上一章我們解釋了怎樣開始一個Django項目和運行Django服務器 當然了,這個站點實際上什麽也沒有做------除了顯示了"It worked"這條信息以外。 這一章我們介紹怎樣使用

nodejs入門教程http的get和request簡介及應用

adding orm col luci string odi func cor mar nodejs入門教程之http的get和request簡介及應用 前言 上一篇文章,我介紹了nodejs的幾個常用的模塊及簡單的案例,今天我們再來重點看一下nodejs的http

Kotlin學習常用高階函式filter

與filter相似的還有以下幾個: filterNot()和filterNotTo():與filter相反,這兩個函式會過濾出不符合條件的元素; filterIndexed()和filterIndexedTo():這兩個函式接受(Int,T)->Boolean型別的函式,同時檢

【JavaFx教程】第五部分將資料 XML 格式儲存

第5部分的主題 持久化資料為XML 使用JavaFX的FileChooser 使用JavaFX的選單 在使用者設定中儲存最後開啟的檔案路徑。 現在我們的地址應用程式的資料只儲存在記憶體中。每次我們關閉應用程式,資料將丟失,因此是時候開始考慮持久化儲存資料了。 儲

Flutter學習指南編寫第一個應用

這是個系列文章,後面還有很多篇,希望對大家能有幫助。 Flutter 是 Google 推出的移動端跨平臺開發框架,使用的程式語言是 Dart。從 React Native 到 Flutter,開發者對跨平臺解決方案的探索從未停止,畢竟,它可以讓我們節省移動端一半的人力。本篇文章中,我們就通過編寫一

C/C++高階語法函式指標及其應用,動態連結庫,正向呼叫

1、在介紹正向呼叫之前,先講一講動態連結庫的知識:       1)、 動態連結庫 DLL,即Dynamic Link Library,在理解動態連結庫的時候,我們可以把它理解為一個包含變數,函式或是類的集合,我們可以通過一定的方式來呼叫包含在這個集合中的那些變數,函式或是

好書整理系列-設計模式面向物件軟體的基礎 4

第4章結構型模式結構型模式涉及到如何組合類和物件以獲得更大的結構。結構型類模式採用繼承機制來組合介面或實現。一個簡單的例子是採用多重繼承方法將兩個以上的類組合成一個類,結果這個類包含了所有父類的性質。這一模式尤其有助於多個獨立開發的類庫協同工作。另外一個例子是類形式的A d

好書整理系列-設計模式面向物件軟體的基礎 3

第3章建立型模式建立型模式抽象了例項化過程。它們幫助一個系統獨立於如何建立、組合和表示它的那些物件。一個類建立型模式使用繼承改變被例項化的類,而一個物件建立型模式將例項化委託給另一個物件。隨著系統演化得越來越依賴於物件複合而不是類繼承,建立型模式變得更為重要。當這種情況發生時