Django URL 正则表达式问题
我正在尝试用Django定义一个搜索网址,结构如下:
www.example.com/afdata/search?device=television&category=news&query=channel&limit=30/
我的目标是从上面的网址中提取出television
、news
、channel
和30
这几个值,并把它们传递给一个视图,这个视图的定义如下:
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)
这样做会更稳健、更容易修改,也更灵活。