虛擬環境下創建Django工程,即建立一個包含python腳本文件和django配置文件的目錄或者文件夾,其中manage.py是django的工程管理助手。(可在setting.py文件中更改語言、時區等)css
主目錄下(manage.py文件所在目錄)下建立應用app(建立博客應用:python manage.py startapp blog),建立後需在setting.py文件中註冊該應用(INSTALLED_APPS)。html
Django 爲咱們提供了一套 ORM(Object Relational Mapping)系統,在blog/models.py文件中編寫博客模型代碼,每一個類即爲一個表格(類名即爲表名),類的屬性即爲對應表格的一個字段(屬性名即爲列名)。前端
django規定每個類都得繼承models.Model類,每一個屬性都是其自帶字段類的一個實例(如models.CharFiield、models.TextField).python
django.contrib.auth 是 Django 內置的應用,專門用於處理網站用戶的註冊、登陸等流程。其中 User
是 Django 爲咱們已經寫好的用戶模型 。涉及做者、用戶的類能夠直接導入使用。nginx
對象關聯關係:ForeignKey(一對多)和ManyToManyField(多對多)git
models.py文件新增或改動後須要進行數據庫遷移,即在虛擬python環境下依次運行兩個命令行python manage.py makemigrations
和 python manage.py migrate
命令。正則表達式
數據庫引擎配置:django默認爲SQLite3.(在setting.py中的DATABASES選項)sql
爲了方便維護(我的習慣),在咱們的項目根目錄(即 manage.py 文件所在目錄)下創建一個名爲 templates 的文件夾,用來存放咱們的模板。而後在 templates\ 目錄下創建一個名爲 blog 的文件夾,用來存放和 blog 應用相關的模板。這樣設計模板位置後必須更改setting.py中的TEMPLATES選項中的DIRS變量( DIRS
就是設置模板的路徑,在 [] 中寫入 os.path.join(BASE_DIR, 'templates')
)。注:若是直接將templates目錄放在應用目錄下則無需更改setting.py文件。shell
模板文件的第一步工做便是處理靜態文件(css文件和js文件),在blog應用目錄下創建一個static\目錄,爲避免與其餘應用的靜態文件名衝突在static\下創建一個blog目錄用來存放靜態文件。數據庫
修改靜態文件路徑:CSS 樣式文件的路徑在 link 標籤的 href 屬性裏,而 JavaScript 文件的路徑在 script 標籤的 src 屬性裏。
爲避免硬編碼,咱們把引用路徑放在了一個奇怪的符號裏,例如:href="{% static 'blog/css/bootstrap.min.css' %}"。用 {% %} 包裹起來的叫作模板標籤。咱們前面說過用 {{ }} 包裹起來的叫作模板變量,其做用是在最終渲染的模板裏顯示由視圖函數傳過來的變量值。而這裏咱們使用的模板標籤的功能則相似於函數。爲了能在模板中使用 {% static %} 模板標籤,別忘了在最頂部 {% load staticfiles %} 。static 模板標籤位於 staticfiles 模塊中,只有經過 load 模板標籤將該模塊引入後,才能在模板中使用 {% static %} 標籤。好比 {% static 'blog/css/pace.css' %}
最終渲染的值是 /static/blog/css/pace.css
。而 /static/ 前綴是咱們在 settings.py 文件中經過 STATIC_URL = '/static/'
指定的。因此想更改靜態文件目錄名,只需更改目錄名後更改配置文件便可(html文件無需更改,模板標籤裏的static字符是django規則裏的,與目錄名static無關)。
模板的進一步創建便是在前端創建的html文件上按照django的規則進行「修改」,主要是模板標籤和模板變量的使用。經常使用的: {% for %} +{% empty %} +{% endfor %}模板標籤。
Django 做爲一個 Web 框架,它的使命就是接收瀏覽器發來的 HTTP 請求,返回相應的 HTTP 響應。而這些操做都是經過其視圖函數來完成的。
首先,在blog應用目錄下建立一個urls.py文件,用以路由。(把不一樣的網址對應的處理函數寫在一個 urls.py 文件裏,當用戶訪問某個網址時,Django 就去會這個文件裏找)。
可是,Django 匹配 URL 模式是在 blogproject\ 目錄(即 settings.py 文件所在的目錄)的 urls.py 下的,因此咱們要把 blog 應用下的 urls.py 文件包含到 blogproject\urls.py 裏去。因此須要藉助django自帶庫django.conf,urls中的inclde函數進行綁定。注意:在項目根目錄的 blogproject\ 目錄下(即 settings.py 所在的目錄),本來就有一個 urls.py 文件,這是整個工程項目的 URL 配置文件。而咱們這裏新建了一個 urls.py 文件,且位於 blog 應用下。這個文件將用於 blog 應用相關的 URL 配置。不要把兩個文件搞混了。
而後就是視圖函數的編寫——render函數的使用,每一個模板頁面即html文件如index.html對應一個視圖函數def index(request),注意:,每一個視圖函數都必須接受了一個名爲 request
的參數。這個 request
就是 Django 爲咱們封裝好的 HTTP 請求,它是類 HttpRequest
的一個實例。
視圖函數的編寫是整個應用的業務邏輯的實現(此外,模型層即templates目錄下的html文件負責表現邏輯,django的模板系統將這二個邏輯分開了)。視圖函數決定從模型層models.py(對應數據庫)中取哪些數據,進行何種處理,最後經過render函數將數據和哪一個模板(html文件)進行渲染後return給url.
模型管理器 objects
的使用:它具備如下方法,all()、get()、filter()、anotate()
django的一大特點就是它自帶的admin後臺管理系統而無需本身編寫。首先建立一個超級管理員帳戶(一樣是藉助manage.py工具)python manage.py createsuperuser
首先須要在blog目錄下的admin.py中對前文建立的模型進行註冊,利用django.contrib的admin進行註冊,如admin.site.register(Post)
而後運行開發服務器,訪問 http://127.0.0.1:8000/admin/ ,進入到django admin後臺登陸頁面,登陸後便可進行後臺管理操做。
也能夠經過在admin.py中編寫代碼本身定製admin後臺。
跟前文搭建博客首頁(展現文章列表)的過程同樣,詳情頁的構建步驟以下:
①綁定url(路由):url的設計、正則表達式的使用(命名組的捕獲)、appname(視圖函數命名空間)以及利用reverse函數定義一個get_absolute_url方法來生產url;
②編寫detail視圖函數:它根據咱們從 URL 捕獲的文章 id(也就是 pk,這裏 pk 和 id 是等價的)獲取數據庫中文章 id 爲該值的記錄,而後傳遞給模板。
此外,能夠經過在detail視圖函數中渲染Markdown和模板文件中(index.html的博客文章主體{{ post.body}})的safe標籤的使用來實現markdown語法的使用;
也能夠經過Pygments插件來實現代碼高亮。
③編寫詳情頁模板:在 index 頁面博客文章列表的標題和繼續閱讀按鈕寫上超連接跳轉的連接,即文章 post
對應的詳情頁的 URL,讓用戶點擊後能夠跳轉到 detail 頁面。即href=" {{ post.get_absolute_url }}"
此外,能夠經過模板繼承來減小代碼重複——base.html
博客首頁和詳情頁都是由視圖函數獲取數據傳遞給相應模板,而側邊欄(最新文章、分檔、歸類和標籤雲)直接在模板中獲取數據便可(每一個詳情頁都有,減小代碼重複)。
django內置模板標籤如:比較簡單的 {% static %} 模板標籤,比較複雜的如 {% for %} {% endfor%} 標籤。這裏 咱們但願本身定義一個模板標籤,例如名爲 get_recent_posts
的模板標籤,它能夠這樣工做:咱們只要在模板中寫入 {% get_recent_posts as recent_post_list %},那麼模板中就會有一個從數據庫獲取的最新文章列表,並經過 as 語句保存到 recent_post_list
模板變量裏。
django模板系統中自定義模板標籤步驟:
①blog應用下建立一個templatetags文件夾,而後在這個文件夾下建立一個 __init__.py 文件,使這個文件夾成爲一個 Python 包,以後在 templatetags\ 目錄下建立一個 blog_tags.py 文件,這個文件存放自定義的模板標籤代碼。
②自定義模板標籤代碼寫在 blog_tags.py 文件中。其實模板標籤本質上就是一個 Python 函數。
③按照django的規定註冊相應函數爲模板標籤。
最後,在模板文件裏使用自定義的模板標籤便可。注:同導入靜態文件標籤須要在html文件頂部 {% load staticfiles %} 同樣,此時也需導入模板標籤 {% load blog_tags %}。
完善歸檔和分類功能,當用戶點擊歸檔下的某個日期或者分類下的某個分類時,跳轉到文章列表頁面,顯示該日期或者分類下的所有文章。
步驟:①視圖函數中添加archives函數和category函數,經過模型管理器objects的filter函數來查找對應文章列表;
②配置url;
③在模板找到歸檔列表部分的代碼,修改超連接的 href
屬性,讓用戶點擊超連接後跳轉到文章歸檔頁面——使用了 {% url %} 模板標籤;
Django 提倡,若是功能相對比較獨立的話,最好是建立一個應用,把相應的功能代碼寫到這個應用裏。咱們的第一個應用叫 blog,它裏面放了展現博客文章列表和細節等相關功能的代碼。而這裏咱們再建立一個應用,名爲 comments,這裏面將存放和評論功能相關的代碼。
Django 的表單功能就是幫咱們大部分表單處理邏輯。
步驟:①設計評論的數據庫模型;
②評論表單設計,在comments目錄下新建一個forms.py文件,用來存放表單代碼——主要是繼承和改寫django提供的表單類;
③編寫評論視圖函數處理邏輯——一點面向對象編程和django.shortcuts模塊中的redirect函數使用;
④綁定url(工程urls.py include());
⑤更新詳情頁的視圖函數;
⑥前端渲染表單:使用 Django 表單的一個好處就是 Django 能幫咱們自動渲染表單。咱們在表單的視圖函數裏傳遞了一個 form
變量給模板,這個變量就包含了自動生成 HTML 表單的所有數據。
⑦顯示評論內容:在 detail 視圖函數咱們獲取了所有評論數據,並經過 comment_list
傳遞給了模板。和處理 index 頁面的文章列表方式是同樣的,咱們在模板中經過 {% for %} 模板標籤來循環顯示文章對應的所有評論內容。
因爲時間關係,django開發的主體部分前文已經總結複習的差很少了,剩下一些小功能的實現,如今就簡單羅列一下,後面有時間了再補上吧。
1.統計文章閱讀量——初略的根據點擊次數,首先在模型中post下增長記錄post瀏覽量的views字段,增長一個相應的模型方法(調用一次views就加一),再在視圖函數的detail函數中(博客文章詳情頁)調用一次post的increase_views()方法便可。
2.自動生成文章摘要——複寫save方法,在數據被保存到數據庫前,先從 body
字段摘取 N 個字符保存到 excerpt
字段中,從而實現自動摘要的目的。
3.django Pagination簡單分頁和完善分頁。
4.統計各個分類下的文章數——使用 Django 模型管理器objects的 annotate
方法。
5.標籤雲:定義一個 get_tags
模板標籤,獲取到文章數大於 0 的標籤列表,而後在模板中渲染顯示它。
6.RSS訂閱——使用 Django Feed 類
7.markdown自動生成文章目錄,教程中使用的是基於類的通用視圖。
8.簡單全文搜索——使用 Django Model 層提供的一些內置方法;
全文搜索與關鍵詞高亮——django-haystack 是一個專門提供搜索功能的 django 第三方應用
last but not least 最後一步,將博客部署到服務器上。
目前嘗試了兩種方法:①nginx+gunicorn;②nginx+uwsgi(官方文檔)
關鍵1:項目靜態文件的配置:Django 項目中會有一些 CSS、JavaScript 等靜態文件,爲了可以方便地讓 Nginx 處理這些靜態文件的請求,咱們把項目中的所有靜態文件收集到一個統一的目錄下,這個目錄一般位於 Django 項目的根目錄,而且命名爲 static。因此需在項目setting.py文件中指明靜態文件的收集目錄(STATIC_ROOT = os.path.join(BASE_DIR, 'static'))。此外,爲了安全起見,在生產環境下須要關閉 DEBUG
選項。
關鍵2:在於nginx配置文件的編寫——/etc/nginx/sites-avaliable/blog(這裏的blog是我針對該博客項目命名的),須要指出的是nginx代理時訪問的目錄是/etc/nginx/sites-enabled/,教程上的作法是講/etc/nginx/sites-enabled/目錄下默認的default配置文件刪除(放置其覆蓋本身寫的配置文件即blog),而後ln -s生成一個指向/etc/nginx/sites-avaliable/blog文件的軟鏈接(具體細節沒深究相似於文件指針吧)。
基本步驟:
pip install -r requirement.txt
安裝最新依賴:虛擬環境下「一鍵」安裝項目依賴。python manage.py collectstatic
收集靜態文件:在項目目錄下執行;python manage.py migrate
遷移數據庫:clone時需刪除原來開發環境下的數據庫文件(db.sqlite3),生產環境下需從新遷移。注1:教程中服務器用戶是新建的我的用戶,而後授予的超級管理員權限。我這偷懶直接在root下進行的全部操做,因此最後在nginx訪問靜態文件時出現403 forbidden,這種狀況的解決辦法是更改nginx.conf文件的user爲root便可(文件第一行)。
注2:教程中用的是域名,若想直接配置ip,將nginx配置文件中的域名用ip代替,而且在blogproject中的setting.py中將ip也加入到容許訪問的列表中。
注3:我的感受部署過程是整個項目最難的部分的緣由主要是服務器環境致使的,加之,如nginx的配置文件出現錯刪(原本應該刪除sites-enabled中的default文件,結果刪除的是sites-availabled中的,最後只能卸載nginx重裝,實在不行就只有重裝服務器,重頭再來。。。)因此,配置文件的更改特別是刪除,備份是個好習慣啊!找個你能記住的位置mkdir而後cp就行。
我的感受uwsgi部署起來容易一些,沒這麼多坑,第一次接觸這個教程時折騰好久就是選擇的uwsgi完成部署的,時間緣由具體操做就不寫了。。