Django域+正则表达式参数在生产机器上不起作用



我目前有一个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', '')

相关内容

最新更新