2012-01-07 52 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