Python+wsgi+django解決python3和wsgi不兼容配置的方法

wsgi是PythonWeb伺服器網關接口,是Python應用程序或框架和Web伺服器之間的一種接口,本文我們來看看Python+wsgi+django搭建過程及如何解決python3和wsgi不兼容的問題。

配置這個Python + wsgi + django, 可謂曲折。來看:

***********************
安裝環境:
Centos5.6
Python2.7
Mod_wsgi: mod_wsgi-4.4.13
Apache: httpd2.2
Django: Django-1.8.3
***********************
1. 安裝Python: Python2.7
本來系統裏已經自帶了Python2.6, 爲了我的追求極致,裝逼的完美主義,我又安裝了Python3.4. 並且把 /usr/local/bin/python 直接指向Python3.4. 將其設爲python的主要程序。
此處就爲悲劇的根源了。因爲Python3 和 mod_wsgi 不兼容 (注:至少到現在我還沒有找到能用使用python3 來安裝的wsgi),我安裝的時候直接使用 ./Configure make makeinstall 命令,導致系統先擇了將apache 的python版本設置成了python2.6. (注:wsgi: 即爲 the python web server gateway interface, 其作用就是apache能通過它來連接並使用Python)
但是由于我的django是用Python3安裝的。最終導致apache根本就連接不上django, 我查詢httpd下的error_log來回無數遍,終于發現httpd使用的是python2.6。所以只能果斷使用python2了, 但是新的問題又出現了,因爲下載的django版本過高,python2.6安裝不了,所以最終結果就是:安裝python2.7!
命令:
tar -xvf Python-2.7.10.tgz
cd Python-2.7
./configure --enable-shared
make
make install
可能遇到問題:python: error while loading shared libraries: libpython2.7.so.1.0:
cannot open shared object file: No such file
原因: python2.7 的庫找不到了
解決方案:1. 進入/etc/ld.so.conf.d/,
     2. 新建文件:vim python2.7.conf
     3. 添加python2.7的庫的所在路徑: /usr/local/lib
