我目前有一个django视图,它具有相当简单的搜索功能(接受用户输入,返回对象列表)。为了可用性,我希望通过如下url传递搜索参数的选项:
www.example.com/search/mysearchstring
其中mysearchstring是搜索函数的输入。我使用regex来验证任何字母数字或下划线字符。
我遇到的问题是,虽然这在我的开发环境中非常有效,但它在实际机器上会中断
目前,我在其他django视图中使用完全相同的方法(使用不同的regex模式),没有任何问题。这让我也相信了这一点。
1) 我的正则表达式真的很糟糕(更有可能)
2) 环境之间的正则表达式验证器存在差异(可能性较小)
运行这个程序的机器使用的是django 1.6和python 2.7,它们稍微落后于我的开发机器,但并不显著。
urls.py
SEARCH_REGEX = '(?P<pdom>w*)?'
urlpatterns = patterns('',
....
url(r'^polls/search/' + SEARCH_REGEX, 'polls.views.search'),
...)
它们被传递到这样的视图视图。py
def search(request, pdom):
...
当加载页面时,我得到以下错误:
ImproperlyConfigured: "^polls/search/(?P<pdom>w*)?" is not a valid regular expression: nothing to repeat
我已经为这件事头疼了一段时间了。我尝试在不改变结果的情况下,围绕表达式使用几种不同的封装方法。如有真知灼见,不胜感激!
我会将其更改为:
SEARCH_REGEX = r'(?P<pdom>.+)$'
对于python中的正则表达式,通常最好使用原始字符串r''
。
该组将与您的url的搜索部分的全部内容相匹配。我会在视图中处理查询字符串验证,而不是在url regex中。如果有人试图搜索polls/search/two+words
,则不应返回404,而应返回400状态和错误消息,说明搜索字符串格式不正确。
最后,您可能希望遵循搜索url的通用约定。即使用一个名为q
的查询参数。因此,您的url模式将是^polls/search/$
,然后您只需使用以下内容处理视图中的q
:
def search_page_view(request):
query_string = request.GET.get('q', '')