天天看點

Windows+Apache+Python+Django 踩坑記錄

Windows+Apache+Python+Django 踩坑記錄

摘要

  使用Python進行Web項目開發;相對于主流三大Web端解決方案(Java/.NET/PHP) Python在某些方面具有一定的優勢,相對 Java/.NET 有更輕量級的部署方案,相對PHP有更安全開放的環境支援,這些不同點幾乎完全取決于Python語言本身的特性。

0x01: 環境部署

  注:開發環境與運作環境的部署需要的基本技能 —— 理論基礎知識紮實,了解相關基本原理,了解具體開發體系;如果不具備這些能力那麼遇到問題就會很懵

  0x11: Windows+Apache 部署

  1. Apache壓縮包直接百度 "Apache" 就能找到官網下載下傳了,飛機票>> Apache24 ;壓縮包解壓至安裝目錄,路徑最好不要含有中文和空格(江湖規矩)

  2. httpd.conf 配置檔案(apachePath/conf/httpd.conf),Apache部署中最重要的部分,一般隻用修改第一條 ServerRoot 就可以了,文檔中 "#" 為行注釋

    ServerRoot 改為你的真實路徑(一般在37行上下),Ex: ServerRoot "D:/Program/Apache/Apache24",新版本Apache中采用 "SRVROOT" 宏替換後面所有會用到路徑的地方,新版本修改 Define SRVROOT "c:/Apache24" 為真實路徑可全局替換,較老版本要手動修改以下兩個地方:辨別靜态檔案路徑(大概在251行上下)以及檔案通路權限,CGI 腳本路徑及通路權限(大概在368/380行上下);注意:路徑分隔為 "/" 而不是 ""

    Listen 為監聽端口,預設80(通常在60行上下)一般不用修改

    LoadModule 為随Apache啟動加載的子產品(71-185左右),一般不用管

    ServerName 取消注釋(225上下),好像是 IANA DNS導航什麼的

    DocumentRoot 表示靜态檔案路徑,見第一條 ServerRoot

    ErrorLog 表示記錄檔案輸出路徑(300行上下),debug的時候會經常用到這個檔案,不更改記錄級别的話提示警告什麼的也在裡面,我也不知道咋回事兒

    LogLevel 表示記錄輸出級别(310行上下),取值文檔中有注釋麻煩自己看

    Include 表示要引入的其它配置檔案(原文檔中490-530行大量出現),要使用了再詳細了解吧

     表示檔案通路權限,按類型限制

     标簽表示如果加載了 xxx_module 子產品就将其内容作為該子產品的配置

     标簽表示檔案夾權限,見第一條 ServerRoot

  3. 安裝/解除安裝系統服務,不安裝沒法用

    安裝:管理者權限打開控制台,cd 到 Apache24/bin/ 目錄下,執行 "httpd -k install" 将Apache服務注入系統,可使用 -n 參數指定服務名(一般不要這麼幹),Ex: "httpd -k install -n "Apache2439" ",如此步安裝過程報錯考慮可能是VC庫版本問題,一般Apache壓縮包中會有一個空檔案,檔案名表示該版本所依賴的VC庫,若無請自行下載下傳

    安裝完成後可到系統服務将該服務 "自動啟動" 改為手動啟動,否則該服務将随系統開啟而啟動;如果部署到伺服器則不用修改

    解除安裝:管理者權限打開控制台,cd 到 Apache24/bin/ 目錄下,執行 "httpd -k uninstall" 解除安裝服務,若注入服務時使用 -n 參數指定服務名則此處也要用 -n 參數指定

  4. 啟動/停止/重新開機服務

    啟動:管理者權限打開控制台,cd 到 Apache24/bin/ 目錄下,執行 "httpd -k start" 開始運作伺服器,若注入服務時使用 -n 參數指定服務名則此處也要用 -n 參數指定

    重新開機:"httpd -k restart"

    停止:"httpd -k stop"

    其它:"httpd -h" 可檢視httpd支援的所有指令,當然,是英文版的

  n. 若上述步驟都沒有什麼問題,則通路 127.0.0.1 就能看到 "It works!" 了(伺服器需允許httpd.exe通過防火牆)

  0x21: Apache+Django部署

  注:Python安裝都不會的就不用繼續看了

  1. 運作模式解釋,Apache伺服器腳本運作模式有一大堆,具體是咋回事兒我也不是很懂,以下是我對其中一部分的個人了解,若有偏差歡迎指正

    CGI: 伺服器收到請求後由配置資訊找到CGI程式(腳本)路徑,随後由該程式指定的運作方式運作(直接運作或解析器),然後将執行結果傳回給伺服器調用處

    FCGI: GCI的更新版,改進CGI每次伺服器的請求都會調用一次CGI程式體浪費空間和性能的缺點;FCGI建立一個程式執行的管理程式,伺服器隻與管理程式通信(通信機制一般使用socket)。每次請求會被FGCI管理程式配置設定給工作程序或線程,由于管理程序事先會啟動多個工作程序/線程,是以省去了事務生成/銷毀的系統開銷

    WSGI: FCGI的改進版,管理程式實作方式改為伺服器插件而不是使用socket通信,官方文檔中一般使用 Middleware(中間件) 這個概念,可避免端口占用,主要性能提升在于降低通信開銷(記憶體共享快于socket通信)

  2. 中間件 mod_wsgi 是Django在Apache上的一種方案,采用上述WSGI的實作方式

  3. Django安裝,建議直接 "pip install django" 安裝,安裝完成後會有 "Success" 之類的提示,可執行 "pip list" 可檢視安裝包清單内是否有 "Django x.x.x" 以确認安裝

    3.1 pip安裝緩慢原因:下載下傳源在國外,解決:修改下載下傳源,方法:"C:/Users/使用者名" 目錄下建立 "pip" 檔案夾,檔案夾内建立 "pip.ini" 配置檔案,内容為:

      [global]

      index-url =

