2014-11-01 31 views
2

我的生產環境中的django項目存在問題。當我使用「WSGIScriptAlias」apache指令的別名時,它看起來像是反向URL有問題。事實上,這個問題可能與django.js模塊有關,因爲它似乎沒有考慮到「WSGIScriptAlias」。與Django/Django.js和WSGIScriptAlias的URL反轉

所以,這裏是我的Apache配置:

<VirtualHost *:80> 
    DocumentRoot /MyPath/django_proj/pti/pti 
    WSGIScriptAlias /pti /MyPath/django_proj/pti/pti/pti_project/wsgi.py 

    WSGIDaemonProcess pti python-path=/MyPath/django_proj/pti/pti:/MyPath/django_proj/pti/lib/python2.7/site-packages 
    WSGIProcessGroup pti 

    Alias /media/ /MyPath/django_proj/pti/pti/media_root/ 
    Alias /static/ /MyPath/django_proj/pti/pti/static_root/ 

    ErrorLog /var/log/apache2/pti-error_log 
    <Directory /MyPath/django_proj/pti/pti/pti_project/> 
      <Files wsgi.py> 
        Allow from all 
      </Files> 
    </Directory> 

    <Directory /MyPath/django_proj/pti/pti/static_root/> 
      Order deny,allow 
      Allow from all 
    </Directory> 

    <Directory /MyPath/django_proj/pti/pti/media_root/> 
      Order deny,allow 
      Allow from all 
    </Directory> 

正如你可以看到我的WSGIScriptAlias是 「/ PTI」。

我的Django的網址是:

urlpatterns = patterns('', 
# Examples: 
# url(r'^$', 'pti_project.views.home', name='home'), 
# url(r'^blog/', include('blog.urls')), 

url(r'^admin/', include(admin.site.urls)), 
url(r'^djangojs/', include('djangojs.urls')), 
url(r'^pti_core/', include('pti_core.urls', namespace='pti_core', app_name='pti_core')), 
url(r'^pti_map/', include('pti_map.urls', namespace='pti_map', app_name='pti_map')), 
) 

這部分似乎很好地工作。但是當我使用url's reverse django.js功能獲取我的數據時,問題就出現了。這裏是我的數據存儲我的網址的pti_map配置文件:

urlpatterns = patterns('pti_map.views', 
url(r'^$', 'map_index', name='map_index'), 
url(r'^ptiretrait.geojson$', MapLayer.as_view(model=PtiRetrait), name='ptiretrait'), 
url(r'^ptiencours.geojson$', MapLayer.as_view(model=PtiEnCours), name='ptiencours'), 
url(r'^ptinouvelle.geojson$', GeoJSONLayerView.as_view(model=PtiNvlleDetection, precision = 5, simplify=0.5, properties = ('etat', 'friche', 'age', 'acces', 'culture', 'bati', 'voisinage', 'defrichement', 'mecanisable', 'irrigable', 'commentaire')), name='ptinouvelle'), 
url(r'^newptisubmit$', 'newptisubmit', name='newptisubmit'), 
url(r'^newptiedit$', 'newptiedit', name='newptiedit'), 
url(r'^newptimodifygeom$', 'newptimodifygeom', name='newptimodifygeom'), 
url(r'^ptiTable$', 'ptiTable', name='ptiTable'), 
url(r'^sendEmail$', 'sendEmail', name='sendEmail'), 
url(r'ajax_file_upload$', 'ajax_file_upload', name="ajax_file_upload"), 
) 

當我嘗試使用這個功能讓我的反向網址,它似乎並不考慮我的戶頭WSGIScriptAlias。因此,使用django.js反向網址功能, Django.url('pti_map:ptinouvelle')結果是:

http://MyServer/pti_map/ptinouvelle.geojson

,而不是一個我所料:

http://MyServer/pti/pti_map/ptinouvelle.geojson

我可以證實,「django.js 「似乎沒有考慮到我的WSGIScriptAlias。這裏是我console.log(Django.urls)的結果:

pti_map:ptiencours "/pti_map/ptiencours.geojson" 

pti_map:ptinouvelle "/pti_map/ptinouvelle.geojson" 

pti_map:ptiretrait "/pti_map/ptiretrait.geojson" 

如果我要讓它工作,我有硬編碼在我的JS文件WSGIScriptAlias:

var url = "/pti" + Django.url('pti_map:ptinouvelle')

通過添加「/ PTI」 URL的開頭我可以獲取我的數據,但這是一個醜陋的黑客攻擊,它破壞了我與開發平臺的兼容性。

你有什麼想法我可以解決這個問題嗎?

謝謝。

阿爾諾

回答

0

很簡單,就是因爲你的Django應用程序不知道重寫或路由Web服務器正在做什麼,它的外面是範圍。

您可能已經完成了別名,因爲您希望在其他某個路由上託管其他內容。如果是這種情況,那麼你可以做的是,你可以在內部將請求發送到/ pti_map到/ pti_map/pti_map,並使用別名/ pti_map到你的腳本。

這將做什麼,而將請求路由到腳本,wsgi容器將吃掉第一個「pti_map」,並將轉發下一個。

希望我正確理解你。