4. 保存並退出,然後執行命令:ldconfig
2. 安裝django: Django-1.8.3
直接進入安裝包文件夾使用python安裝
tar xzvf Django-1.8.3 .tar.gz
cd Django-1.8.3
sudo python setup.py install
3. 安裝mod_wsgi: mod_wsgi-4.4.13
下載地址:https://pypi.python.org/pypi/mod_wsgi
安裝命令:
./configure --with-python=/usr/local/bin/python2.7
make
make install
可能遇到問題:
3-1. apxs: command not found
原因: apache 組件 httpd-devel 沒有安裝
解決辦法: yum install httpd-devel
3-2. 在make時編譯失敗。查看錯誤第一行,發現:Sorry, Python developer package does not appear to be installed.
原因:python組件 python-devel沒有安裝
解決辦法: yum install python-devel
4. 配置httpd(注:此目的爲能讓httpd能通過wsgi來使用python,並訪問django的網站目錄) 非常重要,也很容易出問題:
4-1. 爲httpd添加wsgi的動態鏈接庫.so文件的鏈接:
1. vim /etc/httpd/conf/httpd.conf
2. 添加內容:LoadModule wsgi_module modules/mod_wsgi.so
3. 保存退出。
4-2. 繼續修改httpd.conf, 添加django專案的路徑,比如我新建的django網站的路徑爲:/var/www/html/mysite, 則配置爲如下:
WSGIPythonPath /var/www/html/mysite
WSGIScriptAlias / "/var/www/html/mysite/mysite/wsgi.py"
<Directory "/var/www/html/mysite/mysite">
Order Allow,Deny
Allow from all
<Files wsgi.py>
Order allow,deny
Allow from all
</Files>
</Directory>
4-3. 配置wsgi文件
一般django生成專案時會自動幫你配置好wsgi.py文件。不需要自己配的,前提是你的wsgi得裝好了。我的/var/www/html/mysite/mysite/wsgi.py 內容如下:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
5. 重啓httpd service: service httpd restart
至少則配置問題基本解決. 如果遇到新的問題,就得上stackoverflow再去查一下了。
apache+wsgi+django配置
WSGI是什麽?
WSGI的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來,這東西是一個Gateway,也就是網關。網關的作用就是在協定之間進行轉換。
也就是說,WSGI就像是一座橋梁,一邊連著web伺服器,另一邊連著用戶的應用。但是呢,這個橋的功能很弱,有時候還需要別的橋來幫忙才能進行處理。
Django 是什麽?
Django(發音:/ˈdʒæŋɡoʊ/ JANG-goh) 是用python語言寫的開源web開發框架(open source web framework),它鼓勵快速開發,並遵循MVC設計。Django遵守 BSD版權,初次發布于2005年7月, 並于2008年9月發布了第一個正式版本1.0 。最新發行版本是Django 1.3.1,于2011年09月10日發布.
Django 根據比利時的爵士音樂家Django Reinhardt命名,他是一個吉普賽人,主要以演奏吉它爲主,還演奏過小提琴等。
設計哲學
Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼複用,多個組件可以很方便的以“插件”形式服務于整個框架,Django有許多功能強大的第三方插件,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展性。它還強調快速開發和DRY(Do Not Repeat Yourself)原則。
Django基于MVC的設計十分優美:
對象關系映射 (ORM,object-relational mapping)
以Python類形式定義你的數據模型,ORM將模型與關系數據庫連接起來,你將得到一個非常容易使用的數據庫API,同時你也可以在Django中使用原始的SQL語句。
URL 分派
使用正則表達式匹配URL,你可以任意設計的URL,沒有框架的特定限定。象你喜歡的一樣靈活。
模版系統
使用Django強大而可擴展的模板語言,可以分隔設計、內容和Python代碼。並且具有可繼承性。
表單處理
你可以方便的生成各種表單模型,實現表單的有效性檢驗。可以方便的從你定義的模型實例生成相應的表單。
Cache系統
可以挂在記憶體緩沖或其它的框架實現超級緩沖 -- 實現你所需要的粒度。
會話(session),用戶登錄與權限檢查
快速開發用戶會話功能。
國際化
內置國際化系統,方便開發出多種語言的網站。
自動化的管理界面
不需要你花大量的工作來創建人員管理和更新內容。Django自帶一個ADMIN site,類似于內容管理系統。
軟件版本:
操作系統:Archlinux Kernel 3.1.0-4-ARCH x86_64
WEB伺服器: Apache/2.2.21
Python: Python/2.7.2
Django: 1.3.1
wsgi: mod_wsgi/3.3
1. 安裝apache和python
在Archlinux上我已經用pacman安裝好了apahce和python,接下來安裝mod_wsgi
2. 安裝WSGI
pacman -S mod_wsgi
這裏是Archlinux,如果是其他操作系統,請google。
安裝好之後,會生成mod_wsgi的apache模塊,位置在 /usr/lib/httpd/modules/mod_wsgi.so。
在apache的配置文件裏載入模塊:
LoadModule wsgi_module modules/mod_wsgi.so
3. 配置apache虛擬主機
<VirtualHost *:80>
ServerName webpy.test.com
WSGIScriptAlias / /home/max/mysite/django.wsgi
<Directory "/home/max/mysite">
Options FollowSymLinks Indexes
AllowOverride all
Order Deny,Allow
Allow from all
</Directory>
ErrorLog "/var/log/httpd/webpy-error.log"
CustomLog "/var/log/httpd/webpy-access.log" combined
</VirtualHost>
上面紅色的一行是讓載入django的wsgi配置文件(django本身就支持WSGI協定)
4. 安裝django
shell> pacman -S django
也可以選擇下載源碼安裝,因爲django本身全部用python編程,所以下載django的安裝包之後,進入到
django源碼目錄,執行以下命令即可安裝django:
shell> python setup.py install
5. 配置django
我們現在建立一個django的專案,建立好專案文件夾之後,django會自動生成一些專案文件:
shell> django-admin.py startproject mysite
django-admin.py是django本身的一個管理程序,除了用于新建專案之外,還有很多用途。
mysite是新建的專案名稱,這樣就會在當前目錄下生成一個mysite的文件夾。
__init__.py __init__.pyc manage.py settings.py urls.py
上面就是mysite目錄下的文件,這是django專案的初始文件。
6. 配置django的wsgi文件
在mystei目錄下新建一個django.wsgi文件,內容如下:
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
path = '/home/max'
if path not in sys.path:
sys.path.append(path)
mysite.settings是mysite專案的配置文件,django專案的配置文件就是python代碼;在mysite目錄下可以看到settings.py文件。
由于當前目錄沒有在系統的PATH變量裏,所以mod_wsgi無法尋找到settings.py文件,爲了幫它找到,
我們把mysite目錄的上一級目錄,追加到PATH變量裏。
sys.path.append(path)
7. 啓動django專案
重啓apache伺服器
shell> apachectl restart
在浏覽器打開 http://webpy.test.com,即可看到django的歡迎頁面。
啓動django的專案其實還有一種更快的方式,就是在mysite專案的目錄下,執行:
shell> python manage.py runserver 8000
會出現以下信息:
Django version 1.3.1, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
這是浏覽器打開http://127.0.0.1:8000,即可看到django的淡藍色頁面。
這其實啓動開發伺服器,它每次只能伺服器一個用戶,所以不能在生産環境使用它。