https://pypi.douban.com/simple/

    3.5. Django中一些基礎概念的介紹

      項目:一個Web項目的容器,其中包括該Web項目要用到的所有檔案,例如靜态檔案、Python腳本、資料庫等

      應用:Web項目中的一個功能的所有實作,代碼以及資料

      項目和應用是多對多的關系,一個項目可由多個應用構成,一個應用可供多個項目使用

  4. mod_wsgi 安裝,去Python庫裡下載下傳mod_wsgi,子產品版本一定要對應Apache和Python的版本,因為這是一個中間件,就是用來适配兩端子產品的,再送一張飛機票>> mod_wsgi ,下載下傳到的是 whl 檔案,使用 "pip install mod_wsgi-xxx.whl" 進行安裝

  5. 建立Django項目/應用

    控制台執行 "django-admin startproject projName" ,生成一個Django項目,同上 django-admin 也在Python 中 Scripts 目錄下,該指令會在指定目錄生成一個Django項目檔案結構,不指定目錄則生成在目前目錄,使用 "django-admin startapp appName" 生成一個應用,貼出自用的一個生成項目和應用的 .bat 腳本

newDjango.bat

  

  6. Apache 适配 mod_wsgi 中間件,修改配置檔案 httpd.conf

    注:網上一堆找 xxx.so 子產品檔案再改上述 httpd.conf 中 LoadModule 是不可行的,因為Python3之後的版本使用的子產品為 pyd 格式

    控制台執行 "mod_wsgi-express module-config" ,該指令中的 mod_wsgi-express 在 Python 目錄中 Scripts 檔案夾下,如果環境變量 Path 中沒有該 Scripts 的路徑就 cd 過去再用,将得到的3行結果複制下來,粘貼到 Apache 中的 httpd.conf 配置檔案末尾,一般是 LoadFile+LoadModule+WSGIPythonHome,分别表示Python解析器路徑/中間件路徑/Python容器路徑,(也可執行 "mod_wsgi-express module-config >> ApachePath/conf/httpd.conf",ApachePath代表Apache安裝根目錄,如果你熟悉指令行應該知道這是個啥)

    添加行 " WSGIScriptAlias / "djangoPath/djangoName/wsgi.py" ",該行為Apache找到Django項目提供依據,路徑為Django項目下的 wsgi.py 檔案

    添加行 " WSGIPythonPath "djangoPath" ",該行為Django項目的容器路徑

    配置 wsgi.py 的通路權限:

      

       

        Require all granted

    配置靜态檔案路徑及通路權限:

      Alias /static "djangoPath/static"

       AllowOverride None

       Options None

       Require all granted

    配置多媒體檔案路徑及通路權限:(可選)

      Alias /media "djangoPath/media"

    我的配置代碼

