Django域+正则表达式参数不适用于生产机器

时间:2016-06-08 19:31:46

标签: python regex django

我目前有一个带有相当简单的搜索功能的django视图(接受用户输入,返回一个对象列表)。为了实用性,我想选择通过url传递搜索参数:

www.example.com/search/mysearchstring

mysearchstring是搜索功能的输入。我正在使用正则表达式来验证任何字母数字或下划线字符。

我遇到的问题是,虽然这在我的开发环境中运行良好,但它会在现场机器上中断。

目前,我在其他django视图中使用这种完全相同的方法(具有不同的正则表达式模式),没有任何问题。这让我相信。

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'),
...)

将这些传递给视图 观点。吡啶

def search(request, pdom):
...

加载页面时,出现以下错误:

ImproperlyConfigured: "^polls/search/(?P<pdom>\w*)?" is not a valid regular expression: nothing to repeat

我一直在摸着这个。我试图在表达式周围使用几种不同的封装方法,而不会改变结果。非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

我会改为:

SEARCH_REGEX = r'(?P<pdom>.+)$' 

在python中使用原始字符串r''作为正则表达式通常是个好主意。

该论坛将匹配您网址的搜索部分的全部内容。我会在视图中处理查询字符串验证,而不是在url正则表达式中。如果有人试图搜索polls/search/two+words,则不应返回404,而应返回400状态和错误消息,说明搜索字符串格式错误。

最后,您可能希望遵循搜索网址的通用约定。哪个是使用名为q的查询参数。因此,您的网址格式为^polls/search/$,然后您只需使用以下内容处理视图中的q

def search_page_view(request):

    query_string = request.GET.get('q', '')