2012-05-27 38 views
4

沒有任何代碼更改,我的django應用程序在加載WSGI腳本時開始拋出異常。我使用Django 1.3與2.7蟒蛇,和頂級.wsgi是從默認基本不變:使用django導入WSGIHandler時出錯

import os 
import sys 

from django.core.handlers.wsgi import WSGIHandler 

os.environ['DJANGO_SETTINGS_MODULE'] = 'api.settings' 
application = WSGIHandler() 

它開始生產上這些錯誤的任何要求,所報告的阿帕奇:

mod_wsgi (pid=3283): Target WSGI script '/home/beder/webapps/api/api.wsgi' cannot be loaded as Python module. 
mod_wsgi (pid=3283): Exception occurred processing WSGI script '/home/beder/webapps/api/api.wsgi'. 
Traceback (most recent call last): 
    File "/home/beder/webapps/api/api.wsgi", line 4, in <module> 
    from django.core.handlers.wsgi import WSGIHandler 
    File "/home/beder/webapps/api/lib/python2.7/django/core/handlers/wsgi.py", line 10, in <module> 
    from django import http 
    File "/home/beder/webapps/api/lib/python2.7/django/http/__init__.py", line 122, in <module> 
    from django.utils.http import cookie_date 
    File "/home/beder/webapps/api/lib/python2.7/django/utils/http.py", line 7, in <module> 
    from email.Utils import formatdate 
    File "/usr/local/lib/python2.7/email/__init__.py", line 79, in __getattr__ 
    __import__(self.__name__) 
    File "/usr/local/lib/python2.7/email/utils.py", line 27, in <module> 
    import random 
    File "/usr/local/lib/python2.7/random.py", line 47, in <module> 
    from os import urandom as _urandom 
ImportError: cannot import name urandom 

我重新啓動服務器,現在它正常工作(沒有錯誤)。我不知道該怎麼做 - 我想確保這不會再發生,但現在不會發生,我不知道爲什麼會出現導入錯誤。

+0

從ubuntu 10.04更新到12.04後,我遇到了同樣的情況,我相信在通過apt-get更新python後會發生這種情況。你是否這樣做?我相信這只是在虛擬環境中才會發生。 –

+0

@ThomasOrozco,我不這麼認爲 - 我有一個webfaction的託管服務器,並且他們在過去一直提醒我關於服務器遷移/更新。不過,我會和他們覈實一下。 –

回答

3

你在virtualenv裏面執行Django嗎?您是否更新或升級了您的系統?如果是這樣,你在Python 2.6升級到Python 2.7,例如,你需要重新生成的virtualenv:

$的virtualenv [您的選項] [你-的Django項目目錄]

+1

是的,事實證明,我的託管服務提供商從python 2.7.2升級到2.7.3。這似乎是一個已知的錯誤:http://mail.python.org/pipermail/python-dev/2012-March/118233.html –

2

對於任何人使用像Jesse和我自己的webfaction來運行他的django應用程序,但是不是使用virtualenv,它可能會發生,升級後,webapp的自定義apache安裝從未重新啓動。這意味着stdlib改變了,但apache仍然使用python 2.7.2,因爲它已經加載到內存中了。

在這種情況下,解決方法很簡單:通過SSH登錄到您的帳戶,並執行:

[[email protected] ~]$ ~/webapps/<webapp-name>/apache2/bin/restart 

這將重新啓動Web服務器,並導致Apache重新加載新的解釋的二進制文件。

0

當我從源代碼構建Python 2.6.5到2.6.8時,我也發現了同樣的錯誤。我也從源碼構建了mod_wsgi,最初忘了爲新版本的Python重新編譯mod_wsgi,並導致了有關urandom的相同錯誤。