2012-01-07 35 views
0

時,我想,當我更改數據庫更新URL模式匹配我的產品,所以我用urls.py:無法動態改變URLPATTERN更改數據庫

main_cagetory_url=Product_category.objects.get_all_product_category_url() 
main_cagetory_url_string = '(?:' + '|'.join(main_cagetory_url) + ')' 

product_url=Product.objects.get_all_product_url() 
product_url_string = '(?:' + '|'.join(product_url) + ')' 

menu_url=Menu.objects.get_all_menu_url() 
menu_url_string = '(?:' + '|'.join(menu_url) + ')' 

urlpatterns = patterns('', 
         (r'^$',menu_page), 
         (r'^home_vi$',home_vi), 
         (r'^home_en$',home_en), 
         (r'^'+menu_url_string+'$',menu_page), 
         (r'^'+main_cagetory_url_string+'$',list_product), 
         (r'^'+product_url_string+'$',product_detail), 
         (r'^search_result$',search_result), 
         (r'^admin/', include(admin.site.urls)),) 

每一件事情,當我正在開發OK我PC。但是當我將我的項目上傳到主機。每次添加新的Product_category或Product時。當我點擊新的Product_category或新產品時,Django無法實現該更改並顯示404錯誤。

我該如何解決該錯誤?

+0

在開發模式下工作的原因是因爲dev服務器會自動重新加載任何文件(例如'urls.py')。這在生產服務器上不會發生(並且您不希望它發生)。我從來沒有必要自己做這件事,所以我正在仔細查看代碼和文檔以查看鉤子的位置。 – 2012-01-07 16:22:26

回答

1

這開始作爲一個評論,但我想我會嘗試避免創建一個序列評論。

在開發模式下工作的原因是因爲dev服務器會自動重新加載任何更改的文件(例如urls.py)。這在生產服務器上不會發生(你不希望它發生)。我從來沒有必要自己做這件事,所以我正在仔細研究代碼&文檔以查看鉤子的位置。

那麼花了大約45分鐘後,我的答案似乎是......你不能這樣做,至少不容易。注意下面的所有行號來自Django 1.3.1。

Django從您的設置文件中命名的模塊初始化您的url爲ROOT_URLCONF,通常爲urls。這個初始化有點昂貴,Django會盡其所能緩存一切。

BaseHandler.get_response()django/core/handles/base.py 83行)使用settings.ROOT_URLCONF中指定的URL模塊調用urlresolvers.set_urlconf()。實際上,這是關於url配置所在位置的全球性硬連接知識。由於緩存,它只會初始化您的網址,每個線程。這意味着在處理Django請求的Web服務器中的每個線程都需要在每次數據庫更改時提醒刷新並初始化它的URL,並且它本身變得複雜。

另一種方法是創建一個超級模式,該模式調用一個視圖,然後進行數據庫調用。另一種方法是在中間件類中處理這個問題,您可以在其中測試404錯誤,檢查該模式是否可能是您的某個類別,然後在那裏查找數據庫。我過去做過這件事,並沒有聽起來那麼糟糕。請看django/contrib/flatpages代碼,以便直接實現此方法。

+0

非常感謝您的詳細解答,我已將網址格式更改爲(r'^ category /。{1,50} $',list_product)並解決此問題。 – ronin1184 2012-01-08 15:10:43

2

也許這是更好地你的URL映射是這樣的:

url(r'^category/(?P<category_name>\w+)/$', 'views.list_products'), 

,並用這樣的觀點功能爲他們服務:

def list_product(request, category_name=None): 
    if category_name: 
    # check if a category exists 
    # list product from the category 
    else: 
    # do something else