httpd.conf

  n. 配置完成以上内容重新開機Apache,使用浏覽器通路 127.0.0.1 就能看到Django的歡迎界面了(伺服器需要在Django項目中setting.py中設定 "ALLOWED_HOSTS=['*']",詳見Django配置檔案解析)

0x02: 使用Django進行開發(Python3.7+Django2.2.2)

  0x12: Django架構簡介

  1. MVT,應該屬于設計模式什麼的吧,其實思想和MVC差不多

    M(Model): 資料持久層,操作資料庫的

    V(View): 視圖層,其實是控制邏輯的

    T(Template): 模闆層,傳回給使用者看的内容

  2. 最小檔案結構,執行 "django-admin startproject projName" 生成

  projName

   |-- projName

   |--  |--  __pycahce__

#首次運作後自動生成的Python二進制檔案

   |--   |--  ....pyc

   |--  |--  __init__.py #空檔案,Python子產品辨別

   |--  |--  setting.py #該項目的配置資訊

   |--  |--  urls.py #該項目的所有URL路由

   |--  |--  wsgi.py #WSGI的接口??

   |-- db.selite3 #項目首次運作後自動生成的資料庫檔案(若未修改Django預設使用的資料庫SQLite3)

   |-- manage.py #管理該項目的檔案

  3. 擴充檔案結構,自行建立(可選)的檔案結構

    projName/templates

: 放置html檔案的路徑,Django中成為模闆檔案

    projName/static

: 放置靜态檔案,包括css/js/image

    projName/media

: 放置多媒體檔案,大概除了上面兩個其它的檔案都可以放這兒吧,也不是很懂這是幹嘛的

    projName/projName/views.py: 視圖檔案,其實名字随便取,但最好這樣(江湖規矩)

    projName/projName/models.py: 模型檔案,用來編寫模型的,隻能是這個名字好像

  0x22: 項目配置,setting.py

    BASE_DIR: 項目所在路徑,不常改

    SECRET_KEY: 啥密鑰來着??不常改

    DEBUG: 調試模式預設為True,用于輸出調試資訊,項目上線後應改為False

    ALLOWED_HOSTS: 允許通過的位址,上線後一般設定為['*']

    INSTALLED_APPS: 安裝的應用,建立應用後需要在此添加

    MIDDLEWARE: Django提供的工具集,如CSRF

    ROOT_URLCONF: url配置檔案,指向項目下的urls.py路由檔案,一般不改

    TEMPLATES: 模闆配置檔案

    WSGI_APPLICATION: CGI應用執行個體,一般不改

    DATABASES: 資料庫配置

    AUTH_PASSWORD_VALIDATORS: 密碼認證配置,一般不改

    # 以下為國際化配置

    LANGUAGE_CODE: 語言('zh-hans'),設定為中文後Django首頁顯示為中文

    TIME_ZONE: 時區('Asia/Shanghai')

    USE_I18N: 國際化

    USE_I10N: 國際化

    USE_TZ: 時間存儲帶時區(False)

    STATIC_URL: 靜态檔案(CSS/JS/Image/Fonts)位置('/static/')

    # 以下為非預設配置

    APPEND_SLASH: 自動在url後加 '/', 預設為True

    STATICFILES_DIRS: 靜态檔案路徑,設定為 (os.path.join(BASE_DIR, 'static'),) ,否則使用Django自帶伺服器啟動時不能通路靜态檔案

  0x32: 其它常用操作

  1. 資料遷移,資料庫生成與更改後都應執行資料遷移指令,控制台執行以下指令

    python manage.py makemigrations #建立資料庫檔案夾migrations(存在則跳過)

    python manage.py migrate #生成資料表及填充權限

    建立管理者使用者,用于登入Django的控制台 127.0.0.1/admin

      python manage.py createsuperuser #建立管理者,然後輸入一堆資訊就成了

  2. 新應用目錄結構,略

  3. 啟動Django自帶的Web調試伺服器,隻能用作調試,并發性為0

    控制台cd到Django項目根目錄下,執行 "python manage.py runserver",Django會在127.0.0.1:8000開啟伺服器,runserver 可選參數為[ip:port]

  4. 新增應用後,應在 setting.py 檔案中的 INSTALLED_APPS 中添加該應用的名稱

  5. 使用MySQL資料庫,大概記錄一下(我使用的預設的sqlite,沒有用MySQL)

    MySQL資料庫安裝,請自行百度

    Python MySQL連接配接驅動安裝,老規矩 "pip install pymysql"

    項目中使用MySQL資料庫需要在 __init__.py 中初始化資料庫,代碼為:

      import pymysql

      pymysql.install_as_MySQLdb()

    修改項目 setting.py 檔案資料庫部分:

