Django No Mini匹配给定的查询

时间:2013-06-07 15:10:28

标签: python django url http-status-code-404

我写了一个链接缩短应用程序,它接受一个常规的长URL,并创建一个10个字符的字母数字字符串,用于Django-1.5.1的重定向。
生成的字符串中的重定向链接可以正常使用:url(r'^(?P<short>\w+)/$', 'target'),但由于某种原因,当我尝试访问其他两个视图(一个用于创建新的短网址和一个用于查看所有链接)时,我得到一个404页面说“No Mini与给定的查询匹配。”令人费解的是,当我使用url(r'^$', 'new_link'),url(r'^$', 'home'),

时,一切正常

这是我的urls.py的内容:

from django.conf.urls import patterns, url

urlpatterns = patterns('mini_url.views',
    url(r'^(?P<short>\w+)/$', 'target'),
    url(r'^new_link/$', 'new_link'),
    url(r'^home/$', 'home'),
)

和views.py:

from django.shortcuts import render, get_object_or_404, redirect
from mini_url.models import Mini
from mini_url.forms import MiniForm
import string, random

def generate(N):
    characters = string.letters + string.digits
    random_list = [random.choice(characters) for _ in xrange(N)]
    return ''.join(random_list)

def new_link(request):
    if request.method == 'POST':
        form = MiniForm(request.POST)

        if form.is_valid():
            create = True
            link = form.save(commit=False)
            short_url = generate(10)
            link.short_url = short_url
            link.save()
            link_string = "http://localhost:8000/m/%s/" % short_url

    else:
        form = MiniForm()

    return render(request, 'mini_url/new_link.html', locals())


def target(request, short):
    short_link = get_object_or_404(Mini, short_url = short)
    short_link.counter += 1
    short_link.save()
    return redirect(short_link.long_url)

def home(request):
    links = Mini.objects.order_by('counter')
    return render(request, 'mini_url/home.html', {'links':links})

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题在于您的网址格式。更改订单,它将正常工作。

将订单更改为:

urlpatterns = patterns('mini_url.views',
    url(r'^new_link/$', 'new_link'),
    url(r'^home/$', 'home'),
    url(r'^(?P<short>\w+)/$', 'target'),
)

由于您的网址格式匹配正则表达式为\w+,因此当您执行/home/new_link

此处,网址目标首先与url(r'^(?P<short>\w+)/$', 'target'),匹配,并使用参数targetnew_link调用视图home。因此问题。

答案 1 :(得分:0)

问题是“new_link”和“home”都匹配short_link视图的定义,因此它们被解释为对该页面的调用。你应该将short_link移动到底部,所以只有当其他人都没有匹配时才匹配。