更多相關文章
  • 本文我們來分享一下 Django 應用開發中如何解決跨域API調用問題,解決的方法有兩個:1.使用jsonp 2.使CORS生效.前幾天,在做質量度量平台時(Python框架Django開發),跨域調用的問題,我前面有一個做法是,在本地server中增加一個API,這個API的功能是遠程請求一個AP ...
  • input標簽出現margin加倍現象,原來是父元素有水平margin邊距導致,現在我們來分享解決這個問題的4個方法.問題描述:input標簽(不包含type="checkbox"類型標簽)的父元素有加水平方向的ma
  • KindEditor以前用過載入時要使用ajax才可以,否則你可能獲得不到KindEditor編輯器的內容了,下面一起來看如何解決此問題.首先描述下我這邊KindEditor的錯誤現象:1.在IE8/FF下均得不到值:2.當點擊KindEditor的全拼按鈕切換到全屏模式輸入時,再返回正常模式,可以 ...
  • 在C#中我們使用DateTime函數會帶上當時的 年月日與時分秒了,函數考慮比較全面了但是有一點就是我們有時並不需要時分秒了,下面一起來看DateTime去掉時分秒幾種方法程序代碼DateTime now = DateTime.Parse("2015/01/23 13:50:00" ...
  • 蘋果Apple ID注冊不能選擇信用卡怎麽解決
    蘋果appstore 中的應用有很多是需要收費了,當然免費的也不少了,但是收費的app我們是需要綁定銀行卡了,現在appstore是可以支持存儲卡與信用卡或支付寶了,但小編注冊時並沒有發現綁定信用卡在哪選擇了,如果各位和我們碰到同樣問題可來看看解決辦法.[APP Store充值方法介紹]第一步:在i
  • Amoeba:開源的分布式數據庫Porxy解決方案
    Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協定接口的proxy.它集中地回應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行.基于此可以實現負載均衡.讀寫分離.高可用性等需求.與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置
  • 本文我們來分享用php的phpExcel類生成的excel當列名超過26列大于Z時的解決方法,供大家參考學習.我們生成excel都會使用phpExcel類,這裏就來給大家介紹在生成excel列名超過26列大于Z時的解決辦法,這是phpExcel類中的方法,今天查到了,記錄一下備忘,代碼如下: 代碼如
  • file_get_contents函數在獲得遠程文件時提示Warning: file_get_contents failed to open stream,希望例子能夠幫助到各位,希望例子能夠幫助到大家.在做專案時用
一周排行