我正在尝试使用具有以下结构的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
是应用程序,在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 Error
。 index
回复得很好。关于我可能做错的任何建议?
答案 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
。即使不是这种情况,通常以不允许这样的方式构造正则表达式也是一种好习惯。我会考虑将您的.*
更改为[^&]*