【问题标题】:Python/Django Not Appending SlashPython/Django 不附加斜线
【发布时间】:2015-06-09 18:31:51
【问题描述】:

由于某种原因,Django 没有在包含数字字符的变量末尾附加斜杠:

test_A -- 有效(转到 test_A/)
test_1 - 没有(没有在末尾附加 / - 给我一个 404)

我确实安装了中间件并且 APPEND_SLASH = True。

有什么想法吗?谢谢!

url.conf:

from django.conf.urls import patterns, url
from dashboard import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^environment/(?P<environment_name_url>\w+)/$', views.environment, name='environment'),)

models.py:

from django.db import models

class Environment(models.Model):
name = models.CharField(max_length=128, unique=True)
def __str__(self):
    return self.name

views.py:

def environment(request, environment_name_url):
    environment_name = environment_name_url.replace('_', ' ')
    context_dict = {'environment_name': environment_name}
    try:
        environment = Environment.objects.get(name=environment_name)
        pages = Page.objects.filter(environment=environment)
        context_dict['pages'] = pages
        context_dict['environment'] = environment
    except Environment.DoesNotExist:
        pass
    return render(request, 'dashboard/environment.html', context_dict)

错误:

Using the URLconf defined in dashboard_project.urls, Django tried these URL patterns, in this order:

    1. ^admin/
    2. ^dashboard/ ^$ [name='index']
    3. ^dashboard/ ^environment/(?P<environment_name_url>\w+)/$ [name='environment']
    4. media/(?P<path>.*)

The current URL, dashboard/environment/test_1, didn't match any of these.

【问题讨论】:

  • test_1test_A 是什么?你所说的“不起作用”是什么意思?你的输出是什么?
  • 它们是环境...
  • test_A 正确重定向到 test_A/ ... test_1 没有附加斜杠,所以我得到一个 404
  • 请注意,我已尝试添加 ? to: url(r'^environment/(?P\w+)/?$' 但我仍然得到相同的结果
  • 问题不在url() 部分。添加数字或字母字符不会改变给定正则表达式的行为。我确实在您的 views.py sn-p 中看到了错误/不完整的代码部分。您只启动 try-except 块,但缺少“except”。你能添加缺少的代码吗?

标签: python regex django


【解决方案1】:

你必须扩展你的正则表达式。问题不在于没有附加斜线,问题在于没有一个 url 匹配(有或没有斜线)。

简单的解决方案,要包含点,您应该更新正则表达式以也允许点: url(r'^environment/(?P&lt;environment_name_url&gt;[\w\.]-)/$', views.environment, name='environment'),)

您可以进一步改进它以允许破折号: url(r'^environment/(?P&lt;environment_name_url&gt;[\w\.-]+)/$', views.environment, name='environment'),)

后者甚至允许 /test-1.1_10/

【讨论】:

  • 就是这样!!现在完美运行!非常感谢沃特!!
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 2016-05-19
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多