DATABASES

  6. setting.py 模闆路徑設定,TEMPLATES 中 'DIRS':[BASE_DIR+'/templates',]

  7. Django背景管理工具,以下隻做簡要介紹,其它請自行查找

    通路 127.0.0.1/admin進入管理頁面(未登入顯示登入)

    伺服器部署 頁面沒有css樣式原因:未作 admin 靜态檔案遷移(Apache配置檔案中将權限交給Django後沒有決定路徑解析的權限),解決:将 "PythonPath/Lib/site-packages/django/contrib/admin/static" 目錄下的 "admin" 目錄拷至 "ApachePath/htdocs/djangoName/static" 檔案夾下

  8. Ajax禁止問題,報錯為 "CSRF token missing or incorrect.",原因:CSRF阻止,解決:注釋掉配置檔案 setting.py 中 "MIDDLEWARE" 中的 csrf 插件

  0x42: 開發部分

  1. 核心部分概述

    urls.py: Django中的路由系統,說明網址與視圖層(函數調用)的映射關系

    views.py: Django中的視圖層,其中放置的函數供路由系統調用

    models.py: Django中的模型層,供視圖層調用,用于處理資料持久化,屏蔽相對底層的操作(直接操作SQL語句),當然Django也提供直接執行SQL語句的接口,但不建議你這麼幹

  2. urls.py, views.py, models.py

View Code

    編寫完成後重新開機伺服器,通路 127.0.0.1:8000/sayHello 就能看到結果了

  3. 一個使用模闆+靜态資源的示例,setting.py 中需配置 STATICFILES_DIRS 的值

    檔案結構

   projName

    |--  projName

     |--  __init__.py

     |--  settings.py

     |--  urls.py

     |--  views.py

     |--  wsgi.py

    |--  static

     |--  templateTest.css

     |--  templateTest.jpg

     |--  templateTest.js

    |--  templates

     |--  templateTest

    |--  manage.py

0x03: 後記

  寫得有點久了,95%是在做東西的時候寫的,到釋出的時候已經快一個月時間了,其中有些東西現在也記不大清了;當時沒有釋出我覺得可能有些重要的地方沒寫完,釋出之前我又重新把上面的東西都跑了一次,發現果然是有些東西沒寫到 0.0

  這篇文章可能不是描述的最詳細的,但應該是這一套技術比較全面的了,如果有什麼問題或建議請回複評論(雖然最後确實頭都寫暈了 555~)

  原創文章,轉發請注明

原文位址

https://www.cnblogs.com/sxdc/p/11145478.html