2010-07-26 33 views
1

我有一個Web應用程序,它會返回基於URL的第一部分的用戶ID,很像Twitter的:獲得來自URL段用戶使用Django

http://www.myapplication.com/user-name-goes-here/

它可以走得更深太像所以:

http://www.myapplication.com/user-name-goes-here/news/article_1/

爲了打破該網站了,我使用下面的URL路由技術:

(r'^(?P<slug>\w+)/', include('myapp.sites.urls')), 

這將再往路由用戶到正確的頁面,但因爲它代表我有查詢數據庫中每個視圖,以獲得基於第一URL段USER_ID。我希望以某種方式自動執行此所以我不必每次臃腫我的看法有相同的代碼...我的解決方案是創建一些中間件,它檢查URL段和返回404如果未找到:

from django.http import Http404 

class DomainMiddleware(object): 
    def process_request(self, request): 
     from myapp.sites.models import Sites 

     dname = request.path.split('/')[1] 
     if not dname: 
      return 
     try: 
      d = Sites.objects.get(domain__exact=dname) 
     except Sites.DoesNotExist: 
      raise Http404 

     return 

這工作,但它試圖解析每一個要求,甚至那些圖片,網站圖標等

我的問題是這樣;有沒有辦法在每次加載頁面時運行這個查詢,而不會用額外的代碼堵塞我的視圖?如果中間件是解決方案,我該如何修改我的代碼,以便它不包括每個請求,只有成功路由URL的代碼才能包含這些請求。

希望有人能幫助!在生產反正肯定不是,在那裏你必須運行來處理不同的Web服務器,所以這不應該是一個問題,還有 -

回答

3

Django的服務器不應該被用於處理靜態內容的URL的請求。

但是,如果你說你想這是隻有成功地排到網址執行,也許你會使用process_view而不是process_request在中間件的更好? http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-view

process_view工作在視圖級別,而不是要求的水平,並提供view_func參數,它可以檢查,這樣,當它用於開發過程中提供靜態媒體django.views.static.serve看你的代碼不能運行。

無論發生什麼情況,如果是將要在每一個視圖中使用,你應該DEFS被緩存一個數據庫調用。

+0

非常感謝您的回覆,真的很有幫助。我肯定會緩存查詢,但顯然我需要確保它至少運行一次,特別是如果您進一步進入用戶頁面(這就是爲什麼我需要它在每個視圖上運行)。乾杯! – Hanpan 2010-07-26 11:26:10