【问题标题】:Problem with Django url regular expressionDjango url正则表达式的问题
【发布时间】:2023-03-05 18:53:02
【问题描述】:

我正在尝试使用具有以下结构的 Django 定义搜索 url

www.example.com/afdata/search?device=television&category=news&query=channel&limit=30/

我的目标是从上面的 url 中提取值 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 响应良好。关于我可能做错的任何建议?

【问题讨论】:

    标签: python regex django


    【解决方案1】:

    我建议您将搜索网址更改为:

    (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)
    

    这更加健壮、多变和灵活。

    【讨论】:

    • @James,网址的结构是否如下? www.example.com/search?device=television?category=news?query=channel?limit=30
    • @david 应该是 www.example.com/search?device=television&amp;category=news&amp;query=channel&amp;limit=30,因为你不能在 url 中包含 ?,除非将 url 与参数分开
    • en.wikipedia.org/wiki/Query_string#Structure 了解有关查询字符串/url 的更多信息
    【解决方案2】:

    Django 的 URL 模式与 URL 的查询部分(以 ? 开头的部分)不匹配。如果您在 URL 结构本身中嵌入了参数,您只会做您想做的事情。

    详情请参阅the Django docs。

    如果你的网址是:

    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 的参数。 (如果您的示例中已经有类似的函数,那么编写一些胶水代码来传递参数就很容易了。)

    【讨论】:

    • 感谢您的详细解释。现在说得通了。
    【解决方案3】:

    在您的 Apache 日志中查找堆栈跟踪。另外:您确定您的搜索()的第 2 行不是指 HTTPResponse 而不是 HTTPRequest?

    【讨论】:

    • 是的,HttpResponse 是正确的。我试过了,但仍然是同样的问题。我将查看堆栈跟踪。
    【解决方案4】:

    通过使用.*,Django 可能会抢占您的&amp;category。即使不是这种情况,通常以不允许这种方式构造正则表达式也是一种好习惯。我会考虑将您的 .* 更改为 [^&amp;]*

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 1970-01-01
      • 2016-04-13
      • 2011-03-22
      • 2013-07-26
      • 2014-07-08
      • 1970-01-01
      相关资源
      最近更新 更多