Django URL 正则表达式问题

1 投票
4 回答
2316 浏览
提问于 2025-04-16 19:31

我正在尝试用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是我的应用程序,在网址配置文件中,我把网址定义成这样:

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 Error的错误。index的响应是正常的。有没有什么建议,帮我找出我可能做错了什么?

4 个回答

1

使用 .* 的话,Django 可能会通过你的 &category 抓取到一些东西。即使不是这种情况,通常也建议把正则表达式写得更严谨,避免这种情况发生。我建议把你的 .* 改成 [^&]*

3

Django的URL模式不匹配URL中的查询部分,也就是从?开始的那部分。你想要实现的功能,只有在URL结构本身包含参数时,才能做到。

具体的细节可以查看Django文档

所以如果你的URL是:

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

那么你可以用这样的URL模式来匹配:

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

(这可能是个比较奇怪的URL写法,但确实可以工作。)

如果你的URL中有查询参数,你只需要匹配?之前的部分,然后你的视图需要从request.GET中解析出参数。(如果你在示例中已经有这样的函数,写一些代码来传递参数其实很简单。)

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)

这样做会更稳健、更容易修改,也更灵活。

撰写回答