Django url正则表达式的问题

时间:2011-06-14 05:32:01

标签: python regex django

我正在尝试使用具有以下结构的Django定义搜索网址

www.example.com/afdata/search?device=television&category=news&query=channel&limit=30/

我的目标是从上面的网址中提取值televisionnewschannel30,并将其传递给定义如下的视图

def search(request, device='all', category='single', query='', limit=30):
    return HttpResponse("device=%s, category=%s, query=%s, limit=%d", device, category, query, limit)

afdata是应用程序,在url配置文件中我定义了url如下:

from django.conf.urls.defaults import *

urlpatterns = patterns('afdata.views',
    (r'^$', 'index'),
    (r'^search?device=(?P<device>.*)&category=(?P<category>.*)&query=(?P<query>.*)&limit=(?P<limit>d+)/$', 'search')
)

当我在浏览器中使用上述搜索查询时,我得到500 Internal Server Errorindex回复得很好。关于我可能做错的任何建议?

4 个答案:

答案 0 :(得分:5)

我建议您将搜索网址更改为:

(r'^search', 'search')

然后在你的视图中做

def search(request):
    device = request.GET.get('device', 'all')
    category = request.GET.get('category', 'single')
    query = request.GET.get('query', '')
    limit = request.GET.get('limit', 30)

   return HttpResponse("device=%s, category=%s, query=%s, limit=%d", device, category, query, limit)

这更加强大,可变且灵活。

答案 1 :(得分:3)

Django的URL模式与URL的查询部分(以?开头的部分)不匹配。如果您在URL结构本身嵌入参数,则只会执行您要执行的操作。

有关详细信息,请参阅the Django docs

因此,如果您的网址是:

www.example.com/afdata/search/device/television/category/news/query/channel/limit/30/

然后您可以将其与以下网址格式匹配:

urlpatterns = patterns('afdata.views',
    (r'^$', 'index'),
    (r'^search/device/(?P<device>.*)/category/(?P<category>.*)/query/(?P<query>.*)/limit/(?P<limit>d+)/$', 'search')
)

(这将是一个有点奇怪的URL约定,但它会起作用。)

如果您的网址中包含查询,则只匹配?之前的部分,然后您的视图需要解析request.GET中的参数。 (如果你的示例中已经有类似的函数,那么编写一些粘合代码来传递参数就很容易了。)

答案 2 :(得分:1)

在Apache日志中查找堆栈跟踪。另外:您确定在搜索的第二行()不确定HTTPResponse不是HTTPRequest吗?

答案 3 :(得分:1)

使用.* Django可能会抓住你的&category。即使不是这种情况,通常以不允许这样的方式构造正则表达式也是一种好习惯。我会考虑将您的.*更改为[^&]*