Skip to main content
 首页 » 编程设计

python之Django No Mini 匹配给定的查询

2024年11月01日37shihaiming

我写了一个链接缩短器应用程序,它接受一个常规的长 url,并创建一个 10 个字符的字母数字字符串,它用于 Django-1.5.1 的重定向。
来自生成的字符串的重定向链接适用于:url(r'^(?P<short>\w+)/$', 'target'),但出于某种原因,当我尝试访问其他两个 View (一个用于创建新的短 URL 和一个用于查看所有链接)时,我收到一个 404 页面,上面写着“没有 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}) 

我该如何解决这个问题?

请您参考如下方法:

问题出在您的网址格式上。更改顺序,它将正常工作。

将顺序更改为:

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

因为您的 url 模式匹配的正则表达式是 \w+ , 当你做 /home或 /new_link

在这里,URL 目标将匹配 url(r'^(?P<short>\w+)/$', 'target'),首先,调用 View target参数为 new_link或 home .因此问题。